話題の記事

IAMによるAWS権限管理運用ベストプラクティス (1)

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

よく訓練されたアップル信者、都元です。AWSにはIAMという権限管理のサービスがあります。AWSを専門としている我々にとっては当たり前の知識なのですが、皆さんはこの機能を上手く使えているでしょうか。

AWSにおけるクレデンシャルとプリンシパル

まず、AWSにおけるクレデンシャルは大きく2種類 *1に分かれます。

  • Sign-In Credential:Management Consoleログインのためのクレデンシャル(要するにパスワード)
  • Access Credentials:APIアクセスのためのクレデンシャル(要するにAPIキー)

また、プリンシパル(ログインする主体、ユーザ名等)にも大きく2種類 *2があります。

  • AWSアカウント
  • IAMユーザ

これらの組み合わせとして「AWSアカウントのパスワード」「AWSアカウントのAPIキー」「IAMユーザのパスワード」「IAMユーザのAPIキー」という4つのクレデンシャルがあることになります。

AWSを使い始める際、サインアップの時にメールアドレスとパスワードを登録したと思います。これが「AWSアカウントのパスワード」です。また、Your Security CredentialsページのAccess Keysの項で確認できるのが「AWSアカウントのAPIキー」です。

また、IAMのManagement Consoleにおいてユーザを作成した場合、そこで設定したパスワード *3が「IAMユーザのパスワード」、そこで生成したアクセスキーが「IAMユーザのAPIキー」となります。

細かいことですが、1つのIAMユーザにつきパスワードは1つしかありませんが、APIキーは複数持つことができます。APIキーを持たない場合もあります。

さて、これらのクレデンシャルは「開発運用スタッフ」や、AWS上で稼働する「システム」が利用します。発展形としては、AWS上で稼働するサービスの「エンドユーザ」自身や「エンドユーザが持つモバイルアプリ等」が利用することもあります。が、まずは「開発運用スタッフ」にフォーカスしてみましょう。

開発運用スタッフが利用するクレデンシャル

プラクティス1 : 「AWSアカウントのパスワード」は普段使いしない

さて、AWSアカウントというのは、権限制御ができません。言い換えれば、常にそのアカウント内のリソースに対する全権を持ちます。つまり、AWSアカウントとしてAWSにログインするのは危険と考えるべきです。

これに対して、IAMユーザは設定により権限を制御可能です。たとえ管理作業を行う場合でも、別にIAMユーザを作成し、そのIAMユーザに管理権限を与えて、普段はIAMユーザを利用すべきです。

ちなみに「AWSアカウント」に出来て「管理権限を与えられたIAMユーザ」に出来ないことは主に以下の通り *4です。

  • 請求に関する操作(コンソリの手続きや、支払い情報の変更等)
  • 登録情報(名前や住所等)に関する操作
  • アカウントの解約

上記の通り、技術的な業務を行う範囲では何ら支障がないはずですので、是非IAMユーザを使うようにしましょう。AWSアカウントのパスワードによるログインは、プロジェクトの管理者(多くても2〜3名程度)が、上記のような非技術的な管理業務を行う際のみに利用する、という体制が望ましいと思っています。

プラクティス2 : 「AWSアカウントのAPIキー」は使わない

前述の通り、AWSアカウントというのは全権を持っています。そしてそのAPIキーも、もちろん全権を持ちます。しかし、このキーがどうしても必要な場面というのは、恐らくありません

このキーは、かつてIAMというプロダクトが無かった頃の遺物です。つまり、互換性のためだけに用意されている機能ですので、そもそもこのキーを発行しないのがベストです。

というわけで、プラクティス1と同様、このキーも利用しないようにしましょう。

プラクティス3 : 同じプリンシパルを複数人で共有しない

プラクティス1でIAMユーザを作成することをお勧めしましたが、これにはもうひとつメリットがあります。複数人でAWSを利用する際に、プリンシパルを共有する必要がなくなります。

AWSアカウントというプリンシパルは1つしかありませんので、IAMを使わない場合は複数人でAWSアカウント及びパスワードを共有することになります。しかし、このような運用にはいくつかの重大な問題があります。

  • 誰が権限を持っているのか把握が難しい
  • 何かトラブルが発生した際、誰が操作したのかログ等から判断できない
  • メンバーが離脱した際に、パスワードの変更を迫られる(が、めんどくさいので大抵放置される)

このような問題を回避するためにも、メンバーに対して個別のIAMユーザを作成しましょう。プラクティス1に従ってIAMユーザを作ったとしても、そのIAMユーザのパスワードを複数人で共有しないようにしましょう。同一のIAMユーザというプリンシパルを共有することになってしまいます。

ひとまずまとめ

意外と長くなりそうなので、一旦ここまでで。まとめますと以下の通りです。

  • 「AWSアカウントのパスワード」は、基本的に使わない。主に登録情報等の管理と請求関連操作にだけ使う。
  • 「AWSアカウントのAPIキー」は、使うべきではない。そもそも作成すべきでもない。
  • 「IAMユーザのパスワード」は、個人に対して割り当てるべき。
  • 「IAMユーザのAPIキー」も、個人に対して割り当てるべき。個人がawscliを等を使う時用。

以上の体制で「開発運用スタッフ」が行うAWSに対するアクションは、ほとんどがカバーできると思います。次回は、AWS上で稼働する「システム」が行うAWSに対するアクションについて、プラクティスを見て行きたいと思います。システム(=プログラム)はSign-In Credentialを使いませんので、次回はAccess Credentialsに絞った話になる見込みです。

脚注

  1. 他にも実は色々あるんですが、本稿では割愛します。
  2. 話を突き詰めていくと他にもありますが、まずは2種類で理解しましょう。
  3. 明示的に設定しなければパスワード無し、つまりManagement Consoleにはアクセスできないユーザとなります。
  4. 他にもあったら教えてくださいw