LoginSignup
2
3

More than 3 years have passed since last update.

SSHの鍵追加時、特定のコマンドだけ実行できるようにする

Last updated at Posted at 2020-04-02

はじめに

自動デプロイが好きです!
いろんな案件で自動デプロイやCDの導入をオススメしています。

自動デプロイを行なうためにはデプロイ出来る権限を渡す必要があります。
例えばCircleCIにAWSのシークレットIDとキーを環境変数で渡したり、秘密鍵を使ったりなどです。

SSHと秘密鍵でやり取りする方法は最も基本的で汎用性が高いのですが、その反面チームでの鍵の管理に困ります。
すでに特定のサーバにアクセス件を持っているのか、なければ鍵をDMなどでやりとりするのか、その鍵から他のプロジェクトへのアクセス件が漏れないか…。
また案件、メンバーごとの個別に鍵を発行していると鍵の紛失、共有のためのコミュニケーションコストがかかります。

こういったセキュリティリスク軽減策と利便性はトレードオフの関係にあります。そのトレードオフの落としどろころとして良い方法を取るようにしています。

  1. 鍵はリポジトリで共有
  2. 鍵を元にデプロイできるようにする
  3. その鍵でできることを制限する
  4. (必要に応じて)鍵ごとにIPアドレス制限を行なう

鍵の共有

デプロイに必要な鍵をGitリポジトリで共有します。
こうすることでDMなどでやりとりしたり、紛失するリスクが無くなります。
ただそうするとリポジトリのアクセス制御=鍵のアクセス制御となるため、想定以上のアクセス権が出てしまうことがあります。

鍵のコマンド制限

SSHの鍵には実行できるコマンドに制限をかけることができます。
下記のように~/.ssh/authorized_keysの鍵の行にcommandを設定します。

~/.ssh/authorize_keys
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はこういった形で書くとよいです。

~/.ssh/authorize_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'

その他

鍵のコマンド制限をやっている事例って殆ど見かけないけど、実際のところはどうなんだろう…。
実はセキュリティ上問題がありますとか、知られていないだけとか、ご意見お待ちしています!


  1. Man-in-the-Middle Attackのリスクは十分にご理解を。https://www.gremwell.com/ssh-mitm-public-key-authentication 

2
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3