## はじめに
外部のアカウント(社内ADなど)でAWSのサービスを利用したい場合に、SAML認証を利用することがあります。
認証の仕組みは分かりにくいところもあり、チュートリアル通りに設定したら動いたけど、どういう仕組みなのかというのがつかめないと感じる場合もあると思います。
今回は、SAML認証の仕組みやどうしてその設定が必要なのかを含めて解説します。
SAML認証について
SAML認証とは、SSOの対象となるサービスの代わりにIdP(Identity Provider)が認証情報(IDやパスワード)を送って認証する仕組みです。
1度のユーザー認証で複数のシステムの利用が可能になるSSO(シングルサインオン)で利用されたります。
AWSでSAML認証を利用するシーンとしては、社内ユーザでAWSサービスを利用するというのがあります。
IdPが社内ユーザのID/パスワードを利用してADに代理認証を行い、AWS側のログインに必要な情報をAWSに渡すことで、AWSサービスを利用できます。
IdPとは
認証・認可を行うサービスです。
社内ユーザはAWSのサービスに直接ログインはできないため、IdPに間に入ってもらうイメージです。
主要なIdPとしてはGoogle Cloud Identity Services、ADFS、Microsoft Entra ID、Oktaなどがあります。
SAML認証の処理フロー
SAML認証では、以下の動きをします。
※図はS3バケット利用の例
- 端末からIdPに認証要求を行う。
- IdPはADに認証要求する。
- SAMLレスポンス(加工したユーザ情報を格納)とAWSのログインURL(AWS SSO エンドポイント)を端末に渡す。
- 端末はAWS SSO エンドポイントにSAMLレスポンスを渡す。
- (オプション)暗号化されたSALMレスポンスを復号。
- AWSから認証情報が返ってくる。
- AWSサービスを利用する。
SAMLの設定
AWSサービスでSAML認証を行うには、AWS・IdPの双方で設定を行う必要があります。
IdP側はADへの代理認証設定とSAMLレスポンスを作成する設定を行います。
SAMLレスポンスの中に、AWSでログインするための情報を追加し、AWSでログインできるようにします。
AWS側はIdPをAWSに登録し、登録したIdPでログインを許可する設定を入れます。

AWS側
IdPをAWSに登録
不正アクセスを防ぐため、登録されたIdPで認証された場合のみAWSにログインできるようにしているのではないかと思います。
IdPでSAMLを利用する設定を行うとメタデータが作成されるため、IdPから提供されたSAMLメタデータを登録します。

IAMロールを作成
外部のアカウントは何の権限も持っていないので、AWS内では何も操作できません。
また、セキュリティの観点から登録したIdPのみログインを許可する必要があります。
登録したIdPでのSAML認証許可の権限と、実際に利用するAWSサービスの利用権限をロールで付与します。
※画像はAppStreamを利用する際の例
リレーステートURLの発行
利用するAWSサービスのTOPページをリレーステートURLとして発行します。
IdPでの認証後、AWSにログインしたら自動でAWSサービスに遷移します。
SAMLレスポンスの中にリレーステートURLを含ませることで、自動でAWSサービスのTOPページまで遷移することが可能になります。
リレーステートとして設定するURLはサービスごとに異なるので、AWSドキュメントで確認してみてください。
IdP側
IdPによって設定項目は様々です。
下に記載する設定項目以外もある場合もあるかもしれませんが、大きくは変わらないはずです。
仕組みや設定項目を把握することで、始めて利用するIdPで設定内容がわからないという場合でも、多分この値を入れればいけるんじゃないか?と推測がつくようになります。
AWSの登録
IdPにも、サービスプロバイダーとしてAWSを登録します。
AWSメタデータを用意しているため、IdPにファイルを渡して登録してもらいます。
以下にアクセスするとファイルを取得できますが、他のリージョンのファイルが欲しい場合はリージョンコードを変えてください。
https://ap-northeast-1.signin.aws.amazon.com/static/saml-metadata.xml ※東京リージョンのSAMLメタデータ
リレーステートURLの登録
AWSで発行したリレーステートURLを登録してもらいます。
SAMLレスポンスの設定
AWSサービスによって異なるのですが、AWS側が必要とする情報(アサーション)をSAMLレスポンスに追加する設定をします。
おおよそ必要になるアサーションは3つです。
オプションでさらにアサーションが追加になる場合があります。
- セッションID
- アカウントID
- ロール情報(AWSで作成したロール)
アサーションは以下のような形でAWSに渡します。
以下はセッションIDの例です。
<Attribute Name="https://aws.amazon.com/SAML/Attributes/RoleSessionName"> <AttributeValue>user-id-name</AttributeValue> </Attribute>
基本的にはADに登録されたユーザ情報を取得して、上記のアサーションに加工します。
もっと詳細に述べると、ADから取得した情報をIdPのDB(中間DBのような位置づけ)に登録し、IdPのDBの情報をアサーションに加工します。

- 属性名:IdPのDBのどの属性のデータを使用するか
- 項目名:アサーションの項目(Attribute Nameで設定するURL)
- 値:アサーションの値(AttributeValueで設定するデータ。ADに登録してもらう)
おわりに
今回はSAML認証の仕組みと設定について解説しました。
長くなりましたが、設定する際の助けになれば幸いです。