OpenSSH

あるホストにリモートから安全にログインするために、OpenSSH を使います。 状況として、PC-A というサーバと PC-B というクライアントがあると考えます。 つまり、PC-B から PC-A にリモートでログインなどすることを考えます。

サーバ設定編

以下はサーバ(PC-A)での作業です。
安全のため、パスワードによるリモートログインを不許可とし、
秘密鍵/公開鍵方式によるリモートログインのみ許可します。

インストール

デフォルトでは入っていないので、
sudo apt-get install openssh-server
でopenssh-server をインストールします。 設定は、/etc/ssh/sshd_config を変更します。

/etc/ssh/sshd_config

赤字のカッコ内、D はデフォルト設定です。
/etc/ssh/sshd_config
PermitRootLogin no rootでのログインを禁止(D: yes)
PasswordAuthentication no パスワードでの認証を禁止(D: yes)
UsePAM no PAM認証を禁止。ただし禁止するとログイン時のアップデート情報が出ない(D: yes)

ここより先はデフォルトと同じらしい
PermitEmptyPasswords no パスワードなしを禁止(D: no)
RSAAuthentication yes RSAでの認証を許可(D: yes)
PubkeyAuthentication yes 公開鍵認証を許可(D: yes)
ChallengeResponseAuthentication no チャレンジ・レスポンス認証を禁止(D: no)
設定したら、文法をチェックしてみる。
sudo sshd -t
何も出なければ大丈夫。 問題なければ、sshd を再起動する。
sudo service ssh restart
ディストリビューションによっては ssh のところが sshd となる場合もあるようです。

クライアント設定編

以下は PC-B での作業です。

秘密鍵/公開鍵の作成

ssh-keygen というコマンドがあるのでこれで鍵ペアを作ります。 暗号化には RSA, ECDSA, Ed25519 などの方式があるので、 (暗号強度が十分であれば)好きなものを選んで下さい。

Ubuntu 14.04LTS で使えていた DSA 方式は Ubuntu 16.04LTS では使えなくなっていました。 おそらくクライアント側の問題です。 古い時代の DSA 方式では暗号強度が十分でなかったので 通信を遮断したのかも知れません。

2023年時点で推奨されているらしい鍵作成方法

ssh-keygen -t ecdsa -b 521 -C "Comment_for_this_key"
上のオプションの意味は以下の通りです。 バージョンによって違いがあると思いますので、詳細は man を見てください。 参考: Understanding SSH Key RSA DSA ECDSA ED25519

途中

  1. 鍵の保存先を聞いて来ます。 ホーム直下の ~/.ssh/ に保存されるならそのまま Enter でいいでしょう。
  2. パスフレーズの入力を求められるので、入力と再入力をします。 パスフレーズは忘れてはいけません。
作業が終わると、デフォルトでは という鍵ペアができているはずです。
ls -l ~/.ssh
などでパーミッションを確認しておきましょう。

鍵の確認

作成された鍵のビット数やコメントを確認してみましょう。
ssh-keygen -l -f ~/.ssh/id_ecdsa.pub
左端にビット数、右端に方式、その左隣りにコメントが出ます。

秘密鍵/公開鍵によるログイン

準備

クライアント(PC-B)で秘密鍵/公開鍵のペアを作ったら、 公開鍵をサーバ(PC-A)にコピーして、 パーミッションを適切に設定します。 以下の作業は、サーバ(PC-A)での作業です。
  1. ホーム直下に ~/.ssh というディレクトリがなければ作成し、 パーミッションを 700 にしておく。
    mkdir ~/.ssh
    chmod 700 ~/.ssh
  2. 公開鍵が PC-A の (somewhere)/id_ecdsa.pub にあるとする。 これを ~/.ssh/authorized_keys に追加して、パーミッションを設定する。
    cd ~/.ssh
    cat (somewhere)/id_ecdsa.pub >> authorized_keys
    chmod 600 authorized_keys

ログイン

以上の作業が終わったら、クライアント(PC-B)に戻って、 ssh でログインしてみます。
ssh -l (your-user-name-in-PC-A) (IP-or-hostname-of-PC-A)
-l オプションは PC-A と PC-B でユーザ名が異なるときに指定します。
パスフレーズの入力を求められたら、鍵を生成するときにせっていした パスフレーズを入力します。

デフォルトでは ssh は ~/.ssh/id_ecdsa などの秘密鍵を参照しに行ってくれるので、 鍵ペア作成の際にデフォルトの位置に作成していれば問題はありません。 もし何らかの都合で秘密鍵の場所が異なる場合には、 -i オプションで明示的に秘密鍵の場所を ssh に教えてあげます。

ssh -i (place-of-privatekey) -l (your-user-name-in-PC-A) (IP-or-hostname-of-PC-A)

クライアントからサーバにファイルを転送コピーしたい場合は scp (secure copy) を使います。

scp (file) (your-user-name-in-PC-A)@(IP-or-hostname-of-PC-A):~/
これでサーバ(PC-A)のホーム直下に (file) がコピーされます。


Last modified: Wed Apr 17 12:20:10 JST 2019