AWS IAMのIdentity Federationを使うIdentity Broker(C#編)
本記事は下記Java版のIdentity Broker記事のC#版です。
・Identity Federationを使うIdentity BrokerをJavaで書いてみた
https://dev.classmethod.jp/cloud/identity-federation-identity-broker-java/
IAMのID統合(Identity Federation)機能(復習)
AWSのIAMにはID統合機能が用意されています。これは特定のID管理サービス(LDAP、Active Directory、Webアプリケーションのユーザー管理機能等)で管理されるユーザーとIAMユーザーを関連付けることにより、ユーザー個別の一時証明書を発行し、それを利用してAmazon S3やAmazon DynamoDBなどのAWSリソースにアクセスできるようにする機能です。
ID統合のイメージは下記のようになります:
AWSとAndroid、AWSとiOSを連携する際のIdentity Federationに関する記事は下記をご参照下さい。
・クラウド「AWS」とAndroidを直結するSDKで何ができるのか?(1/3) - @IT
http://www.atmarkit.co.jp/fsmart/articles/smaphocloud02/01.html
・クラウドストレージ「Amazon S3」とiPhone/iPadを直結するSDKとは(1/3) - @IT
http://www.atmarkit.co.jp/fsmart/articles/smaphocloud03/01.html
・@ITスマホ×クラウド連載 第2回 AWS×Android:補足記事(2)Token Vending MachineとSecurity Token Service
https://dev.classmethod.jp/cloud/atmarkit_smartphone_cloud_02_supplement_02/
Identity BrokerをC#で書いてみる
今回はC#でIdentity Brokerを書いてみたいと思います。本記事で作成する範囲は下記になります。
(Amazon S3へのC#によるファイルアップロードに関しては続きとなるこちらの記事をご確認下さい)
Visual StudioにAWS Toolkit for Microsoft Visual Studioがインストールされている方はAWS Console Projectを作成して下さい。そうでない方は、まず下記の記事を参考に環境構築を行なって下さい。
・AWS Toolkit for Microsoft Visual Studioをインストールしてみる
https://dev.classmethod.jp/cloud/aws-toolkit-for-visual-studio/
アプリケーションとしては図で奥の方にあるコンポーネント(ADServiceMock.cs)から作成していきます。
ADMockService.cs
Accountエンティティを作成します。
class Account { public String Id { get; set; } public String Name { get; set; } public String Email { get; set; } }
次にAccountを管理するADMockServiceを作成します。user1という名前ならばAccountインスタンスを返します。違うならばnullを返します。
class ADServiceMock { public Account login(String name, String pass) { Account returnValue = null; if ("user1".Equals(name)) { Account account = new Account(); account.Id = "00001"; account.Name = name; account.Email = "a@b.com"; returnValue = account; } return returnValue; } }
IdentityBroker.cs
次にIdentityBrokerを作成します。具体的には以下の処理を行います。
- ユーザー名とパスワードが渡される
- ADMockServiceに問い合わせを行う
- OKであれば指定したポリシーの一時証明書をAWS Security Token Serviceから取得する
- 一時証明書を返す
class IdentityBroker { private const int DURATION = 3600; public static Credentials getToken(String name, String pass) { // check account var activeDirectory = new ADServiceMock(); var account = activeDirectory.login(name, pass); if (account == null) { return null; } var stsClient = new AmazonSecurityTokenServiceClient(); String policy = File.ReadAllText("Policy.txt"); GetFederationTokenRequest request = new GetFederationTokenRequest(); request.WithDurationSeconds(DURATION).WithPolicy(policy).WithName(name); var result = stsClient.GetFederationToken(request); var credentials = result.GetFederationTokenResult.Credentials; return credentials; } }
ここで利用しているポリシーファイルは下記のようになります。
{ "Statement":[ { "Effect":"Allow", "Action": [ "s3:ListBucket", "s3:PutObject*" ], "Resource":"arn:aws:s3:::mybucketname" }, { "Effect":"Allow", "Action": [ "s3:GetObject*" ], "Resource":"arn:aws:s3:::mybucketname/*" } ] }
ポリシーファイルではS3でのバケット一覧の取得とオブジェクトのPUT、及びオブジェクトのGETを許可しています。
Program.cs
今回のサンプルのビジネスアプリケーションに相当する部分です。ユーザー名とパスワードがプログラムに渡されると、一時証明書が返されます。今回は一時証明書の取得までを行い、実際にその一時証明書の中身を確認してみたいと思います。
public static void Main(string[] args) { Console.Write(GetServiceOutput(args)); Console.Read(); }
public static string GetServiceOutput(string[] args) { StringBuilder sb = new StringBuilder(1024); using (StringWriter sr = new StringWriter(sb)) { if (args.Length < 2) { sr.WriteLine("Usage: IdentityBrokerSample name password"); return sb.ToString(); } var credentials = IdentityBroker.getToken(args[0], args[1]); if (credentials == null) { sr.WriteLine("Authentication Failure."); return sb.ToString(); } } } [/csharp]
それではアプリケーションを実行しましょう。デバッグの開始オプションでuser1 passwordを指定すると正しく動作します。
var credentialsが定義されている行にブレークポイント置いてCredentialsオブジェクトの中身をみてみると下記のようになります:
お馴染みのアクセスキー(AccessKeyId)、シークレットアクセスキー(SecretAccessKey)が取得できていることがわかります。また、これらとは別にSessionTokenが取得されており、また、Expirationが設定されています。ここではExpiration = "2013/02/15 17:24:20"となっています。16時24分にアプリケーションを実行したので、一時証明書はデフォルトでは1時間有効であることがわかります。SessionTokenは一時証明書を用いてAWSのサービスAPIにアクセスする際に必須となる要素です。Credentialsクラスの仕様は下記になります。
・Credentials Class
http://docs.aws.amazon.com/sdkfornet/latest/apidocs/html/T_Amazon_SecurityToken_Model_Credentials.htm
まとめ
今回はAWS Security Tokenサービスから一時証明書を取得するプログラムをC#で記述してみました。一時証明書が取得出来ましたので、あとはこの証明書を利用してS3やEC2などにアクセスすることができます。また、今回ID管理サービスはモックでしたが、Active Directoryと連携するプログラムを書いても面白いでしょう(下記がAWS提供のサンプルです)
・Identity federation sample application for an Active Directory use case
http://aws.amazon.com/code/1288653099190193