Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

feat(tls): Adding option to skip TLS verification #76

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions aws_okta_processor/commands/authenticate.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
--version Show version.
--no-okta-cache Do not read Okta cache.
--no-aws-cache Do not read AWS cache.
--no-tls-verify Do not verify TLS.
-e --environment Dump auth into ENV variables.
-u <user_name>, --user=<user_name> Okta user name.
-p <user_pass>, --pass=<user_pass> Okta user password.
Expand Down Expand Up @@ -85,6 +86,7 @@
"--silent": "AWS_OKTA_SILENT",
"--no-okta-cache": "AWS_OKTA_NO_OKTA_CACHE",
"--no-aws-cache": "AWS_OKTA_NO_AWS_CACHE",
"--no-tls-verify": "AWS_OKTA_NO_TLS_VERIFY",
"--account-alias": "AWS_OKTA_ACCOUNT_ALIAS",
"--target-shell": "AWS_OKTA_TARGET_SHELL",
}
Expand All @@ -106,6 +108,7 @@
"AWS_OKTA_SILENT": "silent",
"AWS_OKTA_NO_OKTA_CACHE": "no-okta-cache",
"AWS_OKTA_NO_AWS_CACHE": "no-aws-cache",
"AWS_OKTA_NO_TLS_VERIFY": "no-tls-verify",
"AWS_OKTA_ACCOUNT_ALIAS": "account-alias",
"AWS_OKTA_TARGET_SHELL": "target-shell",
}
Expand Down
5 changes: 5 additions & 0 deletions aws_okta_processor/core/fetcher.py
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,7 @@ def _get_app_roles(self):
saml_assertion=saml_assertion,
accounts_filter=self._configuration.get("AWS_OKTA_ACCOUNT_ALIAS", None),
sign_in_url=self._configuration.get("AWS_OKTA_SIGN_IN_URL", None),
no_tls_verify=self._configuration.get("AWS_OKTA_NO_TLS_VERIFY", None),
)

return (
Expand Down Expand Up @@ -173,13 +174,16 @@ def _get_credentials(self):
Returns:
A dictionary containing AWS credentials and expiration time.
"""
tls_verify = (self._configuration["AWS_OKTA_NO_TLS_VERIFY"] == None)

# Do NOT load credentials from ENV or ~/.aws/credentials
client = boto3.client(
"sts",
aws_access_key_id="",
aws_secret_access_key="",
aws_session_token="",
region_name=self._configuration["AWS_OKTA_REGION"],
verify=tls_verify,
)

# Get available AWS roles and SAML assertion
Expand Down Expand Up @@ -217,6 +221,7 @@ def _get_credentials(self):
aws_secret_access_key=credentials["SecretAccessKey"],
aws_session_token=credentials["SessionToken"],
region_name=self._configuration["AWS_OKTA_REGION"],
verify=tls_verify,
)
response = client.assume_role(
RoleArn=secondary_role_arn,
Expand Down
14 changes: 10 additions & 4 deletions aws_okta_processor/core/saml.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
from bs4 import BeautifulSoup # type: ignore[import-untyped]
import requests # type: ignore[import-untyped]
import six # type: ignore[import-untyped]
import urllib3 # type: ignore[import-untyped]

from aws_okta_processor.core.tty import print_tty

Expand Down Expand Up @@ -61,7 +62,7 @@ def get_saml_assertion(saml_response=None):


def get_aws_roles( # pylint: disable=R0914
saml_assertion=None, accounts_filter=None, sign_in_url=None
saml_assertion=None, accounts_filter=None, sign_in_url=None, no_tls_verify=None,
):
"""
Parses the SAML assertion and extracts AWS roles.
Expand Down Expand Up @@ -99,7 +100,7 @@ def get_aws_roles( # pylint: disable=R0914
if len(role_principals) > 1:
# Retrieve account roles from AWS sign-in page
account_roles = get_account_roles(
saml_assertion=saml_assertion, sign_in_url=sign_in_url
saml_assertion=saml_assertion, sign_in_url=sign_in_url, no_tls_verify=no_tls_verify,
)

for account_role in account_roles:
Expand Down Expand Up @@ -129,7 +130,7 @@ def get_aws_roles( # pylint: disable=R0914
return aws_roles


def get_account_roles(saml_assertion=None, sign_in_url=None):
def get_account_roles(saml_assertion=None, sign_in_url=None, no_tls_verify=None):
"""
Retrieves AWS account roles from the AWS SAML sign-in page.

Expand All @@ -144,8 +145,13 @@ def get_account_roles(saml_assertion=None, sign_in_url=None):

data = {"SAMLResponse": saml_assertion, "RelayState": ""}

# Configure TLS verification
tls_verify = (no_tls_verify == None)
if not tls_verify:
urllib3.disalbe_warnings()

# Post the SAML assertion to AWS sign-in URL
response = requests.post(sign_in_url or AWS_SIGN_IN_URL, data=data, timeout=60)
response = requests.post(sign_in_url or AWS_SIGN_IN_URL, data=data, timeout=60, verify=tls_verify)
soup = BeautifulSoup(response.text, "html.parser")
accounts = soup.find("fieldset").find_all(
"div", attrs={"class": "saml-account"}, recursive=False
Expand Down