Git Product home page Git Product logo

pubkey-sync's Introduction

概要

~/.ssh/authorized_keys を複数のコンピュータで自動的に同期させる仕組み.
複数の接続先に対してそれぞれ公開鍵の追加・変更・削除を行うといった煩雑な作業を自動化することが可能.

本稿においては,システムを構成する役割についてそれぞれ以下のように定義する.

[サーバ] 公開鍵の収集・保管・提供を行うコンピュータ
[ホスト] サーバに保管された公開鍵を取得し,クライアントからのアクセスを受け付けるコンピュータ
[クライアント] 公開鍵・秘密鍵のキーペアを保有し,任意のホストへのアクセスを行うコンピュータ

DNS,https,rsync,lsyncdの4手法を用いてそれぞれ同期システムを実装した.

転送量の観点からはlsyncdによる実装が最も優れているといえる.
しかし,各ホストでポートの開放ができない状況ではrsync,Webブラウザを用いて鍵を取得したい状況ではhttps,強固なフィルタリングが行われている環境においてはDNSによる実装もそれぞれ有用である.
よって,各環境の特徴に合わせたプロトコルの選択や併用が必要であると考える.

DNS

  1. クライアントはssh-copy-idなどを用いてサーバに自らの公開鍵を集積する.
  2. サーバはcronを用いて定期的にユーザの ~/.ssh/authorized_keys をDNS権威サーバにTXTレコードとして登録,公開する.
    このとき,改行コードについて別の記号に置き換えるエスケープ処理を行った上でTXTレコード文字数上限の255文字ごとに分割し,分割数をユーザ名を任意の階層のサブドメインとするTXTレコードとして登録する. (本実装においては,Google Cloud PlatformのCloudDNSを使用.)
    その上で,ユーザ名に分割情報を加えたサブドメインにおいて公開鍵の文字列データをTXTレコードとして登録する.
  3. ホストもcronを用いて定期的にサーバのFQDNについて自ホストのユーザ名をサブドメインとして付加し,フルサービスリゾルバを通した名前解決を試みる. TXTレコードを取得できた場合,レコードに含まれる分割情報を踏まえて公開鍵の文字列を含むTXTレコードについても名前解決を行い,当該情報はユーザの公開鍵であるとして自ホスト各ユーザの ~/.ssh/authorized_keys に追記する形で配布する.

https

  1. クライアントはssh-copy-idなどを用いてサーバに自らの公開鍵を集積する.
  2. サーバはcronを用いてユーザの ~/.ssh/authorized_keys を公開ディレクトリに定期的に複製し,Webサーバソフトウェアにより公開する.
    また,任意の証明書を取得してhttpsによる通信ができるよう設定する.
  3. ホストもcronを用い,サーバのURLに自ホストのユーザ名をファイル名として付加した上で,httpsでのアクセスを定期的に試みる. 公開鍵ファイルを取得できた場合,当該情報はユーザの公開鍵であるとして自ホスト各ユーザの ~/.ssh/authorized_keys に追記する形で配布する.

lsyncd

  1. クライアントはssh-copy-idなどを用いてサーバに自らの公開鍵を集積する.
  2. サーバはincronを用いて /etc/passwd ファイルを監視し,公開ディレクトリに各ユーザの ~/.ssh/authorized_keys へのシンボリックリンクを張る.
    その上で,lsyncdは公開ディレクトリを監視し,ホストで動作しているrsyncデーモンと通信し,データを送信する.
  3. ホストもincronを用いてデータ更新を検知し,自ホスト各ユーザの ~/.ssh/authorized_keys に追記する形で配布する.

rsync

  1. クライアントはssh-copy-idなどを用いてサーバに自らの公開鍵を集積する.
  2. サーバはcronを用いて定期的にユーザの ~/.ssh/authorized_keys を公開ディレクトリに複製し,rsyncデーモンにより外部からのデータ取得を可能とする.
    このとき,ユーザ名情報はファイル名として用いるが,同期には予め接続元(ホスト)のIPアドレスを登録しておく必要がある.
  3. ホストもcronを用いて定期的にサーバとrsyncで疎通しデータを取得し,自ホスト各ユーザの ~/.ssh/authorized_keys に追記する形で配布する.

pubkey-sync's People

Contributors

tamasan238 avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.