Hjem  >  Maskinporten

Skyporten med AWS - Maskinporten for deling av skyressurser

Oppskrift for å benytte Skyporten med AWS

For deg som skal tilby via AWS (Amazon Web Services)

Oppsett

Prosjektet krever at man har et ekte Maskinporten-token mot det rette miljøet. Her er informasjon om hvordan du kommer i gang med Maskinporten.

Du må også ha en AWS konto, og aws CLI-verktøy installert.

AWS med Maskinporten som OIDC provider

På AWS er det OIDC identity providers som brukes for Skyporten sin OIDC-integrasjon.

Nå følger en oppskrift på hvordan du kan gjøre det. Ta kontakt med oss om du vil ha hjelp til å sette i gang.

Sett opp AWS på kommandolinjen

Sett opp AWS CLI. Du må også definere et AWS profilnavn, f.eks. ‘skyportenprofil’.

Definer AWS og Maskinporten variabler

# Definer din default AWS region
export AWS_DEFAULT_REGION=eu-west-1
# Velg profil, må være definert i ~/.aws/config eller lignende
export AWSPROFILENAME=skyportenprofil
# Finn id for AWS-kontoen din og eksporter den
export AWS_ACCOUNT=1234567890123
# Velg s3 bøttenavn
export BUCKET_NAME=skyporten-test-bucket
# Maskinporten sitt test miljø
export MASKINPORTEN_URL=test.sky.maskinporten.no
# Må matche audience i token som genereres av maskinporten
export AUDIENCE=https://skyporten.<mydomain>
# Org id for organisasjonen som skal få tilgang til data
export CONSUMER_ORGID="0192:123456789"
# Maskinporten scopet som gir tilgang
export MASKINPORTEN_SCOPE="entur:skyporten.demo"
# Navn på AWS rolle som skal opprettes
export AWS_ROLENAME="skyporten-role"
# Navn på AWS policy som skal opprettes
export AWS_POLICYNAME="skyporten-s3-policy"

Lag OIDC provider json

Slett provider hvis den allerede finnes:

aws iam --profile $AWSPROFILENAME delete-open-id-connect-provider --open-id-connect-provider-arn "arn:aws:iam::$AWS_ACCOUNT:oidc-provider/$MASKINPORTENURL"

Obtain the thumbprint of the openid-configuration

We follow this guide from AWS

Open https://test.sky.maskinporten.no/.well-known/openid-configuration in a browser.

{
  "issuer":"https://test.sky.maskinporten.no",
  "token_endpoint":"https://test.sky.maskinporten.no/token",
  "jwks_uri":"https://test.sky.maskinporten.no/jwk",
  "token_endpoint_auth_methods_supported":["private_key_jwt"],
  "grant_types_supported":["urn:ietf:params:oauth:grant-type:jwt-bearer"],
  "token_endpoint_auth_signing_alg_values_supported":["RS256","RS384","RS512"]
}

Copy the jwks_uri.

Use the OpenSSL command line tool to run the following command:

openssl s_client -servername test.sky.maskinporten.no -showcerts -connect test.sky.maskinporten.no:443
Save the last certificate

Copy the certificate (including the —–BEGIN CERTIFICATE—– and —–END CERTIFICATE—– lines) and paste it into a text file. Then save the file with the file name certificate.crt.

Get thumbprint

Use the OpenSSL command line tool to run the following command.

openssl x509 -in certificate.crt -fingerprint -sha1 -noout

Your command window displays the certificate thumbprint, which looks similar to the following example:

SHA1 Fingerprint=99:0F:41:93:97:2F:2B:EC:F1:2D:DE:DA:52:37:F9:C9:52:F2:0D:9E

Then remove the colons:

990F4193972F2BECF12DDEDA5237F9C952F20D9E

Lag en variabel:

export THUMBPRINT=990F4193972F2BECF12DDEDA5237F9C952F20D9E

Lag json definisjon for OpenID provider:

echo "{
    \"Url\": \"https://$MASKINPORTEN_URL\",
    \"ClientIDList\": [
        \"$AUDIENCE\"
    ],
    \"ThumbprintList\": [
        \"$THUMBPRINT\"
    ],
    \"Tags\": [
        {
            \"Key\": \"skyportenpoc\",
            \"Value\": \"created from cli\"
        }
    ]
}
" > ./create-open-id-connect-provider.json

Opprett provider

Next, to create the OpenID Connect (OIDC) provider, use the create-open-id-connect-provider command again, this time passing the –cli-input-json parameter to specify your JSON file. The following create-open-id-connect-provider command uses the –cli-input-json parameter with a JSON file called create-open-id-connect-provider.json

aws iam --profile $AWSPROFILENAME create-open-id-connect-provider --cli-input-json file://create-open-id-connect-provider.json
Output:
{
    "OpenIDConnectProviderArn": "arn:aws:iam::123456789012:oidc-provider/test.sky.maskinporten.no/",
    "Tags": [
        {
            "Key": "skyportenpoc",
            "Value": "created from cli"
        }
    ]
}

Opprett en tilgangsrolle

Definisjon av rollen i filen web-identity-trust-policy.json:

echo "{
  \"Version\": \"2012-10-17\",
  \"Statement\": [
    {
      \"Effect\": \"Allow\",
      \"Principal\":{
        \"Federated\": \"arn:aws:iam::$AWS_ACCOUNT:oidc-provider/$MASKINPORTEN_URL\"
      },
      \"Action\": \"sts:AssumeRoleWithWebIdentity\",
      \"Condition\": {
        \"StringEquals\": {
            \"$MASKINPORTEN_URL:sub\": \"$CONSUMER_ORGID;$MASKINPORTEN_SCOPE\"
        }
      }
  }
  ]
}" > web-identity-trust-policy.json

Slett gammel attachment, role og policy, om nødvendig:

export POLICY_ARN="arn:aws:iam::$AWS_ACCOUNT:policy/$AWS_POLICYNAME"

aws --profile $AWSPROFILENAME iam detach-role-policy --policy-arn "$POLICY_ARN" --role-name $AWS_ROLENAME
aws --profile $AWSPROFILENAME iam delete-policy --policy-arn $POLICY_ARN
aws iam --profile $AWSPROFILENAME delete-role --role-name $AWS_ROLENAME

Rollen opprettes slik:

aws iam --profile $AWSPROFILENAME create-role --role-name skyporten-role --assume-role-policy-document file://web-identity-trust-policy.json

Expected output:

{
    "Role": {
        "Path": "/",
        "RoleName": "AWS_ROLENAME",
        "RoleId": "....",
        "Arn": "arn:aws:iam::AWS_ACCOUNT:role/AWS_ROLENAME",
        "CreateDate": "2024-09-10T11:54:11+00:00",
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Principal": {
                        "Federated": "arn:aws:iam::AWS_ACCOUNT:oidc-provider/MASKINPORTEN_URL"
                    },
                    "Action": "sts:AssumeRoleWithWebIdentity",
                    "Condition": {
                        "StringEquals": {
                            "MASKINPORTEN_URL:sub": "CONSUMER_ORGID;MASKINPORTEN_SCOPE"
                        }
                    }
                }
            ]
        }
    }
}

Opprett en s3-bøtte med en test fil

aws  --profile $AWSPROFILENAME s3api create-bucket --bucket $BUCKET_NAME --region $AWS_DEFAULT_REGION --create-bucket-configuration LocationConstraint=$AWS_DEFAULT_REGION

Push file to s3:

echo "foo" > foo.txt
aws  --profile $AWSPROFILENAME s3 cp foo.txt s3://$BUCKET_NAME/foo.txt

Gi skyporten-rollen lesetilgang til s3-bøtta

Define policy:

echo "{
    \"Version\": \"2012-10-17\",
    \"Statement\": [
        {
            \"Effect\": \"Allow\",
            \"Action\": [
                \"s3:GetObject\",
                \"s3:List*\"
            ],
            \"Resource\": [
                \"arn:aws:s3:::$BUCKET_NAME\", \"arn:aws:s3:::$BUCKET_NAME/*\"
            ]
        }
    ]
}" > s3-policy.json

Create policy:

aws --profile $AWSPROFILENAME iam create-policy --policy-name $AWS_POLICYNAME --policy-document file://s3-policy.json

Expected output:

{
    "Policy": {
        "PolicyName": "AWS_POLICYNAME",
        "PolicyId": "....",
        "Arn": "arn:aws:iam::AWS_ACCOUNT:policy/skyporten-s3-policy",
        "Path": "/",
        "DefaultVersionId": "v1",
        "AttachmentCount": 0,
        "PermissionsBoundaryUsageCount": 0,
        "IsAttachable": true,
        "CreateDate": "2024-09-11T10:45:52+00:00",
        "UpdateDate": "2024-09-11T10:45:52+00:00"
    }
}

Attach policy to role:

aws --profile $AWSPROFILENAME iam attach-role-policy \
    --policy-arn "$POLICY_ARN" \
    --role-name $AWS_ROLENAME

For deg som skal konsumere fra AWS

Oppsett

Prosjektet krever at man har et ekte Maskinporten-token mot det rette miljøet. Her er informasjon om hvordan du kommer i gang med Maskinporten.

Her er et node.js eksempel på token-generering for skyporten.

Autentisering i AWS med Maskinporten

Definer token som miljøvariabel

Her foventes det å finne maskinporten-token i full json i tmp_maskinporten_access_token.json. Dette er kan opprettes med et av disse kode-eksemplene.

export MASKINPORTEN_TOKEN=`cat tmp_maskinporten_access_token.json | jq -r .access_token`

The unpacked token will look something like this:

{
  "aud": "https://skyporten.<mydomain>",
  "sub": "0192:123456789;entur:skyporten.demo",
  "scope": "entur:skyporten.demo",
  "iss": "test.sky.maskinporten.no",
  "client_amr": "private_key_jwt",
  "token_type": "Bearer",
  "exp": 1694222211,
  "iat": 1694333311,
  "client_id": "abcd1234-1234-abcd-abcd-12341234abcd",
  "jti": "lwlwlwlw4lwlwlwlwl4lwlw4-lw-lwl4lwl4lwl4lwl4",
  "consumer": {
    "authority": "iso6523-actorid-upis",
    "ID": "0192:123456789"
  }
}

Authenticate with Maskinporten and copy s3 file

aws sts assume-role-with-web-identity --duration-seconds 900 --role-session-name $AWS_ROLENAME-session --role-arn "arn:aws:iam::$AWS_ACCOUNT:role/$AWS_ROLENAME" --web-identity-token "$MASKINPORTEN_TOKEN" --output text > sts-token.txt

read STS_ACCESS_KEY_ID STS_SECRET_ACCESS_KEY STS_SESSION_TOKEN <<< \
   $(more sts-token.txt | awk '/^CREDENTIALS/ { print $2, $4, $5 }')
AWS_ACCESS_KEY_ID=$STS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY=$STS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN=$STS_SESSION_TOKEN aws s3 cp s3://$BUCKET_NAME/foo.txt foo-remote.txt

Troubleshooting / kjente problemer

Her er noen kjente problemer man kan støte på:

Incorrect token audience

aws sts assume-role-with-web-identity --duration-seconds 900 --role-session-name $AWS_ROLENAME-session --role-arn "arn:aws:iam::$AWS_ACCOUNT:role/$AWS_ROLENAME" --web-identity-token "$MASKINPORTEN_TOKEN"

An error occurred (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: Incorrect token audience

Dette skjer fordi audience i maskinporten token ikke stemmer med verdien i ClientIDList i open id provider json-definisjon.