🐧

OpenSSH サーバー:Linux 使い(略)Advent Calendar 2024

2024/12/05に公開

はじめに

これは「Linux 使いになりたい人のための Advent Calendar 2024」の記事です。

筆者は、Web エンジニアを志望する人には、セルフホスト Git サービスを稼働させて利用することをオススメしています。もし Git を使ったことがないなら、Git を学ぶときに、セルフホスト Git サービスを稼働させることも視野に含めながら学習するのが効率的だと考えています。

OpenSSH サーバー

前回、Git リモートリポジトリはローカルマシンのファイルシステム上で用意することもできるという話をしました。今回は、Git リモートリポジトリを用意するにあたってよく使われている OpenSSH サーバーについてです。

筆者は Git リモートリポジトリへアクセスするときは基本的に SSH プロトコル経由としています。そのため、セルフホスト Git サービスを稼働させる場合にも OpenSSH サーバー機能を有効化して使っています。SSH プロトコルを使う場合は、Git リモートリポジトリの URL は ssh:// で始まるものとなります。

ここで、セルフホスト Git サービスで使用する OpenSSH サーバーについては、何をどこで動かすか決める必要があります。

通常は、セルフホスト Git サービス用のソフトウェアを稼働させるホストマシン上の OS にインストールしたものを使います。ホストマシンにインストールした Windows、macOS、Linux を普通に使う場合は、それぞれの OS で標準的に使用可能な OpenSSH サーバーを使えば良いでしょう。

なお、WSL Ubuntu で動作する OpenSSH サーバーを使うこともできます。ただし、その場合は、セルフホスト Git サービス用のソフトウェアを WSL Ubuntu へインストールする必要があり、Windows の設定で WSL Ubuntu へ SSH プロトコル用のポート転送を有効にする必要があります。

Git システムの組み込み SSH サーバー

OS の OpenSSH サーバーを使う以外にも、Git システムの組み込み SSH サーバーを使う選択肢もあります。組み込み SSH サーバーがない Git システムもありますが、Gitea、Forgejo、GitBucket は自前の SSH サーバーが組み込まれていて使えるようになっています。

Git システムの組み込み SSH サーバーを使うと、OpenSSH サーバーを別途インストールして用意する必要がなくなるので、セルフホスト Git サービスを用意するときに楽ができます。ただし、Git システムのホストマシンをリモート管理したいときに OpenSSH を使いたいときは、やはり OpenSSH サーバーをインストールすることになります。このあたりは、システム全体の構成をどうするかという設計をきちんとしてから、実際に環境構築するのが良いということになります。

SSH プロトコルは、ポート番号 22 を使うのが標準となっています。ポートをむやみに開放すると管理が大変になるので、リモートアクセスと Git サービスの両方でポート番号 22 を共通で使うという設定にするのが楽です。

ここで、想定する利用者を考えてみます。すると、リモートアクセスはマシン管理者のために必要なもので、Git アクセスは Git リモートリポジトリ利用者のために必要なものです。利用目的が異なるので、同じポート番号でサービス提供をしたくないこともあるでしょう。

セルフホスト Git サービスの場合は、そういった心配はあまり必要ありませんが、用意されている機能を使いこなせるようになっておくという視点からは、共存させるにはどうしたら良いか、考えておくことは意味があることです。

用意してあるホストマシンが Git サービス専用マシンとして用意する場合は、Git システムでポート番号 22 を使い、リモートアクセス用のものはポート番号 10022 を使うとすれば良いでしょう。

用意してあるホストマシンが Git サービス専用マシンというわけではないなら、リモートアクセス用のものをポート番号 22 で使い、Git システムでポート番号 10022 を使うとすれば良いでしょう。

ここでは例としてポート番号 10022 を使うとしましたが、この番号は、ホストマシンで未使用の他のポート番号に変更しても良いです。また、OpenSSH サーバーや Git システムの組み込み SSH サーバーの設定で使用するポート番号は指定できるので、そこで設定を変更するということになります。

多段接続

セルフホスト Git サービスを使うようになって、CI/CD にはまりだすと、複雑な SSH 接続を使いたくなることがでてきます。CI/CD 処理の中での自動 SSH 接続するにあたっては、あまり複雑なコマンドオプションを駆使してワンライナーで実行するというのは避けたいところです。

複雑な SSH 接続をするには、コマンドプションで色々指定するより、${HOME}/.ssh/config ファイルに設定を書くのが簡単です。CI/CD では設定ファイルを作成して単純な ssh コマンドや scp コマンドでリモート接続によるコマンド実行やファイル転送をするようにしています。

多段接続用の ${HOME}/.ssh/config ファイルの簡単なサンプルを示しておきます。ProxyCommand を使うと ssh コマンド用のオプション指定がしやすいです。単純な多段接続の場合は ProxyJump を使うのが簡単です。

ssh-gateway.local マシンからは、dev.internalexample.internalsakura.ne.jp へアクセスできますが、ほかの .local のマシンからはアクセスできないネットワークになっているとします。

Host ssh-gateway
    HostName     ssh-gateway.local
    User         user001
    IdentityFile ~/.ssh/id_ed25519
    ForwardAgent yes

Host ubuntu001
    HostName     ubuntu001.dev.internal
    User         ubuntu
    ProxyCommand ssh -CW %h:%p ssh-gateway

Host server001
    HostName     server001.example.internal
    ProxyCommand ssh -CW %h:%p ssh-gateway

Host vps-sakura
    HostName     vps-sakura.sakura.ne.jp
    User         sakura001
    IdentityFile ~/.ssh/vps-sakura.sakura.ne.jp.pem
    ProxyJump    user001@ssh-gateway:22
    ForwardAgent yes

このような設定をしてあると、ssh ssh-gatewayssh ubuntu001 といった単純なコマンドで SSH 接続ができるようになります。

ちなみに、筆者は VS Code の Remote SSH 拡張機能を使って、リモートマシンを使ったリモート開発をよくしています。ローカルマシンで起動した開発コンテナーもよく使っています。最近、リモートマシンで開発コンテナーを起動することもしています。そういったときも ${HOME}/.ssh/config に設定をしておくとリモート開発ができるようになります。

おわりに

OpenSSH サーバーは、セルフホスト Git サービス以外にもよく使われるものなので、利用する機会が多くあります。セルフホスト Git サービスを利用していく中でも、こういう使い方ができたら良いな、と思うことがそれなりに出てきますから、そういった機会に OpenSSH サーバーの利用方法についても調べたいと思うことでしょう。

筆者も OpenSSH をよく使っていて、手動による利用には慣れていて、知識としては十分だと思っていたことがありました。しかし、セルフホスト Git サービスを運用していく中で、「自動化も含めると、まだまだ知らないこともあるし、工夫のしようがあるのだなぁ」と思うようになりました。そうやって知識を増やしてきたので、OpenSSH 関連の話題が出てきても、あまり困ることなくトラブルシュートをしたり、設定ができるようになれていると実感しています。

実際のところは、OpenSSH サーバーについての知識は、セルフホスト Git サービスを使わなくても、いずれは必要になるものでしょうが、具体的に利用しているものに早めに接しておくのは良いことだと考えています。

Discussion