From 5431b20714bc315ee7bf5bd005780cdd9a1ec29b Mon Sep 17 00:00:00 2001 From: Rucha Deshpande <deshruch@amazon.com> Date: Thu, 19 Nov 2020 20:35:16 +0000 Subject: [PATCH] Implement service-to-service auth using client_credentials flow commit 7f46cdb0 Author: Rucha Deshpande <deshruch@amazon.com> Date: Thu Nov 19 2020 14:09:50 GMT-0600 (Central Standard Time) Remove debug stms commit df633a65 Author: Rucha Deshpande <deshruch@amazon.com> Date: Thu Nov 19 2020 13:18:00 GMT-0600 (Central Standard Time) Remove debug stmt commit f110b5e0 Author: Rucha Deshpande <deshruch@amazon.com> Date: Wed Nov 18 2020 14:42:07 GMT-0600 (Central Standard Time) Merge remote-tracking branch 'remotes/origin/dev' into deshruch commit d9b0d6bf Author: Rucha Deshpande <deshruch@amazon.com> Date: Wed Nov 18 2020 14:41:11 GMT-0600 (Central Standard Time) update os-core-lib-ws release version commit 179bc904 Author: Rucha Deshpande <deshruch@amazon.com> Date: Tue Nov 17 2020 17:13:46 GMT-0600 (Central Standard Time) update core-lib version commit 6d2326de Author: Rucha Deshpande <deshruch@amazon.com> Date: Tue Nov 17 2020 16:49:13 GMT-0600 (Central Standard Time) update core-lib version commit 138ec563 Author: Rucha Deshpande <deshruch@amazon.com> Date: Tue Nov 17 2020 15:48:18 GMT-0600 (Central Standard Time) add debug stsms commit d561a222 Author: Rucha Deshpande <deshruch@amazon.com> Date: Tue Nov 17 2020 15:44:53 GMT-0600 (Central Standard Time) Update os-core-lib-aws version commit ab4445a8 Author: Rucha Deshpande <deshruch@amazon.com> Date: Tue Nov 17 2020 12:51:21 GMT-0600 (Central Standard Time) Use ServicePrincipal implementation from os-core-lib-aws commit 4e382145 Author: Rucha Deshpande <deshruch@amazon.com> Date: Tue Nov 17 2020 12:44:58 GMT-0600 (Central Standard Time) Use release version of os-core-lib-aws commit 755d743d Author: Rucha Deshpande <deshruch@amazon.com> Date: Tue Nov 17 2020 11:23:41 GMT-0600 (Central Standard Time) Move ServicePrincipal code to os-core-lib-aws commit ee6cb3a7 Author: Rucha Deshpande <deshruch@amazon.com> Date: Mon Nov 16 2020 17:08:01 GMT-0600 (Central Standard Time) Remove debug stmts commit 4ad50766 Author: Rucha Deshpande <deshruch@amazon.com> Date: Mon Nov 16 2020 12:26:29 GMT-0600 (Central Standard Time) oauth client credentials commit 87ef11e7 Author: Rucha Deshpande <deshruch@amazon.com> Date: Mon Nov 16 2020 11:19:55 GMT-0600 (Central Standard Time) update core -lib and add debug stsms commit d34e4028 Author: Rucha Deshpande <deshruch@amazon.com> Date: Fri Nov 13 2020 16:53:03 GMT-0600 (Central Standard Time) update core-lib version commit 8360d0d5 Author: Rucha Deshpande <deshruch@amazon.com> Date: Fri Nov 13 2020 15:48:08 GMT-0600 (Central Standard Time) using test os-ore-lib commit 9fbb6227 Author: Rucha Deshpande <deshruch@amazon.com> Date: Fri Nov 13 2020 10:58:03 GMT-0600 (Central Standard Time) Bug fix: add custom scope as env. var commit 71e207d5 Author: Rucha Deshpande <deshruch@amazon.com> Date: Thu Nov 12 2020 16:07:30 GMT-0600 (Central Standard Time) Bug Fix: Update SSM parameter retrieval commit d9459e9e Author: Rucha Deshpande <deshruch@amazon.com> Date: Thu Nov 12 2020 15:55:32 GMT-0600 (Central Standard Time) Use client credetials flow to get access token --- provider/notification-aws/pom.xml | 2 +- .../impl/ServiceAccountJwtAwsClientImpl.java | 171 ++++-------------- .../src/main/resources/application.properties | 3 +- testing/notification-test-aws/pom.xml | 3 +- 4 files changed, 39 insertions(+), 140 deletions(-) diff --git a/provider/notification-aws/pom.xml b/provider/notification-aws/pom.xml index 85ddaf9fc..19bd5d784 100644 --- a/provider/notification-aws/pom.xml +++ b/provider/notification-aws/pom.xml @@ -50,7 +50,7 @@ <dependency> <groupId>org.opengroup.osdu.core.aws</groupId> <artifactId>os-core-lib-aws</artifactId> - <version>0.3.11</version> + <version>0.3.13</version> </dependency> <!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-secretsmanager --> diff --git a/provider/notification-aws/src/main/java/org/opengroup/osdu/notification/provider/aws/impl/ServiceAccountJwtAwsClientImpl.java b/provider/notification-aws/src/main/java/org/opengroup/osdu/notification/provider/aws/impl/ServiceAccountJwtAwsClientImpl.java index dcfbf42aa..02e2b91e7 100644 --- a/provider/notification-aws/src/main/java/org/opengroup/osdu/notification/provider/aws/impl/ServiceAccountJwtAwsClientImpl.java +++ b/provider/notification-aws/src/main/java/org/opengroup/osdu/notification/provider/aws/impl/ServiceAccountJwtAwsClientImpl.java @@ -12,36 +12,26 @@ // limitations under the License. package org.opengroup.osdu.notification.provider.aws.impl; + import com.amazonaws.auth.AWSCredentialsProvider; -import com.amazonaws.services.secretsmanager.AWSSecretsManager; -import com.amazonaws.services.secretsmanager.AWSSecretsManagerClientBuilder; -import com.amazonaws.services.secretsmanager.model.*; import com.amazonaws.services.simplesystemsmanagement.AWSSimpleSystemsManagement; import com.amazonaws.services.simplesystemsmanagement.AWSSimpleSystemsManagementClientBuilder; -import com.amazonaws.services.simplesystemsmanagement.model.*; -import com.fasterxml.jackson.core.JsonParseException; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.amazonaws.services.simplesystemsmanagement.model.GetParameterRequest; +import com.amazonaws.services.simplesystemsmanagement.model.GetParameterResult; +import com.amazonaws.services.simplesystemsmanagement.model.Parameter; import lombok.AccessLevel; import lombok.Getter; import lombok.Setter; +import org.opengroup.osdu.core.aws.entitlements.ServicePrincipal; import org.opengroup.osdu.core.aws.iam.IAMConfig; -import org.opengroup.osdu.core.common.logging.JaxRsDpsLog; +import org.opengroup.osdu.core.aws.secrets.SecretsManager; import org.opengroup.osdu.core.common.util.IServiceAccountJwtClient; -import org.opengroup.osdu.notification.provider.aws.utils.AwsCognitoClient; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; -import java.io.IOException; - -import java.util.ArrayList; - -import java.util.List; -import java.util.Map; @Component public class ServiceAccountJwtAwsClientImpl implements IServiceAccountJwtClient { @@ -66,14 +56,20 @@ public class ServiceAccountJwtAwsClientImpl implements IServiceAccountJwtClient public String environment; - @Autowired - private JaxRsDpsLog log; + @Value("${aws.tokenUrl}") + @Getter() + public String tokenUrl; + + @Value("${aws.oauth.custom.scope}") + @Getter() + private String awsOauthCustomScope; + + + + String client_credentials_secret; + String client_credentials_clientid; + ServicePrincipal sp; - String password; - String clientid; - String userpoolid; - String serviceprincipaluser; - AwsCognitoClient cognitoClient; private AWSCredentialsProvider amazonAWSCredentials; private AWSSimpleSystemsManagement ssmManager; @@ -81,132 +77,35 @@ public class ServiceAccountJwtAwsClientImpl implements IServiceAccountJwtClient @PostConstruct public void init() { if (ssmEnabled) { - String secretKey = "service_principal_password"; - String secretName = "/osdu/" + environment + "/service_principal_password"; - String cognito_user_pool_id = "/osdu/" + environment + "/cognito-user-pool-id"; - String cognito_client_id = "/osdu/" + environment + "/cognito-client-id"; - String service_principal = "/osdu/" + environment + "/service-principal-user"; + + SecretsManager sm = new SecretsManager(); + sp = new ServicePrincipal(amazonRegion,environment,tokenUrl,awsOauthCustomScope); + + String client_credentials_client_id = "/osdu/" + environment + "/client-credentials-client-id"; + String client_secret_key = "client_credentials_client_secret"; + String client_secret_secretName = "/osdu/" + environment + "/client_credentials_secret"; + amazonAWSCredentials = IAMConfig.amazonAWSCredentials(); ssmManager = AWSSimpleSystemsManagementClientBuilder.standard() .withCredentials(amazonAWSCredentials) .withRegion(amazonRegion) .build(); - GetParametersRequest paramRequest = new GetParametersRequest() - .withNames(cognito_user_pool_id,cognito_client_id,service_principal) + GetParameterRequest paramRequest = new GetParameterRequest() + .withName(client_credentials_client_id) .withWithDecryption(true); - GetParametersResult paramResult = new GetParametersResult(); - paramResult = ssmManager.getParameters(paramRequest); - List<Parameter> paramsResultList = new ArrayList<>(); - List<String> paramsResultListInvalid = new ArrayList<>(); - paramsResultList = paramResult.getParameters(); - paramsResultListInvalid = paramResult.getInvalidParameters(); - - if(paramsResultListInvalid.size() >0) - { - log.error("SSM did not retrieve all parameters"); - } - for (Parameter s : paramsResultList) { - if (s.getName().equalsIgnoreCase(cognito_user_pool_id)) { - userpoolid = s.getValue(); - } - if (s.getName().equalsIgnoreCase(cognito_client_id)) { - clientid = s.getValue(); - } - if (s.getName().equalsIgnoreCase(service_principal)) { - serviceprincipaluser = s.getValue(); - } - - } - - password = getSecret(secretName,amazonRegion,secretKey); - cognitoClient = new AwsCognitoClient(amazonRegion,clientid,"USER_PASSWORD_AUTH", serviceprincipaluser,password); - cognitoClient.setPassword(serviceprincipaluser,password,userpoolid); + GetParameterResult paramResult = ssmManager.getParameter(paramRequest); + Parameter paramsResult = paramResult.getParameter(); + client_credentials_clientid = paramsResult.getValue(); + client_credentials_secret = sm.getSecret(client_secret_secretName,amazonRegion,client_secret_key); + } } @Override public String getIdToken(String s) { - - String token= getServicePrincipalCredentials(); + String token= sp.getServicePrincipalAccessToken(client_credentials_clientid,client_credentials_secret); return token; - - } - - public String getServicePrincipalCredentials() - { - - String token = cognitoClient.getToken(serviceprincipaluser,password,"bearer"); - return token; - - } - - public String getSecret(String secretName, String region,String secretKey) { - - -String secretVaue=""; - // Create a Secrets Manager client - AWSSecretsManager client = AWSSecretsManagerClientBuilder.standard() - .withRegion(region) - .build(); - - String secret="", decodedBinarySecret=""; - GetSecretValueRequest getSecretValueRequest = new GetSecretValueRequest() - .withSecretId(secretName); - GetSecretValueResult getSecretValueResult = null; - - try { - getSecretValueResult = client.getSecretValue(getSecretValueRequest); - } catch (DecryptionFailureException e) { - // Secrets Manager can't decrypt the protected secret text using the provided KMS key. - // Deal with the exception here, and/or rethrow at your discretion. - log.error("Error while setting up ServicePrincipalAccount"+e.getMessage()); - throw e; - } catch (InternalServiceErrorException e) { - // An error occurred on the server side. - // Deal with the exception here, and/or rethrow at your discretion. - log.error("Error while setting up ServicePrincipalAccount"+e.getMessage()); - throw e; - } catch (InvalidParameterException e) { - // You provided an invalid value for a parameter. - // Deal with the exception here, and/or rethrow at your discretion. - log.error("Error while setting up ServicePrincipalAccount"+e.getMessage()); - throw e; - } catch (InvalidRequestException e) { - // You provided a parameter value that is not valid for the current state of the resource. - // Deal with the exception here, and/or rethrow at your discretion. - log.error("Error while setting up ServicePrincipalAccount"+e.getMessage()); - throw e; - } catch (ResourceNotFoundException e) { - // We can't find the resource that you asked for. - // Deal with the exception here, and/or rethrow at your discretion. - log.error("Error while setting up ServicePrincipalAccount"+e.getMessage()); - throw e; - } - - // Decrypts secret using the associated KMS CMK. - // Depending on whether the secret is a string or binary, one of these fields will be populated. - if (getSecretValueResult.getSecretString() != null) { - secret = getSecretValueResult.getSecretString(); - Map<String, String> secretMap=null; - - try - { - secretMap = new ObjectMapper().readValue(secret.getBytes(), Map.class); - - } catch (JsonParseException e) { - log.error(e.getMessage()); - } catch (JsonMappingException e) { - log.error(e.getMessage()); - } catch (IOException e) { - log.error(e.getMessage()); - } - - secretVaue = secretMap.get(secretKey); - } - - - return secretVaue; } diff --git a/provider/notification-aws/src/main/resources/application.properties b/provider/notification-aws/src/main/resources/application.properties index 6412b3546..cfccbdec8 100644 --- a/provider/notification-aws/src/main/resources/application.properties +++ b/provider/notification-aws/src/main/resources/application.properties @@ -28,7 +28,8 @@ aws.region=${AWS_REGION} aws.dynamodb.table.prefix=${RESOURCE_PREFIX}- aws.dynamodb.endpoint=dynamodb.${AWS_REGION}.amazonaws.com - +aws.tokenUrl=${OAUTH_TOKEN_URL} +aws.oauth.custom.scope=${OAUTH_CUSTOM_SCOPE} app.expireTime=300 app.maxCacheSize=10 diff --git a/testing/notification-test-aws/pom.xml b/testing/notification-test-aws/pom.xml index fa94003e2..806791ec1 100644 --- a/testing/notification-test-aws/pom.xml +++ b/testing/notification-test-aws/pom.xml @@ -38,14 +38,13 @@ <java.version>8</java.version> <maven.compiler.target>${java.version}</maven.compiler.target> <maven.compiler.source>${java.version}</maven.compiler.source> - <os-core-lib-aws.version>0.3.11</os-core-lib-aws.version> </properties> <dependencies> <dependency> <groupId>org.opengroup.osdu.core.aws</groupId> <artifactId>os-core-lib-aws</artifactId> - <version>0.3.11</version> + <version>0.3.13</version> </dependency> <dependency> <groupId>com.amazonaws</groupId> -- GitLab