はじめに
自動デプロイが好きです!
いろんな案件で自動デプロイやCDの導入をオススメしています。
自動デプロイを行なうためにはデプロイ出来る権限を渡す必要があります。
例えばCircleCIにAWSのシークレットIDとキーを環境変数で渡したり、秘密鍵を使ったりなどです。
SSHと秘密鍵でやり取りする方法は最も基本的で汎用性が高いのですが、その反面チームでの鍵の管理に困ります。
すでに特定のサーバにアクセス件を持っているのか、なければ鍵をDMなどでやりとりするのか、その鍵から他のプロジェクトへのアクセス件が漏れないか…。
また案件、メンバーごとの個別に鍵を発行していると鍵の紛失、共有のためのコミュニケーションコストがかかります。
こういったセキュリティリスク軽減策と利便性はトレードオフの関係にあります。そのトレードオフの落としどろころとして良い方法を取るようにしています。
- 鍵はリポジトリで共有
- 鍵を元にデプロイできるようにする
- その鍵でできることを制限する
- (必要に応じて)鍵ごとにIPアドレス制限を行なう
鍵の共有
デプロイに必要な鍵をGitリポジトリで共有します。
こうすることでDMなどでやりとりしたり、紛失するリスクが無くなります。
ただそうするとリポジトリのアクセス制御=鍵のアクセス制御となるため、想定以上のアクセス権が出てしまうことがあります。
鍵のコマンド制限
SSHの鍵には実行できるコマンドに制限をかけることができます。
下記のように~/.ssh/authorized_keys
の鍵の行にcommand
を設定します。
command="ls /path/to/deploy/" ssh-rsa AAiajfpisodaijfpoisadjspodisfjpasodifjaspodifjsapoijfspsadfijfpoaisjdfpoiasjofpoasijdfpoaisjfpoasijsdfpoasijsddYEaqL75Tf6BRYZuhaJMBAVDSn4grC7ypsjjdVLQDhmW40LEl4aLkbmFyI6lrzhoz1Y9j yousan@example.com
このコマンドは実行されるコマンドとしてキッチリ揃える必要があります。rsyncの場合、-vv
オプションでどういったコマンドが送られるのか確認するとよいです。
$ rsync -vv -vlogDtpr -e "ssh -v -i ../etc/id_rsa" . host.example.com:/path/to/deploy
opening connection using ssh -v -i ../etc/id_rsa host.example.com rsync --server -vvvlogDtpr . /path/to/deploy
上記の場合、rsync --server -vvvlogDtpr . /path/to/deploy
がコマンドになります。
なのでauthorized_keysはこういった形で書くとよいです。
command="rsync --server -vvvlogDtpr . /path/to/deploy" ssh-rsa AAiajfpisodaijfpoisadjspodisfjpasodifjaspodifjsapoijfspsadfijfpoaisjdfpoiasjofpoasijdfpoaisjfpoasijsdfpoasijsddYEaqL75Tf6BRYZuhaJMBAVDSn4grC7ypsjjdVLQDhmW40LEl4aLkbmFyI6lrzhoz1Y9j yousan@example.com
デプロイスクリプト
SSHの起動時にフィンガープリントの確認を求められることがあるため、オフにしておくと自動化は捗ります。1
$ ssh -o 'StrictHostKeyChecking no'
特にCDで回す場合にはFingerprintの登録を行なうか、ここでオフにしておくと良いです。
# !/usr/bin/env bash
set -xe
cd -- "$(dirname "$BASH_SOURCE")" # ディレクトリをファイルがおいてある場所に移動する
cd ../dist # デプロイしたいディレクトリに移動する
chmod 0600 ../etc/id_rsa # Gitで共有されるファイルのパーミッションでは出すぎている可能性があるため、ここでパーミッションをへらす
rsync -vlogDtpr -e "ssh -o 'StrictHostKeyChecking no' -i ../etc/id_rsa" . yousan@example.com:/path/to/deploy
echo 'Successfully deplyed! Enjoy your coding.'
echo 'http://example.com'
その他
鍵のコマンド制限をやっている事例って殆ど見かけないけど、実際のところはどうなんだろう…。
実はセキュリティ上問題がありますとか、知られていないだけとか、ご意見お待ちしています!
-
Man-in-the-Middle Attackのリスクは十分にご理解を。https://www.gremwell.com/ssh-mitm-public-key-authentication ↩