このエントリーは、KLab Advent Calendar 2015 の20日目の記事です。

まえおき

高田といいます。ふだんはゲームのデータなどを集計し、統一的に管理するデータ収集・分析のためのシステムを開発しています。

私のチームではインフラにはAWSを活用し、自分たちで運用しています。

その際非常にめんどうなのがセキュリティグループの管理です。セキュリティグループとは、AWS上の仮想マシンに対するトラフィックを制御する仮想ファイアウォールです。

詳しくはamazonさんの公式のドキュメントを参照してください。

私たちのチームの場合、提供するサービスは社内向けのものが多いので、例えば80ポートや443ポートは社内のIPアドレスのみに開放するといった設定を利用することが多いです。

こちらをAWSのコンソール画面で設定していくのですが、数が増えていくと、どれがどれだったかわからなくなるというパターンが増えていきます。

例えば、192.168.0.12に22ポートを開放すると設定してあったとしても、「これはどこのアドレスだったかな……? あ、大阪事業所だ」といちいち確認する手間も増えます。ひどいときは、「おそらくいらない設定だと思うけど、消して動かなくなると恐いから消さない」ということになり、どんどん誰も手がつけられない負債が増えていきます。

特に、設定をまちがえると必要なユーザーがまったくアクセスできない、あるいはデータベースへのアクセスが遮断されるなど、悲惨な障害につながりかねないため、この手の設定は恐いですね。

経験上、セキュリティグループの管理には、以下のような問題が生じやすいようです。

  1. どの設定が何のためのものかわからなくなる。
  2. 誰がいつ何のために設定したのかがわからなくなる。
  3. 設定ミスは障害につながる。いざというときには、過去の状態に戻せるようにしたい。

githubで管理する

上記の問題をふりかえると、ソースコードなどと同様に、githubのワークフローに載せてやれば、問題点はおおむね解決できそうです。

  1. どの設定が何のためのものかわからない。→ コメントをつける。記録に残す。
  2. 誰がいつ何のために設定したのかがわからない。→ 修正点を共有し、レビューできる。
  3. いざというときには、過去の状態に戻せるようにしたい。→バージョン管理。

具体的には以下のような運用になります。

  • 現状の設定にはコメントをつけ、何のための設定なのか明示化する。
  • 修正時は、プルリクエストし、修正内容をレビューしてから更新する(これによって更新履歴も残る)。
  • すべての修正はgithubに残し、何かあれば過去のバージョンに戻す。

これはよさそうですね。しかしこれを実現するためには、何とかして、セキュリティグループの設定をgithubで管理できるようにする必要があります。

管理スクリプトをつくった

上記のような管理フローを実現するため、セキュリティグループの設定をcsvで取得し、csvから反映できるスクリプトを作成しました。sgという名前です。

(名前は特に思いつかなかったので Security Group 略して sg としました)。

pypiにも登録済みです。なおpythonのバージョンは2.7.9および3.4.3でテストしました。

pip install sg

使い方: 初期化

管理用のディレクトリを作成し、そこで init コマンドを実行します。regionとawsのキーを聞かれます。

(キーはローカルに保存するだけです)。

$ cd yourpath
$ sgsg.py init
enter your region[us-east-1]:
us-west-2
save to sg.cfg
enter your aws_access_key_id:
xxx
enter your aws_secret_access_key:
xxx
save to aws_key

使い方: 保存

リモートのセキュリティグループの設定を保存するには fetch コマンドを利用します。

グループ別に設定がcsvとして保存されます。

ダウンロードされたcsvファイルにはコメントなどを追加することができます。エクセルなどで編集してください。なお、新たなリモート設定が追加された場合もfetchで取得できます。更新時もコメントなどを消すことはありません。

csvは以下のような形となります。(セキュリティグループ名).csvというファイル名で保存されます。

security_groups/somegroup.csv

tcp,80,80,192.168.0.1/32,,東京本社オフィスからのHTTP接続
tcp,22,22,192.168.0.2/32,,東京本社オフィスからのSSH接続
tcp,22,22,192.168.10.1/32,,大阪事業所からのSSH接続
tcp,22,22,othergroup,,別のセキュリティグループからのSSH接続

github上では以下のように表示されます。

csv_screen_shot

使い方: 更新

このcsvファイルにコメントをつけ、gitで管理していきます。

なお更新をAWS側に反映するには commit コマンドを使用します。

csvに追加、または削除を行なったあと、以下のコマンドを実行します。差分が表示されるので確認後yを選択してください。

sgsg.py commit security_groups/somegroup.csv
GROUP: somegroup
post this setting?[y/N]
+tcp    80      80      192.168.0.1

現状sgツールからセキュリティグループの追加や削除には対応していません。(コンソール上で追加したグループは fetch 時に反映されます)。

以上です。活用いただければありがたいです。