CentOS7サーバー(さくらVPS)でssh公開鍵認証を使う
というわけで、ssh接続を公開鍵認証に変えて、ユーザーの制限かけて、あとポートも変更してみましょう。ちなみにクライアントの方はLMDE201403。なので普通に端末からssh するとつながる感じですね。

1.パスワード認証をやめて公開鍵認証に変更する
何度かやってるんだけどいつもやってるわけじゃないので忘れちゃいますね。
sshでデフォルトポート変更& ssh-keygenで鍵生成
さくらVPSの初期設定
SSH接続の設定変更方法
鍵認証~公開鍵の登録とsshd_configの設定
・鍵ペアは接続側、サーバー側どちらで生成してもよし。
・id_rsaは接続側、id_rsa.pubをサーバー側のそれぞれ~/.ssh以下に配置して権限設定。
・ /etc/ssh/sshd_configを書き換えて公開鍵認証にする。
1−1.鍵ペア生成
今回はクライアントの方で生成。
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/tmin/.ssh/id_rsa): /home/tmin/.ssh/sakura_id_rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/tmin/.ssh/sakura_id_rsa.
Your public key has been saved in /home/tmin/.ssh/sakura_id_rsa.pub.
The key fingerprint is:
b4:bd:1d:09:47:7a:72:5d:88:83:e4:bc:cf:04:1f:1c tmin@tmin-pc
The key's randomart image is:
+--[ RSA 2048]----+
| ...E. ..|
| o.+oo.. |
| . B *.. |
| . o X o |
| S o = |
| * . |
| . + |
| |
| |
+-----------------+
id_rsaは他の差バーへの接続で作っちゃってたので、ここでディレクトリと鍵の名前打ち込んで別名で作りましたが、初めてやる人は普通にそのまま作ればいいと思います。
1ー2.id_rsaの権限変更とpubの転送と権限変更
まずはクライアント側。
$ chmod 600 .ssh/sakura_id_rsa
$ scp .ssh/sakura_id_rsa.pub サーバーIP:~/
サーバー側にログインして.sshディレクトリ作って鍵の名前変えて権限かえて
$ mkdir .ssh
$ mv sakua_id_rsa.pub .ssh/authorized_keys
$ chmod 700 .ssh
$ chmod 600 .ssh/authorized_keys
クライアントの~/.ssh/(700)にid_rsa(600)、サーバーの~/.ssh(700)にid_rsa.pub(600)があるはずです。
これで鍵使う準備が出来ました。
1−3.sshの設定ファイル書き換え
サーバー側のsshの設定ファイルを書き換えて、パスワード認証から公開鍵認証にかえます。ついでにポートの変更とか、rootログイン禁止とか、ユーザーを指定するとか色々やってみます。
$ sudo emacs /etc/ssh/sshd_config
Port 22 →Port 22022 (ポート変更)
PermitRootLogin no (rootログイン禁止)
PubkeyAuthentication yes (公開鍵認証を許可(ssh2のみ))
AuthorizedKeysFile .ssh/authorized_keys (公開鍵のファイルへのパス)
PasswordAuthentication no (パスワード認証拒否)
PermitEmptyPasswords no (空パスワード禁止)
AllowUsers tmin (接続許可ユーザー指定)
最後のやつだけ書き加えでしたね。ポートのところに注意書きとして
# If you want to change the port on a SELinux system, you have to tell
# SELinux about this change.
# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
などと不安げなことが書いてあります。ので安全に行きたい方は、ポート変更は後回しにして他の設定だけ書き換えて鍵認証できること、rootログインできないこと、パスワードログインできないことなど、設定項目がちゃんと反映されてるのを確かめてからのほうがいいかもです。
sshd再起動
$ sudo systemctl restart sshd
2.ポート変更とかSELinuxのアレとかfirewallとか
ポートの変更自体はさっきの /etc/ssh/sshd_config でまず指定します。22じゃなければ大分減るらしいんだけど、10000南蛮までがポートスキャン対象って話も色々調べてたら見かけたので10022は避けてみました。いやーでもポートスキャンかけるくらいならけっこうな範囲調べられそうな気もするけど。
設定ファイルでのポート変更
$ sudo emacs /etc/ssh/sshd_config
Port 22 →Port 22022 (ポート変更)
# If you want to change the port on a SELinux system, you have to tell
# SELinux about this change.
# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
もしSELinux使っててポート変えたいなら、 semanage port -a -t ssh_port_t -p tcp #PORTNUMBER 走らせてSELinuxに変更をおしえてあげなきゃいけないよ、って。
$ sudo semanage port -a -t ssh_port_t -p tcp 22022
sudo: semanage: コマンドが見つかりません
入ってないじゃん。。。
CentOS 7 で sshd のポートを変更する(firewalld, SELinuxの設定)
CentOS 7 で sshd のポート番号を変更する
semanage自体は policycoreutils-pythonというパッケージに入っているのでインストール。
$ sudo yum install policycoreutils-python
改めてsemanageでポート変更をおしえて(一応ここでsshd再起動して)確認。
$ sudo semanage port -a -t ssh_port_t -p tcp 22022
$ sudo systemctl restart sshd
$ sudo semanage port -l |grep 22022
ssh_port_t tcp 22022, 22
もう一個確認
$ ss -t -l -n
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 *:22022 *:*
LISTEN 0 50 *:3306 *:*
LISTEN 0 128 *:80 *:*
LISTEN 0 100 ::1:25 :::*
LISTEN 0 128 :::22022 :::*
一応これでつながるはずだけど・・・Firewall有効にしてる場合はさらに設定が必要。
3.Firewallがなんかしてるかも
まだFirewallがあるんですね。
まずは現状確認。iptablesが動いてたら止める、自動起動からも外す、firewalldの状況を確認。
$ systemctl |grep iptable
$ systemctl |grep iptables
$ systemctl list-unit-files -t service | grep iptables
$ systemctl |grep firewalld
firewalld.service loaded active running firewalld - dynamic firewall daemon
うちの環境ではiptables関係はなんも入ってなかったっぽいです。firewalldは動いていますね。
/usr/lib/firewalld/services/以下にxml形式でサンプル設定ファイルがあり、これを/etc/firewalld/services/以下に配置することにより設定が可能とのこと。
$ sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/
$ sudo emacs /etc/firewalld/service/ssh.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>SSH</short>
<description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communi\
cations. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server pac\
kage installed for this option to be useful.</description>
<port protocol="tcp" port="22022"/>
</service>
ポートが22になってると思うので、今回は22022に書き換えて保存。
firewalldは設定読み込んで--list-allで確認。あと一応sshd再起動。
$ sudo firewall-cmd --reload
$ sudo firewall-cmd --list-all
public (default, active)
interfaces: eth0
sources:
services: dhcpv6-client http ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
$ sudo systemctl restart sshd.service
4.動作確認
基本的には $ ssh -p 22022 IPでパスワード無しでつながればそれで良いのですが。
オプションに-vつけるとpublickey使ってるか出してくれます。
サーバをセキュアにするために最低限やっておくべきOpenSSHの設定
$ ssh -p 22022 -v IP
OpenSSH_6.4, OpenSSL 1.0.1j 15 Oct 2014
(中略)
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic
debug1: Offering RSA public key: private2
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic
debug1: Offering RSA public key: tmin@tmin-pc
debug1: Server accepts key: pkalg ssh-rsa blen 279
debug1: Authentication succeeded (publickey).
(後略)
debug1: Authentications that can continue: publickey
ってのがあればとりあえずおっけー。
あとは
$ ps aux |grep sshd
とか
$ netstat -an|more
とか使ったりしてちゃんと設定が反映されていることを確認しときましょー。
最後になりましたが、この設定変更作業を行っている間に全部のリモート接続端末切っちゃってつながらないー、ってなるとかなり悲惨なことになるので、作業用に必ず一つ以上はずっとsshログインしたままで作業して、接続確認は別端末でやりましょう。
なんかSELinuxとかfirewalldとか結構めんどかったけど、おかげで少しネットワークに詳しくなれたような気がします。
関連記事
・sshでデフォルトポート変更& ssh-keygenで鍵生成
・さくらVPSの初期設定
- 関連記事
-
- sshの公開鍵認証を使ってパスワード認証を無効にする (2015/08/29)
- CentOS7サーバー(さくらVPS)でssh公開鍵認証を使う (2015/03/18)
- Nginx+Wordpressで固定ページをTOPにしたら403になった件 (2015/02/20)
Windowsの目次・Linuxの目次・Linuxの目次2・ ・自作PC関連の目次・Web技術関連の目次
全記事一覧・情報サイト新着RSS一覧
Sponsored Link