• home
  • OpenSSHの設定ファイルを分割する

OpenSSHの設定ファイルを分割する

この記事はWanoグループ Advent Calendar 2016の15日目の記事です。

.ssh/config を分割するという話を以前どこそこで見た時に、自分もやってみようと思って、やったやり方を紹介します。

僕の環境は、Ubuntu 16.04 なので、incron という時間ではなくて監視先のディレクトリ内のファイルの状態に応じて処理を実行できるものを利用します。
ちなみに、macOS には incron はないようです。監視して処理を実行する wait_on というコマンドはあるようですが、僕は Mac は使ってないので知りません。

まず、incron を使うためには、/etc/incron.allow にユーザー名を書く必要があるかもしれません(Ubuntu 16.04では必要でしたが、CentOS(少なくとも6系)だと多分不要)。

% cat /etc/incron.allow
ktat

実際のファイル分割のためのディレクトリ構成は以下のようにします。

 .ssh
    +- /configs/
    |   +- .base (共通の設定等をいれておく)
    |   +- host_groupA.config
    |   +- host_groupB.config
    |
    +- /backup/

incrontab -e で、以下のように登録します。

/home/ユーザー名/.ssh/configs/ IN_MODIFY,IN_CREATE,IN_DELETE,IN_MOVE /home/ユーザー名/bin/make_ssh_config $@ $#

これで、.ssh/configs/ の中のファイルが変更/作成/削除/移動されたら、即座に make_ssh_config コマンドが実行されます。
$@ は監視対象のパス(/home/ユーザー名/.ssh/configs/)に置き換わります。$#は実際に変わったファイル。
make_ssh_config は、監視対象のパスをコマンドに渡して、そこからの相対パスで処理しているので、.ssh/ の下の階層のディレクトリであれば、別にディレクトリ名は何でも良いです。

make_ssh_config は、以下です。

#!/bin/sh

target=$2

# emacs のバックアップファイルを無視
if [[ "$target" =~ "~$" ]]; then
    exit
fi

config_dir=$1
ssh_dir=$1..
log_file=$config_dir../backup/log.$(date +%Y-%m-%d-%H-%M-%S)

{
  set -e
  chmod 0600 $ssh_dir/config
  cp $ssh_dir/config $ssh_dir/backup/config.$(date +%Y-%m-%d-%H-%M)
  cat $config_dir/.base $config_dir/*.config > $ssh_dir/config.tmp
  mv $ssh_dir/config.tmp $ssh_dir/config
  chmod 0400 $ssh_dir/config
} 2>> $log_file

test -s $log_file || rm $log_file
find $config_dir../backup/ -type f -ctime +2 | xargs -r rm

やってることは、

  • .ssh/config に書き込み権限を与える
  • 元ファイルを backup ディレクトリにコピー
  • ファイルを結合して、.ssh/config.tmp に書き込み
  • .ssh/config に mv
  • 書き込み権限を削る
  • backup から2日以上たってるのを削除

incrontab の中にリダイレクトが書ければ、さくっと書いてしまうのですが、コマンドにしてしまった関係で多少色をつけることにしました。

これで、.ssh/configs/ 以下のファイルを編集したら、即座に .ssh/config が結合されます。権限も変更しているので間違って編集することもありません、という感じです。