幾度となく出ているネタの清書。
発端
サーバは立てた後にコンソールで作業することは珍しく、特に仮想サーバだとそもそもコンソールがありません(Web上にあるけど)。
大体ネットワーク越しに作業します。
その際、よく使うのはsshですが、LAN内ならいざしれず、外部に公開するサーバまでそのままの状態で使っているのはやはり不安。
ということで、ここでは以下3つのことをしていきます。
- ROOTログインを不可にする。
- SSHのポートを22番以外にする。
- 証明書によりログインさせる。
なお、PC・サーバ共にUbuntu 20.04を使用しています。
作業
1と2はsshd_configの設定を変更するので、予め開いておきましょう。
$ sudo vi /etc/ssh/sshd_config
1. ROOTログインを不可にする。
PermitRootLogin
の項目を探してコメントアウトを解除、値をno
にします。
PermitRootLogin no
2. SSHのポートを22番以外にする。
使っていないポート番号にします。
ここでは5022番ポートを使います。
#Port 22
Port 5022
なおこれをした後はsshで接続する際にポートの指定をしなければいけません。
ポートの指定は-pで行います。
$ ssh -p 5022 user@yourserver
3. 証明書によりログインさせる。
接続元のPCで公開鍵と秘密鍵を作り、サーバ上に公開鍵を登録、PC上には秘密鍵を置いておきます。
接続時は自らの持つ秘密鍵で電子署名を作成、サーバでは送られた電子署名を検証し、正当であると判断されると接続を許可されます。
Githubではこの方法でリポジトリをクローンするPCを認証していますよね。
鍵の作成
まずは手元のPCで鍵のペアを作ります。
$ ssh-keygen -t rsa
パスフレーズなどを求められますが、特に設定しないならそのままEnterで構いません。
作り終わると.ssh/のディレクトリ以下にid_rsa
とid_rsa.pub
の2つができていると思います。
id_rsa
が秘密鍵で大切に保管するもの、id_rsa.pub
が公開鍵でサーバに登録するものです。
なお鍵を任意の名前にしたい場合は以下のコマンド。ここでは説明簡略化のためid_rsaで説明します。
$ ssh-keygen -t rsa -f keyname
鍵の転送
id_rsa.pubを転送し、登録していきます。
$ ssh-copy-id -i .ssh/id_rsa.pub user@yourserver -p 5022
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: ".ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
user@yourserver's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh -p '5022' 'user@yourserver'"
and check to make sure that only the key(s) you wanted were added.
※sshのポートをすでに変えている場合、-pのオプションを忘れると鍵転送ができません。鍵自体をsshで送ります。
接続確認
鍵による認証をしてみます。
$ ssh -p 5022 -i .ssh/id_rsa user@yourserver
パスワードを入力する必要もなく認証できましたでしょうか?
パスワード認証の無効化
ここまでくればすでにパスワード認証を残しておく必要もないので、サーバ側でパスワード認証を無効化しましょう。
sshd_configでPasswordAuthentication
を見つけ、値をnoにします。
PasswordAuthentication no
sshd再起動
サーバ側のsshdを再起動します。
sudo systemctl restart sshd
接続確認
新しいターミナルを立ち上げて接続確認をします。
$ ssh -p 5022 user@yourserver
user@yourserver: Permission denied (publickey).
パスワード認証でssh接続しようとしたら怒られました。
$ ssh -p 5022 -i .ssh/id_rsa user@yourserver
鍵認証であれば問題なく接続できます。
備考
最近は鍵作成にED25519という方式を使うのが広まっているのだそう。
将来的にrsaで鍵を作るのは非推奨になるのだとか。
参考にリンクを貼っておきます。
その場合は以下のようにRSAの代わりにED25519を指定します。
$ ssh-keygen -t ed25519
参考
ssh公開鍵認証設定まとめ
SSH認証に最強の「Ed25519鍵」を使おう
Ssh-copy-id for copying SSH keys to servers
ssh-rsa,非推奨のお知らせ