~/.ssh/authorized_keys
を複数のコンピュータで自動的に同期させる仕組み.
複数の接続先に対してそれぞれ公開鍵の追加・変更・削除を行うといった煩雑な作業を自動化することが可能.
本稿においては,システムを構成する役割についてそれぞれ以下のように定義する.
[サーバ] 公開鍵の収集・保管・提供を行うコンピュータ
[ホスト] サーバに保管された公開鍵を取得し,クライアントからのアクセスを受け付けるコンピュータ
[クライアント] 公開鍵・秘密鍵のキーペアを保有し,任意のホストへのアクセスを行うコンピュータ
DNS,https,rsync,lsyncdの4手法を用いてそれぞれ同期システムを実装した.
転送量の観点からはlsyncdによる実装が最も優れているといえる.
しかし,各ホストでポートの開放ができない状況ではrsync,Webブラウザを用いて鍵を取得したい状況ではhttps,強固なフィルタリングが行われている環境においてはDNSによる実装もそれぞれ有用である.
よって,各環境の特徴に合わせたプロトコルの選択や併用が必要であると考える.
- クライアントはssh-copy-idなどを用いてサーバに自らの公開鍵を集積する.
- サーバはcronを用いて定期的にユーザの
~/.ssh/authorized_keys
をDNS権威サーバにTXTレコードとして登録,公開する.
このとき,改行コードについて別の記号に置き換えるエスケープ処理を行った上でTXTレコード文字数上限の255文字ごとに分割し,分割数をユーザ名を任意の階層のサブドメインとするTXTレコードとして登録する. (本実装においては,Google Cloud PlatformのCloudDNSを使用.)
その上で,ユーザ名に分割情報を加えたサブドメインにおいて公開鍵の文字列データをTXTレコードとして登録する. - ホストもcronを用いて定期的にサーバのFQDNについて自ホストのユーザ名をサブドメインとして付加し,フルサービスリゾルバを通した名前解決を試みる.
TXTレコードを取得できた場合,レコードに含まれる分割情報を踏まえて公開鍵の文字列を含むTXTレコードについても名前解決を行い,当該情報はユーザの公開鍵であるとして自ホスト各ユーザの
~/.ssh/authorized_keys
に追記する形で配布する.
- クライアントはssh-copy-idなどを用いてサーバに自らの公開鍵を集積する.
- サーバはcronを用いてユーザの
~/.ssh/authorized_keys
を公開ディレクトリに定期的に複製し,Webサーバソフトウェアにより公開する.
また,任意の証明書を取得してhttpsによる通信ができるよう設定する. - ホストもcronを用い,サーバのURLに自ホストのユーザ名をファイル名として付加した上で,httpsでのアクセスを定期的に試みる.
公開鍵ファイルを取得できた場合,当該情報はユーザの公開鍵であるとして自ホスト各ユーザの
~/.ssh/authorized_keys
に追記する形で配布する.
- クライアントはssh-copy-idなどを用いてサーバに自らの公開鍵を集積する.
- サーバはincronを用いて
/etc/passwd
ファイルを監視し,公開ディレクトリに各ユーザの~/.ssh/authorized_keys
へのシンボリックリンクを張る.
その上で,lsyncdは公開ディレクトリを監視し,ホストで動作しているrsyncデーモンと通信し,データを送信する. - ホストもincronを用いてデータ更新を検知し,自ホスト各ユーザの
~/.ssh/authorized_keys
に追記する形で配布する.
- クライアントはssh-copy-idなどを用いてサーバに自らの公開鍵を集積する.
- サーバはcronを用いて定期的にユーザの
~/.ssh/authorized_keys
を公開ディレクトリに複製し,rsyncデーモンにより外部からのデータ取得を可能とする.
このとき,ユーザ名情報はファイル名として用いるが,同期には予め接続元(ホスト)のIPアドレスを登録しておく必要がある. - ホストもcronを用いて定期的にサーバとrsyncで疎通しデータを取得し,自ホスト各ユーザの
~/.ssh/authorized_keys
に追記する形で配布する.