Skip to content

Latest commit

History

7 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

AWScons - AWS Console SSO Access Manager

AWScon provides Single Sign On (SSO) users with AWS console access restricted by AWS IAM roles. Single Sign On is provided by SAML2, and role access is restricted by group membership.

Deployment Options

  • AWScons has been developed ant tested with Apache and mod_wsgi.

  • The SAML IdP used for Single Sign On (SSO) is Microsoft Azure AD

  • HoweverAWScons should be usable with any WSGI compliant web server environment and any SAML2 compatible IdP.

  • You will need have the requisite skills for your web server and IdP to deploy this app, as it is impossible to cover and test all the variations, or to document them here.

Installation of Python Components

 % git clone https://github.com/Glocktober/AWSconsoleSSO.git
% cd AWSconsoleSSO
% python3 -m venv
% source venv/bin/activate
% pip install -r requirements.txt
% # Create config.py
% # start for test on <hostname>:8000/
% python3 app.py
  • This will install the AWScons app and it's required components.
  • Generally you will want to deploy into a venv virtual environment.
  • You still need to integrate the Python code into your WSGI web application service and your SAML IdP.
  • Python components:
  • Bottle WSGI web application server
  • BottleSaml SAML2 Service Provider for Bottle using minisaml
  • BottleSessions provides session state management for Bottle using the Pallets Projectcachelib
  • Additional more common component packages such as requests, cryptography, and boto3

Setup AWS IAM user and roles

Create one or more AWS Assumed Roles

In AWS IAM

  • create a role selecting "For Another AWS Account".
  • Use the account number of the Assuming User (this can be the same, or a different account as the role.)
  • Attach the desired policy for this role.
  • Set the maximum duration this role can be used (the default is 1 hour)
  • Keep track of the ARN

Repeat this for each role you want to create.

For example, you can create a role called MyAdminRole in your account with the id of 123456789012, providing that same account id as the accessing account. Then attach the AWS managed policy AdministratorAccess, and edit the role to change the maximum duration to 8 hours (28800 seconds). The role ARN will be arn:aws:iam::123456789012:role/MyAdminRole.

In a different account (999999789012) you can create a role called DBAdminRole, listing account 123456789012 as the trusted account. Then attach the AWS managed policy AWSRDSFullAccess. The role ARN will be arn:aws:iam::999999789012:role/DBAdminRole.

The key is that the created roles must have trusted access to the account that will be generating the assume role credentials.

Create An AWS Policy to Assume the Created Roles

Create a policy with sts:AssumeRole API access to the ARNs for the assumed roles created in the previous step. This is done in the account that was granted the trust to assume any of the roles you created.

In our example this was account 123456789012. So in account 123456789012 you would create a policy - we'll call it assumeSSOpolicy:

 {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:assumeRole",
"Resource": [
"arn:aws:iam::123456789012:role/MyAdminRole",
"arn:aws:iam::123456789012:role/ReadOnlyRole",
"arn:aws:iam::999999789012:role/DBAdminRole",
]
}
]
}

Create a User or Role with this Policy

Apply the policy in one of two ways:

  • Attach the policy to an EC2 IAM Role and attach to the EC2 instance AWScons is hosted.
  • Attach the policy directly to an IAM user account.

For EC2:

  • In IAM create a new role, for EC2, and attach the policy (assumeSSOpolicy in our example) to this role.
  • Attache this role to the EC2 instance the code will be running on.

For IAM user:

  • Create an IAM user (say AWSconSSO) with only API keys and save the keys
  • Apply the policy (assumeSSOpolicy in our example) to this user
  • On the hosting sever create a credentials file containing the API keys
  • Use the config options aws_credentials_file and aws_profile in the aws_config stanza of config.py

The EC2 Role is the preferred method when AWScons is hosted in AWS; the IAM User account is required if AWScons is not being hosted in AWS, or hosted with outher API applications.

Create the config.py Configuration File

An example file is provided config.py.sample'. You can use this file as a framework to create a config.py file that will be located in the same directory as the AWScons` app.py file.

There are three sections in the config.py file:

  • session_config - user session configuration
  • saml_config - SAML SP configuration
  • aws_config - maps url path to specific roles to assume

Configure session_config stanza

  • This can be a simple null configuration in many cases:
session_config = {}
  • For higher use environments you will want persistent caching. Consult BottleSessions documentation for more detail.
  • With a low-volume of requests the memory-based SimpleCache is adequate
  • With a higher-volume of requests FileCache is simple enough with only a path to a cache directory specified

Configure saml_config stanza

  • Configuring the SAML Service Provider (SP) is beyond the scope of this document. Refer to BottleSaml documentation for more detail.
  • The name_id configured should be something useful (username or email), as it will be included in console and also in CloudTrail logging.
  • If groups will be used for authorization, these should be provided as IdP assertions, and listed in the assertions configuration list so they will be kept as session attributes.

Configure aws_config

  • This provides configuation options and url path to role mapping

Application Configuration Settings

These options are for the full AWScons instance.

parametertypedefaultdescription
url_prefixString""Prefix for target URLS (defaults to no URL prefix)
aws_profile_nameStringNoneFor IAM user creds - sets AWS_PROFILE
aws_credentials_fileStringNoneFor IAM user creds - sets AWS_SHARED_CREDENTIALS_FILE
targetsListNonePython Dict containing specific target entries
  • One or more targets can be included in the AWScons instance. Only the targets list is required.

Target Specific Configuration Settings

A target configuration item contains specific information for a given service.

parametertypedefaultdescription
serviceStringNone (required)Name of service target used as URL path
durationInteger3600Duration (Seconds) credentials for assumed role are valid
roleStringNone (required)ARN of role assumed for this URL path
groups[String,..][]User must have membership in one or more of these groups
  • duration can not exceed the maximum duration associated with the specified IAM role
  • groups is a list of groups restricting access to this role
  • The specific service is invoked when the final component of the url path matches the service name. i.e. https://www.example.com/aws/myadmin' matches the service target with the name 'myadmin' (but only when the instance has the url_prefix of '/aws')

Example 1: A Basic aws_config Stanza:

aws_config= {
"targets" : [{
"service": "awsadm", "role": "arn:aws:iam::123456789012:role/MyAdminRole",
} ]
}

Accessing https://www.example.com/awsadm will launch an AWS console to any authenticated user. The console will have access of the MyAdminRole role in account 123456789012. The console and credentials will be valid for 1 hour.

Example 2: A More Complex aws_config Stanza:

aws_config= {
"url_prefix": "/aws", # Base for URL"aws_profile_name" : "cons", # Profile name "aws_credentials_file" : "/usr/local/.aws/credentials", # Credentials file "targets" : [
{
"service": "cloudadmin", # /aws/cloudadmin"role": "arn:aws:iam::123456789012:role/MyAdminRole",
"duration": 28800,
"groups" : ["sysadmin", "cloudadmin"]
},
{
"service": "sandbox", # /aws/sandbox"role": "arn:aws:iam::999999789012:role/DBAdmin",
"duration": 28800,
"groups" : ["dbs"]
} ]
}

This config uses API credentials with the specified credentials file and profile name; all target URLs are prefixed with /aws.

Accessing https://www.example.com/aws/cloudadmin, an authenticated user must be a member of either sysadmin or cloudadmin groups. The user will be provided a console with the privileges of MyAdminRole that will be valid for 8 hours. The account accessed will be 123456789012.

With https://www.example.com/aws/sandbox, the authenticated user must be a member of the group `dba'. The privileges will be thoses of DBAdmin, and provides access to the AWS account with the id of 999999789012.

Evaluation and Generation of Console URL

  • The specific target is evaluated when a GET request is made to the URL path matching the form /<url_prefix>/
  • If a match is not found the request failes with an HTML 401 Unknown error.
  • The user is authenticated via SAML, with the IdP provided assertions added to user session as attributes for authorization. This includes 'groups' list.
  • The user is authorized if:
  • The user is a member of at least one group specified in the groups of the target configuration.
  • If no groups are listed in the target config, the user is not rejected.
  • Failing to meet this, the request fails with an HTML 403 Unauthorized error
  • AWScons acquires temporary credentials for role specified in the target config using the AWS sts:AssumeRole API
  • AWScons then calls AWS sts to generate a console login token
  • The login token is formed to a logon URL
  • The login URL is returned as an HTML 301 redirect

About

AWScon provides Single Sign On (SSO) users with AWS console access restricted by AWS IAM roles.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - Glocktober/AWSconsoleSSO: AWScon provides Single Sign On (SSO) users with AWS console access restricted by AWS IAM roles. · GitHub
Skip to content

Latest commit

History

7 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

AWScons - AWS Console SSO Access Manager

AWScon provides Single Sign On (SSO) users with AWS console access restricted by AWS IAM roles. Single Sign On is provided by SAML2, and role access is restricted by group membership.

Deployment Options

  • AWScons has been developed ant tested with Apache and mod_wsgi.

  • The SAML IdP used for Single Sign On (SSO) is Microsoft Azure AD

  • HoweverAWScons should be usable with any WSGI compliant web server environment and any SAML2 compatible IdP.

  • You will need have the requisite skills for your web server and IdP to deploy this app, as it is impossible to cover and test all the variations, or to document them here.

Installation of Python Components

 % git clone https://github.com/Glocktober/AWSconsoleSSO.git
% cd AWSconsoleSSO
% python3 -m venv
% source venv/bin/activate
% pip install -r requirements.txt
% # Create config.py
% # start for test on <hostname>:8000/
% python3 app.py
  • This will install the AWScons app and it's required components.
  • Generally you will want to deploy into a venv virtual environment.
  • You still need to integrate the Python code into your WSGI web application service and your SAML IdP.
  • Python components:
  • Bottle WSGI web application server
  • BottleSaml SAML2 Service Provider for Bottle using minisaml
  • BottleSessions provides session state management for Bottle using the Pallets Projectcachelib
  • Additional more common component packages such as requests, cryptography, and boto3

Setup AWS IAM user and roles

Create one or more AWS Assumed Roles

In AWS IAM

  • create a role selecting "For Another AWS Account".
  • Use the account number of the Assuming User (this can be the same, or a different account as the role.)
  • Attach the desired policy for this role.
  • Set the maximum duration this role can be used (the default is 1 hour)
  • Keep track of the ARN

Repeat this for each role you want to create.

For example, you can create a role called MyAdminRole in your account with the id of 123456789012, providing that same account id as the accessing account. Then attach the AWS managed policy AdministratorAccess, and edit the role to change the maximum duration to 8 hours (28800 seconds). The role ARN will be arn:aws:iam::123456789012:role/MyAdminRole.

In a different account (999999789012) you can create a role called DBAdminRole, listing account 123456789012 as the trusted account. Then attach the AWS managed policy AWSRDSFullAccess. The role ARN will be arn:aws:iam::999999789012:role/DBAdminRole.

The key is that the created roles must have trusted access to the account that will be generating the assume role credentials.

Create An AWS Policy to Assume the Created Roles

Create a policy with sts:AssumeRole API access to the ARNs for the assumed roles created in the previous step. This is done in the account that was granted the trust to assume any of the roles you created.

In our example this was account 123456789012. So in account 123456789012 you would create a policy - we'll call it assumeSSOpolicy:

 {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:assumeRole",
"Resource": [
"arn:aws:iam::123456789012:role/MyAdminRole",
"arn:aws:iam::123456789012:role/ReadOnlyRole",
"arn:aws:iam::999999789012:role/DBAdminRole",
]
}
]
}

Create a User or Role with this Policy

Apply the policy in one of two ways:

  • Attach the policy to an EC2 IAM Role and attach to the EC2 instance AWScons is hosted.
  • Attach the policy directly to an IAM user account.

For EC2:

  • In IAM create a new role, for EC2, and attach the policy (assumeSSOpolicy in our example) to this role.
  • Attache this role to the EC2 instance the code will be running on.

For IAM user:

  • Create an IAM user (say AWSconSSO) with only API keys and save the keys
  • Apply the policy (assumeSSOpolicy in our example) to this user
  • On the hosting sever create a credentials file containing the API keys
  • Use the config options aws_credentials_file and aws_profile in the aws_config stanza of config.py

The EC2 Role is the preferred method when AWScons is hosted in AWS; the IAM User account is required if AWScons is not being hosted in AWS, or hosted with outher API applications.

Create the config.py Configuration File

An example file is provided config.py.sample'. You can use this file as a framework to create a config.py file that will be located in the same directory as the AWScons` app.py file.

There are three sections in the config.py file:

  • session_config - user session configuration
  • saml_config - SAML SP configuration
  • aws_config - maps url path to specific roles to assume

Configure session_config stanza

  • This can be a simple null configuration in many cases:
session_config = {}
  • For higher use environments you will want persistent caching. Consult BottleSessions documentation for more detail.
  • With a low-volume of requests the memory-based SimpleCache is adequate
  • With a higher-volume of requests FileCache is simple enough with only a path to a cache directory specified

Configure saml_config stanza

  • Configuring the SAML Service Provider (SP) is beyond the scope of this document. Refer to BottleSaml documentation for more detail.
  • The name_id configured should be something useful (username or email), as it will be included in console and also in CloudTrail logging.
  • If groups will be used for authorization, these should be provided as IdP assertions, and listed in the assertions configuration list so they will be kept as session attributes.

Configure aws_config

  • This provides configuation options and url path to role mapping

Application Configuration Settings

These options are for the full AWScons instance.

parametertypedefaultdescription
url_prefixString""Prefix for target URLS (defaults to no URL prefix)
aws_profile_nameStringNoneFor IAM user creds - sets AWS_PROFILE
aws_credentials_fileStringNoneFor IAM user creds - sets AWS_SHARED_CREDENTIALS_FILE
targetsListNonePython Dict containing specific target entries
  • One or more targets can be included in the AWScons instance. Only the targets list is required.

Target Specific Configuration Settings

A target configuration item contains specific information for a given service.

parametertypedefaultdescription
serviceStringNone (required)Name of service target used as URL path
durationInteger3600Duration (Seconds) credentials for assumed role are valid
roleStringNone (required)ARN of role assumed for this URL path
groups[String,..][]User must have membership in one or more of these groups
  • duration can not exceed the maximum duration associated with the specified IAM role
  • groups is a list of groups restricting access to this role
  • The specific service is invoked when the final component of the url path matches the service name. i.e. https://www.example.com/aws/myadmin' matches the service target with the name 'myadmin' (but only when the instance has the url_prefix of '/aws')

Example 1: A Basic aws_config Stanza:

aws_config= {
"targets" : [{
"service": "awsadm", "role": "arn:aws:iam::123456789012:role/MyAdminRole",
} ]
}

Accessing https://www.example.com/awsadm will launch an AWS console to any authenticated user. The console will have access of the MyAdminRole role in account 123456789012. The console and credentials will be valid for 1 hour.

Example 2: A More Complex aws_config Stanza:

aws_config= {
"url_prefix": "/aws", # Base for URL"aws_profile_name" : "cons", # Profile name "aws_credentials_file" : "/usr/local/.aws/credentials", # Credentials file "targets" : [
{
"service": "cloudadmin", # /aws/cloudadmin"role": "arn:aws:iam::123456789012:role/MyAdminRole",
"duration": 28800,
"groups" : ["sysadmin", "cloudadmin"]
},
{
"service": "sandbox", # /aws/sandbox"role": "arn:aws:iam::999999789012:role/DBAdmin",
"duration": 28800,
"groups" : ["dbs"]
} ]
}

This config uses API credentials with the specified credentials file and profile name; all target URLs are prefixed with /aws.

Accessing https://www.example.com/aws/cloudadmin, an authenticated user must be a member of either sysadmin or cloudadmin groups. The user will be provided a console with the privileges of MyAdminRole that will be valid for 8 hours. The account accessed will be 123456789012.

With https://www.example.com/aws/sandbox, the authenticated user must be a member of the group `dba'. The privileges will be thoses of DBAdmin, and provides access to the AWS account with the id of 999999789012.

Evaluation and Generation of Console URL

  • The specific target is evaluated when a GET request is made to the URL path matching the form /<url_prefix>/
  • If a match is not found the request failes with an HTML 401 Unknown error.
  • The user is authenticated via SAML, with the IdP provided assertions added to user session as attributes for authorization. This includes 'groups' list.
  • The user is authorized if:
  • The user is a member of at least one group specified in the groups of the target configuration.
  • If no groups are listed in the target config, the user is not rejected.
  • Failing to meet this, the request fails with an HTML 403 Unauthorized error
  • AWScons acquires temporary credentials for role specified in the target config using the AWS sts:AssumeRole API
  • AWScons then calls AWS sts to generate a console login token
  • The login token is formed to a logon URL
  • The login URL is returned as an HTML 301 redirect

About

AWScon provides Single Sign On (SSO) users with AWS console access restricted by AWS IAM roles.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - Glocktober/AWSconsoleSSO: AWScon provides Single Sign On (SSO) users with AWS console access restricted by AWS IAM roles. · GitHub
Skip to content

Latest commit

History

7 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

AWScons - AWS Console SSO Access Manager

AWScon provides Single Sign On (SSO) users with AWS console access restricted by AWS IAM roles. Single Sign On is provided by SAML2, and role access is restricted by group membership.

Deployment Options

  • AWScons has been developed ant tested with Apache and mod_wsgi.

  • The SAML IdP used for Single Sign On (SSO) is Microsoft Azure AD

  • HoweverAWScons should be usable with any WSGI compliant web server environment and any SAML2 compatible IdP.

  • You will need have the requisite skills for your web server and IdP to deploy this app, as it is impossible to cover and test all the variations, or to document them here.

Installation of Python Components

 % git clone https://github.com/Glocktober/AWSconsoleSSO.git
% cd AWSconsoleSSO
% python3 -m venv
% source venv/bin/activate
% pip install -r requirements.txt
% # Create config.py
% # start for test on <hostname>:8000/
% python3 app.py
  • This will install the AWScons app and it's required components.
  • Generally you will want to deploy into a venv virtual environment.
  • You still need to integrate the Python code into your WSGI web application service and your SAML IdP.
  • Python components:
  • Bottle WSGI web application server
  • BottleSaml SAML2 Service Provider for Bottle using minisaml
  • BottleSessions provides session state management for Bottle using the Pallets Projectcachelib
  • Additional more common component packages such as requests, cryptography, and boto3

Setup AWS IAM user and roles

Create one or more AWS Assumed Roles

In AWS IAM

  • create a role selecting "For Another AWS Account".
  • Use the account number of the Assuming User (this can be the same, or a different account as the role.)
  • Attach the desired policy for this role.
  • Set the maximum duration this role can be used (the default is 1 hour)
  • Keep track of the ARN

Repeat this for each role you want to create.

For example, you can create a role called MyAdminRole in your account with the id of 123456789012, providing that same account id as the accessing account. Then attach the AWS managed policy AdministratorAccess, and edit the role to change the maximum duration to 8 hours (28800 seconds). The role ARN will be arn:aws:iam::123456789012:role/MyAdminRole.

In a different account (999999789012) you can create a role called DBAdminRole, listing account 123456789012 as the trusted account. Then attach the AWS managed policy AWSRDSFullAccess. The role ARN will be arn:aws:iam::999999789012:role/DBAdminRole.

The key is that the created roles must have trusted access to the account that will be generating the assume role credentials.

Create An AWS Policy to Assume the Created Roles

Create a policy with sts:AssumeRole API access to the ARNs for the assumed roles created in the previous step. This is done in the account that was granted the trust to assume any of the roles you created.

In our example this was account 123456789012. So in account 123456789012 you would create a policy - we'll call it assumeSSOpolicy:

 {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:assumeRole",
"Resource": [
"arn:aws:iam::123456789012:role/MyAdminRole",
"arn:aws:iam::123456789012:role/ReadOnlyRole",
"arn:aws:iam::999999789012:role/DBAdminRole",
]
}
]
}

Create a User or Role with this Policy

Apply the policy in one of two ways:

  • Attach the policy to an EC2 IAM Role and attach to the EC2 instance AWScons is hosted.
  • Attach the policy directly to an IAM user account.

For EC2:

  • In IAM create a new role, for EC2, and attach the policy (assumeSSOpolicy in our example) to this role.
  • Attache this role to the EC2 instance the code will be running on.

For IAM user:

  • Create an IAM user (say AWSconSSO) with only API keys and save the keys
  • Apply the policy (assumeSSOpolicy in our example) to this user
  • On the hosting sever create a credentials file containing the API keys
  • Use the config options aws_credentials_file and aws_profile in the aws_config stanza of config.py

The EC2 Role is the preferred method when AWScons is hosted in AWS; the IAM User account is required if AWScons is not being hosted in AWS, or hosted with outher API applications.

Create the config.py Configuration File

An example file is provided config.py.sample'. You can use this file as a framework to create a config.py file that will be located in the same directory as the AWScons` app.py file.

There are three sections in the config.py file:

  • session_config - user session configuration
  • saml_config - SAML SP configuration
  • aws_config - maps url path to specific roles to assume

Configure session_config stanza

  • This can be a simple null configuration in many cases:
session_config = {}
  • For higher use environments you will want persistent caching. Consult BottleSessions documentation for more detail.
  • With a low-volume of requests the memory-based SimpleCache is adequate
  • With a higher-volume of requests FileCache is simple enough with only a path to a cache directory specified

Configure saml_config stanza

  • Configuring the SAML Service Provider (SP) is beyond the scope of this document. Refer to BottleSaml documentation for more detail.
  • The name_id configured should be something useful (username or email), as it will be included in console and also in CloudTrail logging.
  • If groups will be used for authorization, these should be provided as IdP assertions, and listed in the assertions configuration list so they will be kept as session attributes.

Configure aws_config

  • This provides configuation options and url path to role mapping

Application Configuration Settings

These options are for the full AWScons instance.

parametertypedefaultdescription
url_prefixString""Prefix for target URLS (defaults to no URL prefix)
aws_profile_nameStringNoneFor IAM user creds - sets AWS_PROFILE
aws_credentials_fileStringNoneFor IAM user creds - sets AWS_SHARED_CREDENTIALS_FILE
targetsListNonePython Dict containing specific target entries
  • One or more targets can be included in the AWScons instance. Only the targets list is required.

Target Specific Configuration Settings

A target configuration item contains specific information for a given service.

parametertypedefaultdescription
serviceStringNone (required)Name of service target used as URL path
durationInteger3600Duration (Seconds) credentials for assumed role are valid
roleStringNone (required)ARN of role assumed for this URL path
groups[String,..][]User must have membership in one or more of these groups
  • duration can not exceed the maximum duration associated with the specified IAM role
  • groups is a list of groups restricting access to this role
  • The specific service is invoked when the final component of the url path matches the service name. i.e. https://www.example.com/aws/myadmin' matches the service target with the name 'myadmin' (but only when the instance has the url_prefix of '/aws')

Example 1: A Basic aws_config Stanza:

aws_config= {
"targets" : [{
"service": "awsadm", "role": "arn:aws:iam::123456789012:role/MyAdminRole",
} ]
}

Accessing https://www.example.com/awsadm will launch an AWS console to any authenticated user. The console will have access of the MyAdminRole role in account 123456789012. The console and credentials will be valid for 1 hour.

Example 2: A More Complex aws_config Stanza:

aws_config= {
"url_prefix": "/aws", # Base for URL"aws_profile_name" : "cons", # Profile name "aws_credentials_file" : "/usr/local/.aws/credentials", # Credentials file "targets" : [
{
"service": "cloudadmin", # /aws/cloudadmin"role": "arn:aws:iam::123456789012:role/MyAdminRole",
"duration": 28800,
"groups" : ["sysadmin", "cloudadmin"]
},
{
"service": "sandbox", # /aws/sandbox"role": "arn:aws:iam::999999789012:role/DBAdmin",
"duration": 28800,
"groups" : ["dbs"]
} ]
}

This config uses API credentials with the specified credentials file and profile name; all target URLs are prefixed with /aws.

Accessing https://www.example.com/aws/cloudadmin, an authenticated user must be a member of either sysadmin or cloudadmin groups. The user will be provided a console with the privileges of MyAdminRole that will be valid for 8 hours. The account accessed will be 123456789012.

With https://www.example.com/aws/sandbox, the authenticated user must be a member of the group `dba'. The privileges will be thoses of DBAdmin, and provides access to the AWS account with the id of 999999789012.

Evaluation and Generation of Console URL

  • The specific target is evaluated when a GET request is made to the URL path matching the form /<url_prefix>/
  • If a match is not found the request failes with an HTML 401 Unknown error.
  • The user is authenticated via SAML, with the IdP provided assertions added to user session as attributes for authorization. This includes 'groups' list.
  • The user is authorized if:
  • The user is a member of at least one group specified in the groups of the target configuration.
  • If no groups are listed in the target config, the user is not rejected.
  • Failing to meet this, the request fails with an HTML 403 Unauthorized error
  • AWScons acquires temporary credentials for role specified in the target config using the AWS sts:AssumeRole API
  • AWScons then calls AWS sts to generate a console login token
  • The login token is formed to a logon URL
  • The login URL is returned as an HTML 301 redirect

About

AWScon provides Single Sign On (SSO) users with AWS console access restricted by AWS IAM roles.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - Glocktober/AWSconsoleSSO: AWScon provides Single Sign On (SSO) users with AWS console access restricted by AWS IAM roles. · GitHub
Skip to content

Latest commit

History

7 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

AWScons - AWS Console SSO Access Manager

AWScon provides Single Sign On (SSO) users with AWS console access restricted by AWS IAM roles. Single Sign On is provided by SAML2, and role access is restricted by group membership.

Deployment Options

  • AWScons has been developed ant tested with Apache and mod_wsgi.

  • The SAML IdP used for Single Sign On (SSO) is Microsoft Azure AD

  • HoweverAWScons should be usable with any WSGI compliant web server environment and any SAML2 compatible IdP.

  • You will need have the requisite skills for your web server and IdP to deploy this app, as it is impossible to cover and test all the variations, or to document them here.

Installation of Python Components

 % git clone https://github.com/Glocktober/AWSconsoleSSO.git
% cd AWSconsoleSSO
% python3 -m venv
% source venv/bin/activate
% pip install -r requirements.txt
% # Create config.py
% # start for test on <hostname>:8000/
% python3 app.py
  • This will install the AWScons app and it's required components.
  • Generally you will want to deploy into a venv virtual environment.
  • You still need to integrate the Python code into your WSGI web application service and your SAML IdP.
  • Python components:
  • Bottle WSGI web application server
  • BottleSaml SAML2 Service Provider for Bottle using minisaml
  • BottleSessions provides session state management for Bottle using the Pallets Projectcachelib
  • Additional more common component packages such as requests, cryptography, and boto3

Setup AWS IAM user and roles

Create one or more AWS Assumed Roles

In AWS IAM

  • create a role selecting "For Another AWS Account".
  • Use the account number of the Assuming User (this can be the same, or a different account as the role.)
  • Attach the desired policy for this role.
  • Set the maximum duration this role can be used (the default is 1 hour)
  • Keep track of the ARN

Repeat this for each role you want to create.

For example, you can create a role called MyAdminRole in your account with the id of 123456789012, providing that same account id as the accessing account. Then attach the AWS managed policy AdministratorAccess, and edit the role to change the maximum duration to 8 hours (28800 seconds). The role ARN will be arn:aws:iam::123456789012:role/MyAdminRole.

In a different account (999999789012) you can create a role called DBAdminRole, listing account 123456789012 as the trusted account. Then attach the AWS managed policy AWSRDSFullAccess. The role ARN will be arn:aws:iam::999999789012:role/DBAdminRole.

The key is that the created roles must have trusted access to the account that will be generating the assume role credentials.

Create An AWS Policy to Assume the Created Roles

Create a policy with sts:AssumeRole API access to the ARNs for the assumed roles created in the previous step. This is done in the account that was granted the trust to assume any of the roles you created.

In our example this was account 123456789012. So in account 123456789012 you would create a policy - we'll call it assumeSSOpolicy:

 {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:assumeRole",
"Resource": [
"arn:aws:iam::123456789012:role/MyAdminRole",
"arn:aws:iam::123456789012:role/ReadOnlyRole",
"arn:aws:iam::999999789012:role/DBAdminRole",
]
}
]
}

Create a User or Role with this Policy

Apply the policy in one of two ways:

  • Attach the policy to an EC2 IAM Role and attach to the EC2 instance AWScons is hosted.
  • Attach the policy directly to an IAM user account.

For EC2:

  • In IAM create a new role, for EC2, and attach the policy (assumeSSOpolicy in our example) to this role.
  • Attache this role to the EC2 instance the code will be running on.

For IAM user:

  • Create an IAM user (say AWSconSSO) with only API keys and save the keys
  • Apply the policy (assumeSSOpolicy in our example) to this user
  • On the hosting sever create a credentials file containing the API keys
  • Use the config options aws_credentials_file and aws_profile in the aws_config stanza of config.py

The EC2 Role is the preferred method when AWScons is hosted in AWS; the IAM User account is required if AWScons is not being hosted in AWS, or hosted with outher API applications.

Create the config.py Configuration File

An example file is provided config.py.sample'. You can use this file as a framework to create a config.py file that will be located in the same directory as the AWScons` app.py file.

There are three sections in the config.py file:

  • session_config - user session configuration
  • saml_config - SAML SP configuration
  • aws_config - maps url path to specific roles to assume

Configure session_config stanza

  • This can be a simple null configuration in many cases:
session_config = {}
  • For higher use environments you will want persistent caching. Consult BottleSessions documentation for more detail.
  • With a low-volume of requests the memory-based SimpleCache is adequate
  • With a higher-volume of requests FileCache is simple enough with only a path to a cache directory specified

Configure saml_config stanza

  • Configuring the SAML Service Provider (SP) is beyond the scope of this document. Refer to BottleSaml documentation for more detail.
  • The name_id configured should be something useful (username or email), as it will be included in console and also in CloudTrail logging.
  • If groups will be used for authorization, these should be provided as IdP assertions, and listed in the assertions configuration list so they will be kept as session attributes.

Configure aws_config

  • This provides configuation options and url path to role mapping

Application Configuration Settings

These options are for the full AWScons instance.

parametertypedefaultdescription
url_prefixString""Prefix for target URLS (defaults to no URL prefix)
aws_profile_nameStringNoneFor IAM user creds - sets AWS_PROFILE
aws_credentials_fileStringNoneFor IAM user creds - sets AWS_SHARED_CREDENTIALS_FILE
targetsListNonePython Dict containing specific target entries
  • One or more targets can be included in the AWScons instance. Only the targets list is required.

Target Specific Configuration Settings

A target configuration item contains specific information for a given service.

parametertypedefaultdescription
serviceStringNone (required)Name of service target used as URL path
durationInteger3600Duration (Seconds) credentials for assumed role are valid
roleStringNone (required)ARN of role assumed for this URL path
groups[String,..][]User must have membership in one or more of these groups
  • duration can not exceed the maximum duration associated with the specified IAM role
  • groups is a list of groups restricting access to this role
  • The specific service is invoked when the final component of the url path matches the service name. i.e. https://www.example.com/aws/myadmin' matches the service target with the name 'myadmin' (but only when the instance has the url_prefix of '/aws')

Example 1: A Basic aws_config Stanza:

aws_config= {
"targets" : [{
"service": "awsadm", "role": "arn:aws:iam::123456789012:role/MyAdminRole",
} ]
}

Accessing https://www.example.com/awsadm will launch an AWS console to any authenticated user. The console will have access of the MyAdminRole role in account 123456789012. The console and credentials will be valid for 1 hour.

Example 2: A More Complex aws_config Stanza:

aws_config= {
"url_prefix": "/aws", # Base for URL"aws_profile_name" : "cons", # Profile name "aws_credentials_file" : "/usr/local/.aws/credentials", # Credentials file "targets" : [
{
"service": "cloudadmin", # /aws/cloudadmin"role": "arn:aws:iam::123456789012:role/MyAdminRole",
"duration": 28800,
"groups" : ["sysadmin", "cloudadmin"]
},
{
"service": "sandbox", # /aws/sandbox"role": "arn:aws:iam::999999789012:role/DBAdmin",
"duration": 28800,
"groups" : ["dbs"]
} ]
}

This config uses API credentials with the specified credentials file and profile name; all target URLs are prefixed with /aws.

Accessing https://www.example.com/aws/cloudadmin, an authenticated user must be a member of either sysadmin or cloudadmin groups. The user will be provided a console with the privileges of MyAdminRole that will be valid for 8 hours. The account accessed will be 123456789012.

With https://www.example.com/aws/sandbox, the authenticated user must be a member of the group `dba'. The privileges will be thoses of DBAdmin, and provides access to the AWS account with the id of 999999789012.

Evaluation and Generation of Console URL

  • The specific target is evaluated when a GET request is made to the URL path matching the form /<url_prefix>/
  • If a match is not found the request failes with an HTML 401 Unknown error.
  • The user is authenticated via SAML, with the IdP provided assertions added to user session as attributes for authorization. This includes 'groups' list.
  • The user is authorized if:
  • The user is a member of at least one group specified in the groups of the target configuration.
  • If no groups are listed in the target config, the user is not rejected.
  • Failing to meet this, the request fails with an HTML 403 Unauthorized error
  • AWScons acquires temporary credentials for role specified in the target config using the AWS sts:AssumeRole API
  • AWScons then calls AWS sts to generate a console login token
  • The login token is formed to a logon URL
  • The login URL is returned as an HTML 301 redirect

About

AWScon provides Single Sign On (SSO) users with AWS console access restricted by AWS IAM roles.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - Glocktober/AWSconsoleSSO: AWScon provides Single Sign On (SSO) users with AWS console access restricted by AWS IAM roles. · GitHub
Skip to content

Latest commit

History

7 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

AWScons - AWS Console SSO Access Manager

AWScon provides Single Sign On (SSO) users with AWS console access restricted by AWS IAM roles. Single Sign On is provided by SAML2, and role access is restricted by group membership.

Deployment Options

  • AWScons has been developed ant tested with Apache and mod_wsgi.

  • The SAML IdP used for Single Sign On (SSO) is Microsoft Azure AD

  • HoweverAWScons should be usable with any WSGI compliant web server environment and any SAML2 compatible IdP.

  • You will need have the requisite skills for your web server and IdP to deploy this app, as it is impossible to cover and test all the variations, or to document them here.

Installation of Python Components

 % git clone https://github.com/Glocktober/AWSconsoleSSO.git
% cd AWSconsoleSSO
% python3 -m venv
% source venv/bin/activate
% pip install -r requirements.txt
% # Create config.py
% # start for test on <hostname>:8000/
% python3 app.py
  • This will install the AWScons app and it's required components.
  • Generally you will want to deploy into a venv virtual environment.
  • You still need to integrate the Python code into your WSGI web application service and your SAML IdP.
  • Python components:
  • Bottle WSGI web application server
  • BottleSaml SAML2 Service Provider for Bottle using minisaml
  • BottleSessions provides session state management for Bottle using the Pallets Projectcachelib
  • Additional more common component packages such as requests, cryptography, and boto3

Setup AWS IAM user and roles

Create one or more AWS Assumed Roles

In AWS IAM

  • create a role selecting "For Another AWS Account".
  • Use the account number of the Assuming User (this can be the same, or a different account as the role.)
  • Attach the desired policy for this role.
  • Set the maximum duration this role can be used (the default is 1 hour)
  • Keep track of the ARN

Repeat this for each role you want to create.

For example, you can create a role called MyAdminRole in your account with the id of 123456789012, providing that same account id as the accessing account. Then attach the AWS managed policy AdministratorAccess, and edit the role to change the maximum duration to 8 hours (28800 seconds). The role ARN will be arn:aws:iam::123456789012:role/MyAdminRole.

In a different account (999999789012) you can create a role called DBAdminRole, listing account 123456789012 as the trusted account. Then attach the AWS managed policy AWSRDSFullAccess. The role ARN will be arn:aws:iam::999999789012:role/DBAdminRole.

The key is that the created roles must have trusted access to the account that will be generating the assume role credentials.

Create An AWS Policy to Assume the Created Roles

Create a policy with sts:AssumeRole API access to the ARNs for the assumed roles created in the previous step. This is done in the account that was granted the trust to assume any of the roles you created.

In our example this was account 123456789012. So in account 123456789012 you would create a policy - we'll call it assumeSSOpolicy:

 {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:assumeRole",
"Resource": [
"arn:aws:iam::123456789012:role/MyAdminRole",
"arn:aws:iam::123456789012:role/ReadOnlyRole",
"arn:aws:iam::999999789012:role/DBAdminRole",
]
}
]
}

Create a User or Role with this Policy

Apply the policy in one of two ways:

  • Attach the policy to an EC2 IAM Role and attach to the EC2 instance AWScons is hosted.
  • Attach the policy directly to an IAM user account.

For EC2:

  • In IAM create a new role, for EC2, and attach the policy (assumeSSOpolicy in our example) to this role.
  • Attache this role to the EC2 instance the code will be running on.

For IAM user:

  • Create an IAM user (say AWSconSSO) with only API keys and save the keys
  • Apply the policy (assumeSSOpolicy in our example) to this user
  • On the hosting sever create a credentials file containing the API keys
  • Use the config options aws_credentials_file and aws_profile in the aws_config stanza of config.py

The EC2 Role is the preferred method when AWScons is hosted in AWS; the IAM User account is required if AWScons is not being hosted in AWS, or hosted with outher API applications.

Create the config.py Configuration File

An example file is provided config.py.sample'. You can use this file as a framework to create a config.py file that will be located in the same directory as the AWScons` app.py file.

There are three sections in the config.py file:

  • session_config - user session configuration
  • saml_config - SAML SP configuration
  • aws_config - maps url path to specific roles to assume

Configure session_config stanza

  • This can be a simple null configuration in many cases:
session_config = {}
  • For higher use environments you will want persistent caching. Consult BottleSessions documentation for more detail.
  • With a low-volume of requests the memory-based SimpleCache is adequate
  • With a higher-volume of requests FileCache is simple enough with only a path to a cache directory specified

Configure saml_config stanza

  • Configuring the SAML Service Provider (SP) is beyond the scope of this document. Refer to BottleSaml documentation for more detail.
  • The name_id configured should be something useful (username or email), as it will be included in console and also in CloudTrail logging.
  • If groups will be used for authorization, these should be provided as IdP assertions, and listed in the assertions configuration list so they will be kept as session attributes.

Configure aws_config

  • This provides configuation options and url path to role mapping

Application Configuration Settings

These options are for the full AWScons instance.

parametertypedefaultdescription
url_prefixString""Prefix for target URLS (defaults to no URL prefix)
aws_profile_nameStringNoneFor IAM user creds - sets AWS_PROFILE
aws_credentials_fileStringNoneFor IAM user creds - sets AWS_SHARED_CREDENTIALS_FILE
targetsListNonePython Dict containing specific target entries
  • One or more targets can be included in the AWScons instance. Only the targets list is required.

Target Specific Configuration Settings

A target configuration item contains specific information for a given service.

parametertypedefaultdescription
serviceStringNone (required)Name of service target used as URL path
durationInteger3600Duration (Seconds) credentials for assumed role are valid
roleStringNone (required)ARN of role assumed for this URL path
groups[String,..][]User must have membership in one or more of these groups
  • duration can not exceed the maximum duration associated with the specified IAM role
  • groups is a list of groups restricting access to this role
  • The specific service is invoked when the final component of the url path matches the service name. i.e. https://www.example.com/aws/myadmin' matches the service target with the name 'myadmin' (but only when the instance has the url_prefix of '/aws')

Example 1: A Basic aws_config Stanza:

aws_config= {
"targets" : [{
"service": "awsadm", "role": "arn:aws:iam::123456789012:role/MyAdminRole",
} ]
}

Accessing https://www.example.com/awsadm will launch an AWS console to any authenticated user. The console will have access of the MyAdminRole role in account 123456789012. The console and credentials will be valid for 1 hour.

Example 2: A More Complex aws_config Stanza:

aws_config= {
"url_prefix": "/aws", # Base for URL"aws_profile_name" : "cons", # Profile name "aws_credentials_file" : "/usr/local/.aws/credentials", # Credentials file "targets" : [
{
"service": "cloudadmin", # /aws/cloudadmin"role": "arn:aws:iam::123456789012:role/MyAdminRole",
"duration": 28800,
"groups" : ["sysadmin", "cloudadmin"]
},
{
"service": "sandbox", # /aws/sandbox"role": "arn:aws:iam::999999789012:role/DBAdmin",
"duration": 28800,
"groups" : ["dbs"]
} ]
}

This config uses API credentials with the specified credentials file and profile name; all target URLs are prefixed with /aws.

Accessing https://www.example.com/aws/cloudadmin, an authenticated user must be a member of either sysadmin or cloudadmin groups. The user will be provided a console with the privileges of MyAdminRole that will be valid for 8 hours. The account accessed will be 123456789012.

With https://www.example.com/aws/sandbox, the authenticated user must be a member of the group `dba'. The privileges will be thoses of DBAdmin, and provides access to the AWS account with the id of 999999789012.

Evaluation and Generation of Console URL

  • The specific target is evaluated when a GET request is made to the URL path matching the form /<url_prefix>/
  • If a match is not found the request failes with an HTML 401 Unknown error.
  • The user is authenticated via SAML, with the IdP provided assertions added to user session as attributes for authorization. This includes 'groups' list.
  • The user is authorized if:
  • The user is a member of at least one group specified in the groups of the target configuration.
  • If no groups are listed in the target config, the user is not rejected.
  • Failing to meet this, the request fails with an HTML 403 Unauthorized error
  • AWScons acquires temporary credentials for role specified in the target config using the AWS sts:AssumeRole API
  • AWScons then calls AWS sts to generate a console login token
  • The login token is formed to a logon URL
  • The login URL is returned as an HTML 301 redirect

About

AWScon provides Single Sign On (SSO) users with AWS console access restricted by AWS IAM roles.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - Glocktober/AWSconsoleSSO: AWScon provides Single Sign On (SSO) users with AWS console access restricted by AWS IAM roles. · GitHub
Skip to content

Latest commit

History

7 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

AWScons - AWS Console SSO Access Manager

AWScon provides Single Sign On (SSO) users with AWS console access restricted by AWS IAM roles. Single Sign On is provided by SAML2, and role access is restricted by group membership.

Deployment Options

  • AWScons has been developed ant tested with Apache and mod_wsgi.

  • The SAML IdP used for Single Sign On (SSO) is Microsoft Azure AD

  • HoweverAWScons should be usable with any WSGI compliant web server environment and any SAML2 compatible IdP.

  • You will need have the requisite skills for your web server and IdP to deploy this app, as it is impossible to cover and test all the variations, or to document them here.

Installation of Python Components

 % git clone https://github.com/Glocktober/AWSconsoleSSO.git
% cd AWSconsoleSSO
% python3 -m venv
% source venv/bin/activate
% pip install -r requirements.txt
% # Create config.py
% # start for test on <hostname>:8000/
% python3 app.py
  • This will install the AWScons app and it's required components.
  • Generally you will want to deploy into a venv virtual environment.
  • You still need to integrate the Python code into your WSGI web application service and your SAML IdP.
  • Python components:
  • Bottle WSGI web application server
  • BottleSaml SAML2 Service Provider for Bottle using minisaml
  • BottleSessions provides session state management for Bottle using the Pallets Projectcachelib
  • Additional more common component packages such as requests, cryptography, and boto3

Setup AWS IAM user and roles

Create one or more AWS Assumed Roles

In AWS IAM

  • create a role selecting "For Another AWS Account".
  • Use the account number of the Assuming User (this can be the same, or a different account as the role.)
  • Attach the desired policy for this role.
  • Set the maximum duration this role can be used (the default is 1 hour)
  • Keep track of the ARN

Repeat this for each role you want to create.

For example, you can create a role called MyAdminRole in your account with the id of 123456789012, providing that same account id as the accessing account. Then attach the AWS managed policy AdministratorAccess, and edit the role to change the maximum duration to 8 hours (28800 seconds). The role ARN will be arn:aws:iam::123456789012:role/MyAdminRole.

In a different account (999999789012) you can create a role called DBAdminRole, listing account 123456789012 as the trusted account. Then attach the AWS managed policy AWSRDSFullAccess. The role ARN will be arn:aws:iam::999999789012:role/DBAdminRole.

The key is that the created roles must have trusted access to the account that will be generating the assume role credentials.

Create An AWS Policy to Assume the Created Roles

Create a policy with sts:AssumeRole API access to the ARNs for the assumed roles created in the previous step. This is done in the account that was granted the trust to assume any of the roles you created.

In our example this was account 123456789012. So in account 123456789012 you would create a policy - we'll call it assumeSSOpolicy:

 {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:assumeRole",
"Resource": [
"arn:aws:iam::123456789012:role/MyAdminRole",
"arn:aws:iam::123456789012:role/ReadOnlyRole",
"arn:aws:iam::999999789012:role/DBAdminRole",
]
}
]
}

Create a User or Role with this Policy

Apply the policy in one of two ways:

  • Attach the policy to an EC2 IAM Role and attach to the EC2 instance AWScons is hosted.
  • Attach the policy directly to an IAM user account.

For EC2:

  • In IAM create a new role, for EC2, and attach the policy (assumeSSOpolicy in our example) to this role.
  • Attache this role to the EC2 instance the code will be running on.

For IAM user:

  • Create an IAM user (say AWSconSSO) with only API keys and save the keys
  • Apply the policy (assumeSSOpolicy in our example) to this user
  • On the hosting sever create a credentials file containing the API keys
  • Use the config options aws_credentials_file and aws_profile in the aws_config stanza of config.py

The EC2 Role is the preferred method when AWScons is hosted in AWS; the IAM User account is required if AWScons is not being hosted in AWS, or hosted with outher API applications.

Create the config.py Configuration File

An example file is provided config.py.sample'. You can use this file as a framework to create a config.py file that will be located in the same directory as the AWScons` app.py file.

There are three sections in the config.py file:

  • session_config - user session configuration
  • saml_config - SAML SP configuration
  • aws_config - maps url path to specific roles to assume

Configure session_config stanza

  • This can be a simple null configuration in many cases:
session_config = {}
  • For higher use environments you will want persistent caching. Consult BottleSessions documentation for more detail.
  • With a low-volume of requests the memory-based SimpleCache is adequate
  • With a higher-volume of requests FileCache is simple enough with only a path to a cache directory specified

Configure saml_config stanza

  • Configuring the SAML Service Provider (SP) is beyond the scope of this document. Refer to BottleSaml documentation for more detail.
  • The name_id configured should be something useful (username or email), as it will be included in console and also in CloudTrail logging.
  • If groups will be used for authorization, these should be provided as IdP assertions, and listed in the assertions configuration list so they will be kept as session attributes.

Configure aws_config

  • This provides configuation options and url path to role mapping

Application Configuration Settings

These options are for the full AWScons instance.

parametertypedefaultdescription
url_prefixString""Prefix for target URLS (defaults to no URL prefix)
aws_profile_nameStringNoneFor IAM user creds - sets AWS_PROFILE
aws_credentials_fileStringNoneFor IAM user creds - sets AWS_SHARED_CREDENTIALS_FILE
targetsListNonePython Dict containing specific target entries
  • One or more targets can be included in the AWScons instance. Only the targets list is required.

Target Specific Configuration Settings

A target configuration item contains specific information for a given service.

parametertypedefaultdescription
serviceStringNone (required)Name of service target used as URL path
durationInteger3600Duration (Seconds) credentials for assumed role are valid
roleStringNone (required)ARN of role assumed for this URL path
groups[String,..][]User must have membership in one or more of these groups
  • duration can not exceed the maximum duration associated with the specified IAM role
  • groups is a list of groups restricting access to this role
  • The specific service is invoked when the final component of the url path matches the service name. i.e. https://www.example.com/aws/myadmin' matches the service target with the name 'myadmin' (but only when the instance has the url_prefix of '/aws')

Example 1: A Basic aws_config Stanza:

aws_config= {
"targets" : [{
"service": "awsadm", "role": "arn:aws:iam::123456789012:role/MyAdminRole",
} ]
}

Accessing https://www.example.com/awsadm will launch an AWS console to any authenticated user. The console will have access of the MyAdminRole role in account 123456789012. The console and credentials will be valid for 1 hour.

Example 2: A More Complex aws_config Stanza:

aws_config= {
"url_prefix": "/aws", # Base for URL"aws_profile_name" : "cons", # Profile name "aws_credentials_file" : "/usr/local/.aws/credentials", # Credentials file "targets" : [
{
"service": "cloudadmin", # /aws/cloudadmin"role": "arn:aws:iam::123456789012:role/MyAdminRole",
"duration": 28800,
"groups" : ["sysadmin", "cloudadmin"]
},
{
"service": "sandbox", # /aws/sandbox"role": "arn:aws:iam::999999789012:role/DBAdmin",
"duration": 28800,
"groups" : ["dbs"]
} ]
}

This config uses API credentials with the specified credentials file and profile name; all target URLs are prefixed with /aws.

Accessing https://www.example.com/aws/cloudadmin, an authenticated user must be a member of either sysadmin or cloudadmin groups. The user will be provided a console with the privileges of MyAdminRole that will be valid for 8 hours. The account accessed will be 123456789012.

With https://www.example.com/aws/sandbox, the authenticated user must be a member of the group `dba'. The privileges will be thoses of DBAdmin, and provides access to the AWS account with the id of 999999789012.

Evaluation and Generation of Console URL

  • The specific target is evaluated when a GET request is made to the URL path matching the form /<url_prefix>/
  • If a match is not found the request failes with an HTML 401 Unknown error.
  • The user is authenticated via SAML, with the IdP provided assertions added to user session as attributes for authorization. This includes 'groups' list.
  • The user is authorized if:
  • The user is a member of at least one group specified in the groups of the target configuration.
  • If no groups are listed in the target config, the user is not rejected.
  • Failing to meet this, the request fails with an HTML 403 Unauthorized error
  • AWScons acquires temporary credentials for role specified in the target config using the AWS sts:AssumeRole API
  • AWScons then calls AWS sts to generate a console login token
  • The login token is formed to a logon URL
  • The login URL is returned as an HTML 301 redirect

About

AWScon provides Single Sign On (SSO) users with AWS console access restricted by AWS IAM roles.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - Glocktober/AWSconsoleSSO: AWScon provides Single Sign On (SSO) users with AWS console access restricted by AWS IAM roles. · GitHub
Skip to content

Latest commit

History

7 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

AWScons - AWS Console SSO Access Manager

AWScon provides Single Sign On (SSO) users with AWS console access restricted by AWS IAM roles. Single Sign On is provided by SAML2, and role access is restricted by group membership.

Deployment Options

  • AWScons has been developed ant tested with Apache and mod_wsgi.

  • The SAML IdP used for Single Sign On (SSO) is Microsoft Azure AD

  • HoweverAWScons should be usable with any WSGI compliant web server environment and any SAML2 compatible IdP.

  • You will need have the requisite skills for your web server and IdP to deploy this app, as it is impossible to cover and test all the variations, or to document them here.

Installation of Python Components

 % git clone https://github.com/Glocktober/AWSconsoleSSO.git
% cd AWSconsoleSSO
% python3 -m venv
% source venv/bin/activate
% pip install -r requirements.txt
% # Create config.py
% # start for test on <hostname>:8000/
% python3 app.py
  • This will install the AWScons app and it's required components.
  • Generally you will want to deploy into a venv virtual environment.
  • You still need to integrate the Python code into your WSGI web application service and your SAML IdP.
  • Python components:
  • Bottle WSGI web application server
  • BottleSaml SAML2 Service Provider for Bottle using minisaml
  • BottleSessions provides session state management for Bottle using the Pallets Projectcachelib
  • Additional more common component packages such as requests, cryptography, and boto3

Setup AWS IAM user and roles

Create one or more AWS Assumed Roles

In AWS IAM

  • create a role selecting "For Another AWS Account".
  • Use the account number of the Assuming User (this can be the same, or a different account as the role.)
  • Attach the desired policy for this role.
  • Set the maximum duration this role can be used (the default is 1 hour)
  • Keep track of the ARN

Repeat this for each role you want to create.

For example, you can create a role called MyAdminRole in your account with the id of 123456789012, providing that same account id as the accessing account. Then attach the AWS managed policy AdministratorAccess, and edit the role to change the maximum duration to 8 hours (28800 seconds). The role ARN will be arn:aws:iam::123456789012:role/MyAdminRole.

In a different account (999999789012) you can create a role called DBAdminRole, listing account 123456789012 as the trusted account. Then attach the AWS managed policy AWSRDSFullAccess. The role ARN will be arn:aws:iam::999999789012:role/DBAdminRole.

The key is that the created roles must have trusted access to the account that will be generating the assume role credentials.

Create An AWS Policy to Assume the Created Roles

Create a policy with sts:AssumeRole API access to the ARNs for the assumed roles created in the previous step. This is done in the account that was granted the trust to assume any of the roles you created.

In our example this was account 123456789012. So in account 123456789012 you would create a policy - we'll call it assumeSSOpolicy:

 {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:assumeRole",
"Resource": [
"arn:aws:iam::123456789012:role/MyAdminRole",
"arn:aws:iam::123456789012:role/ReadOnlyRole",
"arn:aws:iam::999999789012:role/DBAdminRole",
]
}
]
}

Create a User or Role with this Policy

Apply the policy in one of two ways:

  • Attach the policy to an EC2 IAM Role and attach to the EC2 instance AWScons is hosted.
  • Attach the policy directly to an IAM user account.

For EC2:

  • In IAM create a new role, for EC2, and attach the policy (assumeSSOpolicy in our example) to this role.
  • Attache this role to the EC2 instance the code will be running on.

For IAM user:

  • Create an IAM user (say AWSconSSO) with only API keys and save the keys
  • Apply the policy (assumeSSOpolicy in our example) to this user
  • On the hosting sever create a credentials file containing the API keys
  • Use the config options aws_credentials_file and aws_profile in the aws_config stanza of config.py

The EC2 Role is the preferred method when AWScons is hosted in AWS; the IAM User account is required if AWScons is not being hosted in AWS, or hosted with outher API applications.

Create the config.py Configuration File

An example file is provided config.py.sample'. You can use this file as a framework to create a config.py file that will be located in the same directory as the AWScons` app.py file.

There are three sections in the config.py file:

  • session_config - user session configuration
  • saml_config - SAML SP configuration
  • aws_config - maps url path to specific roles to assume

Configure session_config stanza

  • This can be a simple null configuration in many cases:
session_config = {}
  • For higher use environments you will want persistent caching. Consult BottleSessions documentation for more detail.
  • With a low-volume of requests the memory-based SimpleCache is adequate
  • With a higher-volume of requests FileCache is simple enough with only a path to a cache directory specified

Configure saml_config stanza

  • Configuring the SAML Service Provider (SP) is beyond the scope of this document. Refer to BottleSaml documentation for more detail.
  • The name_id configured should be something useful (username or email), as it will be included in console and also in CloudTrail logging.
  • If groups will be used for authorization, these should be provided as IdP assertions, and listed in the assertions configuration list so they will be kept as session attributes.

Configure aws_config

  • This provides configuation options and url path to role mapping

Application Configuration Settings

These options are for the full AWScons instance.

parametertypedefaultdescription
url_prefixString""Prefix for target URLS (defaults to no URL prefix)
aws_profile_nameStringNoneFor IAM user creds - sets AWS_PROFILE
aws_credentials_fileStringNoneFor IAM user creds - sets AWS_SHARED_CREDENTIALS_FILE
targetsListNonePython Dict containing specific target entries
  • One or more targets can be included in the AWScons instance. Only the targets list is required.

Target Specific Configuration Settings

A target configuration item contains specific information for a given service.

parametertypedefaultdescription
serviceStringNone (required)Name of service target used as URL path
durationInteger3600Duration (Seconds) credentials for assumed role are valid
roleStringNone (required)ARN of role assumed for this URL path
groups[String,..][]User must have membership in one or more of these groups
  • duration can not exceed the maximum duration associated with the specified IAM role
  • groups is a list of groups restricting access to this role
  • The specific service is invoked when the final component of the url path matches the service name. i.e. https://www.example.com/aws/myadmin' matches the service target with the name 'myadmin' (but only when the instance has the url_prefix of '/aws')

Example 1: A Basic aws_config Stanza:

aws_config= {
"targets" : [{
"service": "awsadm", "role": "arn:aws:iam::123456789012:role/MyAdminRole",
} ]
}

Accessing https://www.example.com/awsadm will launch an AWS console to any authenticated user. The console will have access of the MyAdminRole role in account 123456789012. The console and credentials will be valid for 1 hour.

Example 2: A More Complex aws_config Stanza:

aws_config= {
"url_prefix": "/aws", # Base for URL"aws_profile_name" : "cons", # Profile name "aws_credentials_file" : "/usr/local/.aws/credentials", # Credentials file "targets" : [
{
"service": "cloudadmin", # /aws/cloudadmin"role": "arn:aws:iam::123456789012:role/MyAdminRole",
"duration": 28800,
"groups" : ["sysadmin", "cloudadmin"]
},
{
"service": "sandbox", # /aws/sandbox"role": "arn:aws:iam::999999789012:role/DBAdmin",
"duration": 28800,
"groups" : ["dbs"]
} ]
}

This config uses API credentials with the specified credentials file and profile name; all target URLs are prefixed with /aws.

Accessing https://www.example.com/aws/cloudadmin, an authenticated user must be a member of either sysadmin or cloudadmin groups. The user will be provided a console with the privileges of MyAdminRole that will be valid for 8 hours. The account accessed will be 123456789012.

With https://www.example.com/aws/sandbox, the authenticated user must be a member of the group `dba'. The privileges will be thoses of DBAdmin, and provides access to the AWS account with the id of 999999789012.

Evaluation and Generation of Console URL

  • The specific target is evaluated when a GET request is made to the URL path matching the form /<url_prefix>/
  • If a match is not found the request failes with an HTML 401 Unknown error.
  • The user is authenticated via SAML, with the IdP provided assertions added to user session as attributes for authorization. This includes 'groups' list.
  • The user is authorized if:
  • The user is a member of at least one group specified in the groups of the target configuration.
  • If no groups are listed in the target config, the user is not rejected.
  • Failing to meet this, the request fails with an HTML 403 Unauthorized error
  • AWScons acquires temporary credentials for role specified in the target config using the AWS sts:AssumeRole API
  • AWScons then calls AWS sts to generate a console login token
  • The login token is formed to a logon URL
  • The login URL is returned as an HTML 301 redirect

About

AWScon provides Single Sign On (SSO) users with AWS console access restricted by AWS IAM roles.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - Glocktober/AWSconsoleSSO: AWScon provides Single Sign On (SSO) users with AWS console access restricted by AWS IAM roles. · GitHub
Skip to content

Latest commit

History

7 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

AWScons - AWS Console SSO Access Manager

AWScon provides Single Sign On (SSO) users with AWS console access restricted by AWS IAM roles. Single Sign On is provided by SAML2, and role access is restricted by group membership.

Deployment Options

  • AWScons has been developed ant tested with Apache and mod_wsgi.

  • The SAML IdP used for Single Sign On (SSO) is Microsoft Azure AD

  • HoweverAWScons should be usable with any WSGI compliant web server environment and any SAML2 compatible IdP.

  • You will need have the requisite skills for your web server and IdP to deploy this app, as it is impossible to cover and test all the variations, or to document them here.

Installation of Python Components

 % git clone https://github.com/Glocktober/AWSconsoleSSO.git
% cd AWSconsoleSSO
% python3 -m venv
% source venv/bin/activate
% pip install -r requirements.txt
% # Create config.py
% # start for test on <hostname>:8000/
% python3 app.py
  • This will install the AWScons app and it's required components.
  • Generally you will want to deploy into a venv virtual environment.
  • You still need to integrate the Python code into your WSGI web application service and your SAML IdP.
  • Python components:
  • Bottle WSGI web application server
  • BottleSaml SAML2 Service Provider for Bottle using minisaml
  • BottleSessions provides session state management for Bottle using the Pallets Projectcachelib
  • Additional more common component packages such as requests, cryptography, and boto3

Setup AWS IAM user and roles

Create one or more AWS Assumed Roles

In AWS IAM

  • create a role selecting "For Another AWS Account".
  • Use the account number of the Assuming User (this can be the same, or a different account as the role.)
  • Attach the desired policy for this role.
  • Set the maximum duration this role can be used (the default is 1 hour)
  • Keep track of the ARN

Repeat this for each role you want to create.

For example, you can create a role called MyAdminRole in your account with the id of 123456789012, providing that same account id as the accessing account. Then attach the AWS managed policy AdministratorAccess, and edit the role to change the maximum duration to 8 hours (28800 seconds). The role ARN will be arn:aws:iam::123456789012:role/MyAdminRole.

In a different account (999999789012) you can create a role called DBAdminRole, listing account 123456789012 as the trusted account. Then attach the AWS managed policy AWSRDSFullAccess. The role ARN will be arn:aws:iam::999999789012:role/DBAdminRole.

The key is that the created roles must have trusted access to the account that will be generating the assume role credentials.

Create An AWS Policy to Assume the Created Roles

Create a policy with sts:AssumeRole API access to the ARNs for the assumed roles created in the previous step. This is done in the account that was granted the trust to assume any of the roles you created.

In our example this was account 123456789012. So in account 123456789012 you would create a policy - we'll call it assumeSSOpolicy:

 {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:assumeRole",
"Resource": [
"arn:aws:iam::123456789012:role/MyAdminRole",
"arn:aws:iam::123456789012:role/ReadOnlyRole",
"arn:aws:iam::999999789012:role/DBAdminRole",
]
}
]
}

Create a User or Role with this Policy

Apply the policy in one of two ways:

  • Attach the policy to an EC2 IAM Role and attach to the EC2 instance AWScons is hosted.
  • Attach the policy directly to an IAM user account.

For EC2:

  • In IAM create a new role, for EC2, and attach the policy (assumeSSOpolicy in our example) to this role.
  • Attache this role to the EC2 instance the code will be running on.

For IAM user:

  • Create an IAM user (say AWSconSSO) with only API keys and save the keys
  • Apply the policy (assumeSSOpolicy in our example) to this user
  • On the hosting sever create a credentials file containing the API keys
  • Use the config options aws_credentials_file and aws_profile in the aws_config stanza of config.py

The EC2 Role is the preferred method when AWScons is hosted in AWS; the IAM User account is required if AWScons is not being hosted in AWS, or hosted with outher API applications.

Create the config.py Configuration File

An example file is provided config.py.sample'. You can use this file as a framework to create a config.py file that will be located in the same directory as the AWScons` app.py file.

There are three sections in the config.py file:

  • session_config - user session configuration
  • saml_config - SAML SP configuration
  • aws_config - maps url path to specific roles to assume

Configure session_config stanza

  • This can be a simple null configuration in many cases:
session_config = {}
  • For higher use environments you will want persistent caching. Consult BottleSessions documentation for more detail.
  • With a low-volume of requests the memory-based SimpleCache is adequate
  • With a higher-volume of requests FileCache is simple enough with only a path to a cache directory specified

Configure saml_config stanza

  • Configuring the SAML Service Provider (SP) is beyond the scope of this document. Refer to BottleSaml documentation for more detail.
  • The name_id configured should be something useful (username or email), as it will be included in console and also in CloudTrail logging.
  • If groups will be used for authorization, these should be provided as IdP assertions, and listed in the assertions configuration list so they will be kept as session attributes.

Configure aws_config

  • This provides configuation options and url path to role mapping

Application Configuration Settings

These options are for the full AWScons instance.

parametertypedefaultdescription
url_prefixString""Prefix for target URLS (defaults to no URL prefix)
aws_profile_nameStringNoneFor IAM user creds - sets AWS_PROFILE
aws_credentials_fileStringNoneFor IAM user creds - sets AWS_SHARED_CREDENTIALS_FILE
targetsListNonePython Dict containing specific target entries
  • One or more targets can be included in the AWScons instance. Only the targets list is required.

Target Specific Configuration Settings

A target configuration item contains specific information for a given service.

parametertypedefaultdescription
serviceStringNone (required)Name of service target used as URL path
durationInteger3600Duration (Seconds) credentials for assumed role are valid
roleStringNone (required)ARN of role assumed for this URL path
groups[String,..][]User must have membership in one or more of these groups
  • duration can not exceed the maximum duration associated with the specified IAM role
  • groups is a list of groups restricting access to this role
  • The specific service is invoked when the final component of the url path matches the service name. i.e. https://www.example.com/aws/myadmin' matches the service target with the name 'myadmin' (but only when the instance has the url_prefix of '/aws')

Example 1: A Basic aws_config Stanza:

aws_config= {
"targets" : [{
"service": "awsadm", "role": "arn:aws:iam::123456789012:role/MyAdminRole",
} ]
}

Accessing https://www.example.com/awsadm will launch an AWS console to any authenticated user. The console will have access of the MyAdminRole role in account 123456789012. The console and credentials will be valid for 1 hour.

Example 2: A More Complex aws_config Stanza:

aws_config= {
"url_prefix": "/aws", # Base for URL"aws_profile_name" : "cons", # Profile name "aws_credentials_file" : "/usr/local/.aws/credentials", # Credentials file "targets" : [
{
"service": "cloudadmin", # /aws/cloudadmin"role": "arn:aws:iam::123456789012:role/MyAdminRole",
"duration": 28800,
"groups" : ["sysadmin", "cloudadmin"]
},
{
"service": "sandbox", # /aws/sandbox"role": "arn:aws:iam::999999789012:role/DBAdmin",
"duration": 28800,
"groups" : ["dbs"]
} ]
}

This config uses API credentials with the specified credentials file and profile name; all target URLs are prefixed with /aws.

Accessing https://www.example.com/aws/cloudadmin, an authenticated user must be a member of either sysadmin or cloudadmin groups. The user will be provided a console with the privileges of MyAdminRole that will be valid for 8 hours. The account accessed will be 123456789012.

With https://www.example.com/aws/sandbox, the authenticated user must be a member of the group `dba'. The privileges will be thoses of DBAdmin, and provides access to the AWS account with the id of 999999789012.

Evaluation and Generation of Console URL

  • The specific target is evaluated when a GET request is made to the URL path matching the form /<url_prefix>/
  • If a match is not found the request failes with an HTML 401 Unknown error.
  • The user is authenticated via SAML, with the IdP provided assertions added to user session as attributes for authorization. This includes 'groups' list.
  • The user is authorized if:
  • The user is a member of at least one group specified in the groups of the target configuration.
  • If no groups are listed in the target config, the user is not rejected.
  • Failing to meet this, the request fails with an HTML 403 Unauthorized error
  • AWScons acquires temporary credentials for role specified in the target config using the AWS sts:AssumeRole API
  • AWScons then calls AWS sts to generate a console login token
  • The login token is formed to a logon URL
  • The login URL is returned as an HTML 301 redirect

About

AWScon provides Single Sign On (SSO) users with AWS console access restricted by AWS IAM roles.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages