客先のデータも Raspberry Pi で扱うようになってきたので
そろそろ真剣にセキュリティを考えてみようと思います。
色々なサイトを見て、自分が確信した対策だけ施していきたいと思います。
(一部やらかしてます。ご参考にしていただけましたら幸いです)
Root パスワードは必要?
様々なサイトでたくさんの議論がされていますが
個人的には root に直接ログインすることは無いです。sudo ありますし。
パスワードを設定しておいた方が安心という説と、パスワードは設定するなという説が拮抗していますが、自分は結論として「設定しない」ほうが安全だと感じました。
とはいえ設定してしまったんですよね。
でも救済措置はありました。
pi@raspberrypi:~ $ sudo passwd root
新しい UNIX パスワードを入力してください:
新しい UNIX パスワードを再入力してください:
passwd: パスワードは正しく更新されました
pi@raspberrypi:~ $ sudo vi /etc/shadow
root:*:xxxxx:0:99999:7:::
root:暗号化パスワード文字列:
のところを * に変えるだけで良いそうです。
個人的な見解としては
- 自信がある人は root パスワード無効(*)状態にしておく
- 自信がない人は root パスワードロック(*ではなく!)状態にしておく
- よく分からない人は予測されにくい root パスワードをかけておく
ということで良いのではないでしょうか。
ユーザー pi は削除する?
pi はよく知られているので使わない。削除する。
という理屈だと思いますが自分の環境では無理です。
pi が所有しているファイルやディレクトリは、もはや把握しきれません。
削除してしまうと特権でしかアクセスできない場所が多数できてしまうと思われます。
pi のパスワードを強化にするとか、公開鍵と秘密鍵を設定するとかの方がよほど現実的に思えます。
ただ、これは環境によって賛否両論でしょう。
pi@raspberrypi:~ $ sudo passwd pi
新しい UNIX パスワードを入力してください:
新しい UNIX パスワードを再入力してください:
passwd: パスワードは正しく更新されました
SSH のパスワード認証はこの後無効化しますが、
内部的に様々な場面で使用するため設定しておきます。
公開鍵と秘密鍵は簡単に作れます。
- 自端末(ここでは Mac)で公開鍵と秘密鍵を作成する(パスフレーズも設定しておく)
- 公開鍵を Raspberry Pi に転送して設定を行う
- パスワード認証を無効にする
- Raspberry Pi 再起動
- 自端末から秘密鍵を使ってログインする
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/user/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/user/.ssh/id_rsa.
Your public key has been saved in /Users/user/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:******************************************* user@user.local
The key's randomart image is:
+---[RSA 2048]----+
:
+----[SHA256]-----+
$ ls ~/.ssh
id_rsa id_rsa.pub known_hosts
$ scp ~/.ssh/id_rsa.pub pi@192.168.X.X:/home/pi/.ssh
$ ssh pi@192.168.X.X
pi@raspberrypi:~ $ chmod 0700 ~/.ssh
pi@raspberrypi:~ $ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
pi@raspberrypi:~ $ chmod 0600 ~/.ssh/authorized_keys
pi@raspberrypi:~ $ rm ~/.ssh/id_rsa.pub
pi@raspberrypi:~ $ sudo vi /etc/ssh/sshd_config
# To disable tunneled clear text passwords, change to no here!
#PasswordAuthentication yes
#PermitEmptyPasswords no
PasswordAuthentication no ←追加
pi@raspberrypi:~ $ sudo reboot
$ ssh -i ~/.ssh/id_rsa pi@192.168.X.X
Enter passphrase for key '/Users/user/.ssh/id_rsa':
id_rsa.pub
の内容を authorized_keys
に書き込んで
id_rsa.pub
を削除していますが、今後1つしか公開鍵を設定しないのであればこの手順は必要ないです。
authorized_keys
は複数の公開鍵を設定するためだけに必要なファイルです。
新しいログイン方法
秘密鍵を使いつつ、呪文のようなコマンドを打たなくてもログインするには config を設定します。
$ vi ~/.ssh/config
Host raspi
HostName 192.168.X.X
User pi
port 22
IdentityFile ~/.ssh/id_rsa
よそのサイトを参考に作ってみたらエラーになりました。
line 5: Bad configuration option: identifyfile
ああ、Identify
(識別)じゃなくて Identity
(素性)の方ですね。失礼しました。
$ ssh raspi
Enter passphrase for key '/Users/user/.ssh/id_rsa':
pi@raspberrypi:~ $
ローカルにある ~/.ssh/id_rsa
~/.ssh/id_rsa.pub
~/.ssh/config
は念のため、大切に保管しておいた方が良いでしょう。
SSH のポートは変更する?
個人的にはやりすぎな感じがします。
確かに攻撃対象にはなりやすいですが、ポート番号を変えたところでポートスキャンされたらすぐにバレます。というか、ウェルノウンポートの利便性を捨ててまでセキュリティを担保する必要性は今のところありません。
巷では SSH ポート分身の術とか色々議論が続いているようですが
結局イタチごっこなのかな、と思っています。
Raspbian アップデートは定期的に行うべき?
一言でいうと「危険」らしいです。
とりあえず、やってみてから考えようと。そう思ったわけです。
pi@raspberrypi:~ $ sudo rpi-update
*** If no errors appeared, your firmware was successfully updated to ...
*** A reboot is needed to activate the new firmware
pi@raspberrypi:~ $ sudo reboot
特に変わったところはないと思っていましたが、やってくれました。
モニターのバックライトの自動消灯ができなくなりました。
30分格闘して、方法を変えたら本来の機能が戻りました。過去の記事に追記しておきます。
【RaspberryPi】中華 LCD から米 LCD に乗り換えた話
やっぱり「危険」ですね。
安定重視なら apt-get による安定版のアップデートをお勧めします。
ファイアウォール設定
こちらは下記のページを参考に設定させてもらいました。ありがとうございます。
iptablesが難しいためufwでWEBサーバーのファイアウォール設定
pi@raspberrypi:~ $ sudo apt install ufw
pi@raspberrypi:~ $ sudo ufw status
Status: inactive
pi@raspberrypi:~ $ sudo ufw allow 80/tcp
Rules updated
Rules updated (v6)
pi@raspberrypi:~ $ sudo ufw allow 443/tcp
Rules updated
Rules updated (v6)
pi@raspberrypi:~ $ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
pi@raspberrypi:~ $ sudo ufw allow from 192.168.X.0/24 to any port ssh
Rule added
pi@raspberrypi:~ $ sudo ufw allow from 192.168.X.0/24 to any port 5901
Rule added
pi@raspberrypi:~ $ sudo ufw status
Status: active
To Action From
-- ------ ----
80/tcp ALLOW Anywhere
443/tcp ALLOW Anywhere
22/tcp ALLOW 192.168.X.0/24
5901 ALLOW 192.168.X.0/24
80/tcp (v6) ALLOW Anywhere (v6)
443/tcp (v6) ALLOW Anywhere (v6)
とりあえず、http(80)
https(443)
SSH(22)
5901(VNC)
を開けました。
特に SSH と VNC はアクセスをローカルアドレスに限定しています。
その他パスワードは見直しを
VNC パスワード認証も pi デフォルトと同じにしていたので見直します。
- VNC でリモートサインイン
- 画面右上の VNC アイコンをクリック
- Authentication - Change password をクリック
- パスワードを変更してサインアウト
phpMyAdmin については MySQL のアカウントパスワードを変更します。
pi@raspberrypi:~ $ mysql -u root -p
Enter password:
MariaDB [(none)]> USE mysql
MariaDB [mysql]> UPDATE mysql.user SET password=PASSWORD('************') WHERE user='phpmyadmin';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
MariaDB [mysql]> UPDATE mysql.user SET password=PASSWORD('************') WHERE user='root';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
MariaDB [mysql]> FLUSH PRIVILEGES;
まとめ
今回はパスワードを容易に推測されないものに変更し、SSH の認証方法を変更しました。
また、ファイアウォールも導入して使用可能なポートを最小限に設定しました。
ファームウェアを最新版にしてみましたが、これは慎重に検討した方が良いと思いました。
2020.05.05 追記
phpMyAdmin にエラーが表示されていることに気付きました。
mysqli_real_connect(): (HY000/1045): Access denied for user 'phpmyadmin'@'localhost' (using password: YES)
設定ファイルに定義されている管理ユーザ(controluser)での接続に失敗しました。
$dbpass='new_password';
dbc_dbpass='new_password'
の2箇所にも phpmyadmin アカウントのパスワードを変更する必要があるそうです。
参考:https://www.yokoweb.net/2017/02/02/phpmyadmin-password-change/
変更したら、特に再起動は必要なく更新すると表示は消えました。