プログラマでありたい

おっさんになっても、プログラマでありつづけたい

AWS Management Consoleのアクセスログを取る。その1 IAMによるIP制限


 3/9に行われた春のJAWS-UG 三都物語の資料が続々と公開されています。どれも面白いですが、cloudpackさんの"JAWS-UG三都物語 2013 春 よりセキュアなAWS環境 構築事例 〜PCI DSS対応〜"の事例が中々興味深かったです。
 その中の1つに、AWS Management Consoleのログを取るというのがあります。割と実現して欲しいと要望の多い機能ではありますが、2013年3月現在のAWSのデフォルトの機能ではありません。この機能が何故必要かと言いますと、エンタープライズ向けで使うためには必要要件として定義されていることが多いからです。今回の例でもPCI DSS対応の為にも、必須とあるようです。


 デフォルトの機能でないとすれば、どうすれば良いのか?1つはAPIを使って独自に作るという方法です。AWSのサービスは全てAPIが用意されています。つまり画面で出来ることは、全てAPIから出来るということです。であれば、そのAPIを使えば独自でGUIのインターフェースも作れるということです。
 もう1つのアプローチが、今回のcloudpackさんのアプローチです。IAMの機能を使ってAWS Management ConsoleにアクセスするIP制限を行い、アクセス元のIPを特定のサーバからのみ許可して、そのサーバへのアクセスログを全て取るという方式です。いわゆるリバースプロキシタイプです。
 前者はサーバーワークスさんが独自サービスとして展開し、後者はcloudpackさんが事例として紹介しています。中々興味深いです。前者のメリットは、AWS Management Consoleの機能外の部分も、独自のサービスとして組み込めることです。反面、Amazonのサービスの開発のスピードについていかないといけないので、ちょっと大変です。後者はお手軽簡単なので、要望があればサクッと実現出来るのではと思います。


 と言う事で、私も試してみることにしました。長くなりそうなので、IAMのIPアドレス制限とリバースプロキシの設定の2つにわけます。今回はIAMのIPアドレス制限です。

IAMユーザの作成



 マスターアカウントか、IAMの各種権限も持ったユーザアカウントでログインします。そして、ユーザを作成し、Sign-In Credentialsでパスワードを付与します。今回は、LimitedManagementConsoleAccessというユーザ名で作成しています。

パーミッション無しでログイン



 この時点では、Permissionsには何も与えません。その後、ログアウトして再度IAMユーザ用のログインURLから、先ほど作成したIAMユーザでログインします。適当にサービスを選ぶと、次のように権限がありませんという画面が出るはずです。

IPアドレス制限付きのパーミッション設定



 次に、またIAMのアカウントの編集権限のあるアカウントでログインします。そしてIAMで該当ユーザにPermissionsのAttache User Policyで権限を与えます。Policy Generatorで、権限を与えたいServiceとResource Nameを選びます。その後がポイントなのですが、Add Conditions (Optional)で、ConditionをIPAddressでKeyをaws:SourceIpを選びます。Valueの部分を自分の外向きのグローバルIPアドレスを指定します。これでおっけいです。



出来たパーミッションは、こんな感じになるはずです。(51.44.71.80/32から、EC2に対するフルアクセス)

{
  "Statement": [
    {
      "Sid": "Stmt1363006771539",
      "Action": [
        "ec2:*"
      ],
      "Effect": "Allow",
      "Resource": [
        "*"
      ],
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": "51.44.71.80/32"
        }
      }
    }
  ]
}


 確認の為、IAMアカウントでログインして、設定したサービスが使えるかを確認しましょう。指定したIPアドレスからは無事に使えるはずです。また、それ以外のIPアドレスからは、依然権限がないというメッセージがでるはずです。

マスターアカウントの制限について



 今の設定は、IAMアカウントについてのIPアドレスについての制限です。では、マスターアカウントについては、どう制限するのでしょうか?実は、この方法では制限できません。では、どうしたら良いのでしょうか?1つの解は、AWS Multi-Factor Authentication などを使ってマスターアカウントをパスワードのみの認証ではアクセス出来ないようにすれば良いのではないでしょうか?そして、認証デバイスの貸出管理をすると言った方法が考えられます。私個人的としては、マスターアカウントはIAMアカウントを作ったら極力使わないように運用設計するのが安全ではないかと考えています。

まとめ



 IAMユーザに対するIPアドレス制限は簡単に出来ました。次回はApachもしくはNginxを使ったリバースプロキシサーバの構築を書いて、完成させたいと思います。


 なお余談ですが、今回はIAMユーザに付与する権限等については特に言及していませんが、ここを極めると安全な運用設計が出来ます。例えば多い事故として、インスタンスをStopするつもりが間違えてTerminateしてしまったとか。人間は必ずミスを起こします。ですので、普段の運用で使うアカウントにはTerminate権限を与えずStopだけ付与するといったことで、事故を未然に防ぐことが出来ます。


参照:
JAWS-UG三都物語 2013 春 よりセキュアなAWS環境 構築事例 〜PCI DSS対応〜
当日セッションスライド資料を公開します! | 春のJAWS-UG 三都物語 2013