最近自宅のRaspberryPiのセキュリティを上げている最中です。VPNサーバ兼homebridgeになっているので、万が一VPN突破されたらとか、万が一SSHでログインされたらとか考えると多少なりともバックドアを埋めておくに越したことはないので。
ということで、今回はラズパイ君への接続を公開鍵認証方式にして、秘密鍵を持っているパソコン、つまり自分の作業用PCからしかアクセス出来ないようしておきます。
公開鍵暗号方式とは?
データの暗号化方式には、共通鍵暗号と公開鍵暗号の大きく2つがあります。共通鍵暗号においては
データの暗号化と復号に同じ鍵を使用しますが、公開鍵暗号では暗号化に公開鍵を使用して、復号に
秘密鍵という別の鍵を使用します。公開鍵暗号では、受信者は公開鍵を公開しておき、送信者はその
公開鍵で暗号化し送信します。データは受信者のみ持つ秘密鍵でしか復号できないので盗聴されにくい。
引用元:https://www.infraeye.com/study/linuxz55.html
Linuxでは結構メジャーに使いますよね。特に運用では必ず組み込んでいるところあると思いますし、ただ少し運用が面倒になるものではありますが。
作業用PC側での作業
先ずは作業用PC側で公開鍵と秘密鍵を作成します。因みに私の作業用PCはMacで実施しています。基本的なコマンドはLinuxと同じですね。Macの場合は標準のターミナルで実行できます。保存場所、パスフレーズ等は各々好きなところに修正してくださいね。
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/digiline_/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/digiline_/.ssh/id_rsa.
Your public key has been saved in /Users/digiline_/.ssh/id_rsa.pub.
The key fingerprint is:
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx digiline_@Mac.local
The key's randomart image is:
+--[ RSA 2048]----+
| |
| |
| |
| |
| S . |
| o ... + o|
| . . .o +.=.|
| o .o++o.=.|
| . o .+.o|
+-----------------+
これで公開鍵と秘密鍵が作成できました。鍵の場所は、~/.sshに入っているはずので、今度はこれをRaspberryPiに転送してあげる必要があります。
$ ls .ssh
id_rsa id_rsa.pub known_hosts
#scpでRaspberryPiに公開鍵を転送
$ scp .ssh/id_rsa.pub pi@192.168.xx.xx:
RaspberryPi側での作業
こちらでの作業は少しコマンドを叩いてあげる必要があります。(そもそも本記事の読者であれば、簡単すぎるかもしれませんが。。)転送された公開鍵をRaspberryPiのssh authorized_keysに登録します。
#転送された公開鍵を展開し、パーミッションを変更
pi@raspberrypi ~ $
pi@raspberrypi ~ $ mkdir .ssh
pi@raspberrypi ~ $ cat id_rsa.pub >> .ssh/authorized_keys
pi@raspberrypi ~ $ chmod 700 .ssh
pi@raspberrypi ~ $ chmod 600 .ssh/authorized_keys
#もう使わないので、公開鍵を削除
pi@raspberrypi ~ $ rm id_rsa.pub
そして次に sshの設定で、公開鍵認証を使うように設定し、余計な操作を禁止にしておきます。
pi@raspberrypi ~ $ sudo vim /etc/ssh/sshd_config
#以下の部分を変更もしくは追記する。
PermitRootLogin no # rootでのログイン無効化
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys
PasswordAuthentication no # パスワード認証を無効化
#Port 22 #もしポートを変更したい場合はここも修正する
#sshサービスを再起動する
$ sudo /etc/init.d/ssh restart
ログインできるかの確認
これで設定は全ておしまいです。あとは作業用PCからログインできるかを確認し、念のため鍵無しPCからログインできないことを試して終了です。
$ ssh -i .ssh/id_rsa -p pi@192.168.xx.xx
Linux raspberrypi 4.14.62-v7+ #1134 SMP Tue Aug 14 17:10:10 BST 2018 armv7l
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Fri Nov 16 22:12:56 2018 from 192.168.xx.xx
pi@raspberrypi:~ $
そして鍵無しのPCではログインできないことを確認。
C:Usersdigiline_ >ssh pi@192.168.xx.xx
The authenticity of host '192.168.xx.xx (192.168.xx.xx)' can't be established.
ECDSA key fingerprint is SHA256:TGlf4MbLohWE5fowVXFlKjNqoyHVZ+xbKd928rMAQJI.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.xx.xx' (ECDSA) to the list of known hosts.
pi@192.168.xx.xx: Permission denied (publickey).
これで一応のログイン規制はできましたね。あくまでも念のためという意味はありますが、VPNなどで外部で一部出ているところもあるので、これで少しは安全になったんじゃないかと思います。
ではこんな感じで。
コメント