SSH を使用した Svnserve のセキュリティ保護
このセクションでは、svn+ssh
プロトコルを使用するように Subversion と TortoiseSVN を設定するためのステップバイステップガイドを提供します。すでに認証済み SSH 接続を使用してサーバーにログインしている場合は、すでに準備完了であり、Subversion の書籍で詳細を確認できます。SSH を使用していないが、Subversion インストールを保護するために SSH を使用したい場合は、このガイドでは、すべての Subversion ユーザーに対してサーバー上に個別の SSH ユーザーアカウントを作成する必要のない簡単な方法を示します。
この実装では、すべての Subversion ユーザーに対して単一の SSH ユーザーアカウントを作成し、異なる認証キーを使用して実際の Subversion ユーザーを区別します。
この付録では、Subversion ツールがすでにインストールされており、このマニュアルの別の場所で詳しく説明されているようにリポジトリを作成済みであることを前提としています。SSH と組み合わせて使用する場合は、svnserve をサービスまたはデーモンとして起動しないように注意してください。
ここにある情報の多くは、Marc Logemann によって提供されたチュートリアルに由来しており、tortoisesvn.net にアーカイブされています。Windows サーバーのセットアップに関する追加情報は、Thorsten Müller によって提供されました。感謝します!
Maximo Migliari によって作成されたビデオチュートリアルを見て、重要な手順をすべて確認することもできます。Vimeo または YouTube でご覧ください。
Linux サーバーのセットアップ
サーバーで SSH が有効になっている必要があります。ここでは、OpenSSH を使用することを前提としています。ほとんどのディストリビューションでは、これはすでにインストールされています。確認するには、次のように入力して ssh ジョブを探します。
ps xa | grep sshd
注意すべき点の 1 つは、Subversion をソースからビルドし、./configure に引数を指定しない場合、Subversion は /usr/local の下に bin ディレクトリを作成し、そこにバイナリを配置することです。SSH でトンネリングモードを使用する場合は、SSH 経由でログインするユーザーが svnserve プログラムと他のいくつかのバイナリを実行する必要があることに注意する必要があります。このため、/usr/local/bin を PATH
変数に入れるか、バイナリのシンボリックリンクを /usr/sbin ディレクトリ、または通常 PATH
に含まれている他のディレクトリに作成します。
すべてが正常であることを確認するには、SSH でターゲットユーザーとしてログインし、次のように入力して svnserve が到達可能かどうかをテストします。
which svnserve
svn リポジトリにアクセスするために使用する新しいユーザーを作成します
useradd -m svnuser
このユーザーにリポジトリへのフルアクセス権を必ず付与してください。
Windows サーバーのセットアップ
Cygwin SSH デーモンをインストールするか、Windows 10 SSH ツールを使用します。
リポジトリにアクセスするために使用する新しい Windows ユーザーアカウント svnuser
を作成します。このユーザーにリポジトリへのフルアクセス権を必ず付与してください。
まだパスワードファイルがない場合は、Cygwin コンソールから次を使用して作成します
mkpasswd -l > /etc/passwd
TortoiseSVN で使用する SSH クライアントツール
PuTTY サイト から Windows クライアントで SSH を使用するために必要なツールを入手してください。ダウンロードセクションに移動して、Putty、Plink、Pageant、Puttygen を入手してください。
OpenSSH 証明書の作成
次のステップは、認証用のキーペアを作成することです。キーを作成するには 2 つの方法があります。1 つ目は、クライアントで PuTTYgen を使用してキーを作成し、公開キーをサーバーにアップロードして、PuTTY で秘密キーを使用する方法です。もう 1 つは、OpenSSH ツール ssh-keygen でキーペアを作成し、秘密キーをクライアントにダウンロードして、秘密キーを PuTTY スタイルの秘密キーに変換する方法です。
ssh-keygen を使用してキーを作成する
root
または svnuser
としてサーバーにログインし、次のように入力します
ssh-keygen -b 1024 -t dsa -N passphrase -f keyfile
実際のパスフレーズ (あなただけが知っている) とキーファイルを代入します。SSH2 DSA キーを 1024 ビットのキーフレーズで作成しました。次のように入力すると
ls -l keyfile*
2 つのファイル、keyfile と keyfile.pub が表示されます。ご想像のとおり、.pub ファイルは公開キーファイルであり、もう 1 つは秘密キーファイルです。
公開キーを svnuser
ホームディレクトリ内の .ssh フォルダにあるキーに追加します
cat keyfile.pub >> /home/svnuser/.ssh/authorized_keys.
生成した秘密キーを使用するには、PuTTY 形式に変換する必要があります。これは、秘密キーファイル形式が標準化団体によって指定されていないためです。秘密キーファイルをクライアント PC にダウンロードしたら、PuTTYgen を起動し、Conversions -> Import key を使用します。サーバーから取得したファイル keyfile を参照し、キーの作成時に使用したパスフレーズを入力します。最後に、Save private key をクリックし、ファイルを keyfile.PPK として保存します。
PuTTYgen を使用してキーを作成する
PuTTYgen を使用して公開キー/秘密キーペアを生成し、保存します。公開キーをサーバーにコピーし、svnuser
ホームディレクトリ内の .ssh フォルダにあるキーに追加します
cat keyfile.pub >> /home/svnuser/.ssh/authorized_keys
PuTTY を使用してテストする
接続をテストするには、PuTTY を使用します。プログラムを起動し、Session タブでホスト名をサーバーの名前または IP アドレスに設定し、プロトコルを SSH に設定して、セッションを SvnConnection
または任意の名前で保存します。SSH タブで、優先 SSH プロトコルバージョンを 2 に設定し、Auth から以前に変換した .PPK
秘密キーファイルへのフルパスを設定します。Sessions タブに戻り、Save ボタンをクリックします。これで、保存されたセッションのリストに SvnConnection
が表示されます。
Open をクリックすると、telnet スタイルのログインプロンプトが表示されるはずです。ユーザー名として svnuser
を使用し、すべてがうまくいけば、パスワードを求められることなく直接接続できるはずです。
サーバーで /etc/sshd_config を編集する必要がある場合があります。次のように行を編集し、その後 SSH サービスを再起動します。
PubkeyAuthentication yes PasswordAuthentication no PermitEmptyPasswords no ChallengeResponseAuthentication no
TortoiseSVN で SSH をテストする
これまでのところ、SSH を使用してログインできることをテストしただけです。次に、SSH 接続が実際に svnserve を実行できることを確認する必要があります。サーバーで /home/svnuser/.ssh/authorized_keys を次のように変更して、多くの Subversion 作成者が同じシステムアカウント svnuser
を使用できるようにします。すべての Subversion 作成者が同じログインを使用しますが、異なる認証キーを使用するため、作成者ごとに 1 行追加する必要があります。注: これはすべて非常に長い 1 行です。
command="svnserve -t -r <ReposRootPath> --tunnel-user=<author>", no-port-forwarding,no-agent-forwarding,no-X11-forwarding, no-pty ssh-rsa <PublicKey> <Comment>
セットアップに応じて設定する必要がある値がいくつかあります。
<ReposRootPath>
は、リポジトリを含むディレクトリへのパスに置き換える必要があります。これにより、URL 内で完全なサーバーパスを指定する必要がなくなります。Windows サーバーでも、たとえば c:/svn/reposroot のように、必ずフォワードスラッシュを使用してください。以下の例では、リポジトリルート内に repos というリポジトリフォルダがあることを前提としています。
<author>
は、コミット時に保存する svn 作成者に置き換える必要があります。これにより、svnserve は svnserve.conf 内で独自のアクセス権を使用することもできます。
<PublicKey>
は、以前に生成した公開キーに置き換える必要があります。
<Comment>
は任意のコメントにすることができますが、svn 作成者名を個人の本名にマッピングするのに役立ちます。
Windows エクスプローラーの任意のフォルダを右クリックし、TortoiseSVN -> Repo-Browser を選択します。URL の入力を求められるので、この形式で入力します
svn+ssh://svnuser@SvnConnection/repos
この URL は何を意味しますか?スキーマ名は svn+ssh
であり、TortoiseSVN にサーバーへのリクエストの処理方法を指示します。ダブルスラッシュの後には、サーバーに接続するユーザーを指定します。この場合は svnuser
です。@
の後には、PuTTY セッション名を指定します。このセッション名には、秘密キーの場所やサーバーの IP または DNS など、すべての詳細が含まれています。最後に、authorized_keys ファイルで指定されているように、サーバー上のリポジトリルートからの相対パスでリポジトリへのパスを提供する必要があります。
OK をクリックすると、リポジトリの内容を閲覧できるようになるはずです。もしそうなら、TortoiseSVN と連携して SSH トンネルが実行されていることになります。
デフォルトでは、TortoiseSVN は独自のバージョンの Plink を使用して接続することに注意してください。これにより、認証を試みるたびにコンソールウィンドウがポップアップ表示されるのを防ぎますが、エラーメッセージが表示される場所がないことも意味します。エラー Unable to write to standard output
が表示された場合は、TortoiseSVN のネットワーク設定でクライアントとして Plink を指定してみてください。これにより、Plink によって生成された実際のエラーメッセージを確認できます。
SSH 構成のバリエーション
TortoiseSVN の URL を簡略化する 1 つの方法は、PuTTY セッション内でユーザーを設定することです。これを行うには、PuTTY で既に定義したセッション SvnConnection
をロードし、Connection タブで Auto login user をユーザー名 (例: svnuser
) に設定します。PuTTY セッションを以前と同様に保存し、TortoiseSVN 内で次の URL を試してください
svn+ssh://SvnConnection/repos
今回は、PuTTY セッション SvnConnection
のみを SSH クライアント TortoiseSVN (TortoisePlink.exe) に提供します。このクライアントは、セッションにすべての必要な詳細が含まれているか確認します。
執筆時点では、PuTTY は保存されたすべての構成をチェックしないため、同じサーバー名で複数の構成がある場合、最初に一致する構成を選択します。また、デフォルト構成を編集して保存しても、自動ログインユーザー名は保存されません。
多くの人は、すべてのキーを保存するために Pageant を使用することを好みます。PuTTY セッションはキーを保存できるため、必ずしも Pageant が必要というわけではありません。しかし、複数の異なるサーバーのキーを保存したい場合を想像してみてください。その場合、接続しようとしているサーバーに応じて、PuTTY セッションを何度も編集する必要があります。このような状況では、Pageant は非常に理にかなっています。なぜなら、PuTTY、Plink、TortoisePlink、またはその他の PuTTY ベースのツールが SSH サーバーに接続しようとすると、Pageant が保持するすべての秘密キーをチェックして接続を開始するからです。
このタスクでは、Pageant を実行し、秘密キーを追加するだけです。これは、上記の PuTTY セッションで定義した秘密キーと同じである必要があります。Pageant を秘密キーのストレージとして使用する場合は、保存された PuTTY セッションで秘密キーファイルへの参照を削除できます。他のサーバーや他のユーザーのキーをさらに追加することもできます。
クライアントを再起動するたびにこの手順を繰り返したくない場合は、Windows インストールの自動起動グループに Pageant を配置する必要があります。Pageant.exe へのコマンドライン引数として、完全なパスを含むキーを追加できます。
SSH サーバーに接続する最後の方法は、TortoiseSVN 内でこの URL を使用するだけです
svn+ssh://[email protected]/repos svn+ssh://[email protected]/repos
ご覧のとおり、保存された PuTTY セッションではなく、IP アドレス (またはドメイン名) を接続ターゲットとして使用します。ユーザーも指定しますが、秘密キーファイルがどのように見つかるか疑問に思うかもしれません。TortoisePlink.exe は PuTTY スイートの標準 Plink ツールの修正版にすぎないため、TortoiseSVN は Pageant に保存されているすべてのキーも試行します。
この最後の方法を使用する場合は、PuTTY でデフォルトのユーザー名を設定していないことを確認してください。この場合、PuTTY のバグが原因で接続が閉じられるという報告を受けています。デフォルトのユーザーを削除するには、HKEY_CURRENT_USER\Software\SimonTatham\Putty\Sessions\Default%20Settings\HostName
をクリアするだけです。