今回はUbuntu同士でSSH接続を行う方法をLinux初めてでもわかりやすいように1から解説します。
環境としてはサーバークライアント共にUbuntuであることを想定しています。
WindowsでもWSLを使用すれば同じ状態になるかと思います。
SSHを利用すればネットワーク越しに安全にリモートのUbuntuにアクセスできるので、サーバー管理やリモート作業が格段に便利になります。
では実際に見ていきましょう。
SSHとは?
SSH(Secure Shell)とは、遠く離れたコンピュータに安全にアクセスする(リモートアクセス)ための仕組みです。
たとえば、自宅から会社のサーバーに接続して作業を行う場合、通常の接続では情報が盗まれる恐れがありますが、SSHは通信内容を暗号化するため、パスワードやコマンドが外部に漏れる心配がありません。
ログイン時にはパスワードや鍵認証を利用し、確実に正しい相手と接続できるようになっています。
安心してリモート作業が行えるため、システム管理や開発の現場で広く利用されています。
SSH接続するための具体的な流れ
SSH接続の方法を調べていたときに、具体的なコマンド手順などは載っています。
しかし、それだけだと実際に何をしているのか?がわかりにくく感じたので、具体的に何をしているのかを先に書いておきたいと思います。
サーバー側
用意されているサーバーに接続したいだけの場合はここは不要です。
- サーバー側のubuntuにSSHのソフトウェアをインストール
- SSHを起動状態にします
- 必要があれば設定を変更
クライアント側(接続する側)
- SSHクライアントの確認
- SSH-Keyを作成する
※公開鍵と秘密鍵が作成される - 公開鍵をサーバー側に登録する
- SSHで接続する
Ubuntuサーバー側の処理
まずはサーバー側にSSH接続するための設定をしておきます。
SSHサーバーのインストール
まず、UbuntuサーバーにSSHサーバーソフトウェア(openssh-server)をインストールします。
ターミナルを開き、以下のコマンドを実行してください。
sudo apt update
sudo apt install openssh-server
インストールが完了したら、SSHサーバーが正しくインストールされているか確認しましょう。
sudo systemctl status ssh
もし起動していたら以下のような表示が表示されます。
ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/usr/lib/systemd/system/ssh.service; enabled; preset: enabled)
Active: active (running) since Mon 2025-02-10 16:51:52 UTC; 12h ago
TriggeredBy: ● ssh.socket
Docs: man:sshd(8)
man:sshd_config(5)
runningとなっていれば実行されていることを確認できます。
もしrunnningになっていなければ以下のコマンドで有効化します。
# SSHを有効化
# 再起動時に自動起動されるようになります
sudo systemctl enable ssh
# SSHを起動する
sudo systemctl start ssh
SSHサーバーの設定確認
SSHサーバーの設定ファイルは /etc/ssh/sshd_config.d
にあります。
とりあえず接続できるようにしたいだけであればそのままで問題ありません。
必要がある時だけ変更してみてください。
変更したい場合はここにファイルを追加してそれを編集していきます。
touch /etc/ssh/sshd_config.d/1_ssh.conf
vi /etc/ssh/sshd_config.d/1_ssh.conf
このファイルを編集することでSSHで最優先される内容を設定できます。
大元になっているファイル/etc/ssh/sshd_configがありますが、そこで/etc/ssh/sshd_config.d/をincludeするように書かれているため、includeするファイルに設定したい内容を書くことで大元を汚さずに設定変更ができるようになります。
設定ファイルが複数存在する場合、/etc/netplan/ ディレクトリ内のすべての YAML ファイルを読み込み、アルファベット順(ファイル名の昇順)にマージして1つの設定として解釈・適用します。
つまり、複数の YAML ファイルが存在する場合は、それらをアルファベット順に読み込み、マージして最終的なネットワーク設定を作成します。そのため、設定の優先順位はファイル名の順序によって決まることを念頭に置いてファイルを管理してください。
最初に設定された内容が優先されて設定されるので、注意してください。
個人的に設定している内容はこんな感じ。
# rootログインをなしに
PermitRootLogin no
# 空のパスワードをNGに
PermitEmptyPasswords no
# 公開鍵認証をyes
PubkeyAuthentication yes
# パスワード認証をno
# パスワードが漏れても認証できないように
PasswordAuthentication no
SSHサーバーの再起動
設定を変更したら、SSHを再起動する必要があります。
再起動は以下のコマンドでできます。
sudo systemctl restart ssh
ここまででサーバー側の設定は完了です。
statusがrunnningになっているのを確認するようにしてください
クライアント側の設定
次はクライアント側の設定方法を見ていきます。
もしクライアント側のみを知りたい場合はこちらから読んでください。
改めて手順の流れを書いておくとこのようになります。
- SSHクライアントの確認
- SSH-Keyを作成する
※公開鍵と秘密鍵が作成される - 公開鍵をサーバー側に登録する
- SSHで接続する
SSHクライアントの確認
多くのUbuntu環境(WSL2を含む)には、デフォルトでSSHクライアント(ssh
コマンド)がインストールされています。
クライアントのターミナルで以下のコマンドを実行し、バージョン情報が表示されるか確認してください。
ssh -V
もしインストールされている場合は以下のような表示が出るかと思います。
OpenSSH_8.9p1 Ubuntu-3ubuntu0.6, OpenSSL 3.0.2 15 Mar 2022
SSHクライアントの有無を確認し、なければサーバー側にある「SSHクライアントのインストール」に書いてある方法でインストールしてください。
SSH-Keyを作成する
公開鍵、秘密鍵を作成します。
以下のコマンドを実行してください。
ssh-keygen -t ed25519
「-t ed25519」では暗号化の方式を指定しています。
今回使用している方式はgithubなどでも使用できる暗号化方式です。
とりあえずこのように作成しておけば接続自体は問題ありません。
これを実行すると以下のディレクトリにファイルが2つ作成されます。
※「~」はログインユーザーのホームディレクトリ
- 秘密鍵 : ~/.ssh/id_rsa
- 公開鍵 : ~/.ssh/id_rsa.pub
ファイル名を指定したい場合はこちらのように「-f」オプションで指定可能です。
もしSSH-KEYを他のものと分けたい場合はファイル名を指定して生成してみてください。
ssh-keygen -t ed25519 -f ~/.ssh/ubuntu_ssh
# ファイルは「ubuntu_ssh」「ubuntu_ssh.pub」が生成されます
公開鍵をサーバー側に登録する
次に先ほど作成した公開鍵をサーバーに登録します。
サーバーに公開鍵を設置することで、自分のクライアントの秘密鍵と照合して接続を確立するようになっています。
では具体的に公開鍵を登録する方法を見ていきます。
【方法1】サーバー上で手動で公開鍵を追加する
- サーバーにログインする
対象ユーザーでサーバーにSSHログインしてください。
ex)ssh your_username@server_ip_address
.ssh
ディレクトリの作成と権限設定
ホームディレクトリに.ssh
ディレクトリが存在しない場合は作成し、適切な権限を設定します。mkdir -p ~/.ssh chmod 700 ~/.ssh
authorized_keys
ファイルに公開鍵を追加
ローカルマシンで作成した公開鍵の内容(例:id_ed25519.pub
の中身)をコピーして、サーバー側のauthorized_keys
ファイルに追記します。
中身を確認するにはcat ~/.ssh/id_rsa.pub
で確認できます。
※ファイル名は作成時にファイル名を指定している場合は変わります- 方法A:エディタを使用するbashコピーする
nano ~/.ssh/authorized_keys
エディタが開いたら、公開鍵の内容を貼り付け、保存して終了してください。 - 方法B:コマンドラインから追加する
公開鍵の内容を直接コマンドで追加する場合、以下のようにします(公開鍵の内容は実際のキーに置き換えてください)。bashコピーするecho "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIxxxxxxxxxxxxxxxxxxxxxxxxxx your_email@example.com" >> ~/.ssh/authorized_keys
- 方法A:エディタを使用するbashコピーする
authorized_keys
の権限設定
ファイルの権限が厳しく制限されていることを確認します。そうしないと、SSHサーバーがこのファイルを無視することがあります。bashコピーするchmod 600 ~/.ssh/authorized_keys
- 設定の確認
SSH接続を一度切断し、再度接続して公開鍵認証が正しく動作しているか確認してください。
もしPasswordAuthentication noを設定している場合は、サーバーに入って直接実行してください。
【方法2】ssh-copy-id
コマンドを使用する
ローカルマシンからサーバーへ公開鍵を自動で追加する場合は、ssh-copy-id
コマンドで追加可能です。
この方法では、公開鍵が自動的にサーバー上の ~/.ssh/authorized_keys
に追加され、適切な権限も設定されます。
ただし、PasswordAuthentication no
を設定している場合はできないのでサーバー上で手動で追加するようにしてください。
- ローカルマシンで公開鍵を登録する
以下のコマンドを実行してください。
(your_username
とserver_ip_address
は適宜置き換えてください)ssh-copy-id your_username@server_ip_address
- パスワードを求められたら入力
サーバー側のユーザーのパスワードを入力すると、公開鍵が自動的に追加されます。 - 接続の確認
その後、公開鍵認証でサーバーにログインできるか確認してください。
以上の手順で、Ubuntuサーバー側に公開鍵を追加することができます。
どちらの方法も、セキュリティ上の理由からファイルやディレクトリの権限設定が重要ですので、適切な設定を行ってください。
接続確認をする
ここまででSSH接続の設定は完了です。
最後に接続できるかを見ておきましょう。
ssh your_username@server_ip_address
# 暗号鍵のファイルを指定する場合
ssh -i file_path your_username@server_ip_address
SSH接続でしておくと便利な設定
SSH接続するのに便利な設定がConfigファイルを作成することです。
通常は以下のように接続するかと思います。
ssh your_username@server_ip_address
鍵を別で設定している場合、さらにファイル名を指定してするなど大変です。
ターミナルの履歴を使うから気にしないならそれはOKですが、ターミナル履歴がたくさんあると探すのも大変です。
ということでこの接続情報をConfigファイルに記述しておくと非常に簡単にSSH接続できます。
設定方法はこのようになります。
vi ~/.ssh/config
中身をこのようにします。
Host server
HostName 192.168.1.110
User yourname
IdentityFile ~/.ssh/id_rsa
Port 2222
- Host : 接続時に使用したい名前
- HostName : 接続先IP、ホスト名
- User : SSHするユーザー名
- IdentityFile : 秘密鍵をパス
- Port : SSHのポート番号
このような感じで設定しておけば、以下のようなコマンドで簡単に接続できるようになります。
ssh server