基本的にはSSH接続でRaspberryPiを運用するときの、最初にすべきセキュリティ設定をメモしておく。
前提としてインストール時に「pi」ユーザーのパスワードは「raspberry」と違うものを設定し、OSのアップデートは済ませているものとする。
以下、手順。
- rootにパスワードを設定する
- 新しいユーザーを作成し、「pi」ユーザーを消去
- SSHの設定(rootログイン禁止、ポート変更、公開鍵認証等)
以前に書いたVPSサーバーの初期設定とも大体一致している。
rootにパスワードを設定する
RaspberryPiのrootにはパスワードが設定されていない、とネットでよく見るけど実際のところpiユーザーからsu
コマンドを打ってもパスワード無し、piユーザーのパスワード共に通らずrootにはなれなかった。よく分からないけど別にパスワードを設定するのは手間ではないのでやっておく。
$ sudo passwd root
設定したいパスワードを入力すると、次からはsu
コマンドでrootユーザーになれる。
新しいユーザーを作成し、「pi」ユーザーを消去
これはいくつか手順を踏む。
- newuser(新しいユーザー)作成
- newuserに権限付与
- (任意)piユーザー内のファイルをごっそり新規ユーザーにコピー
- piユーザーの自動ログインを無効化&newuserを自動ログインさせる
- (任意)newuserで実際にパスワードログイン
- 新規ユーザーがパスワード無しで
sudo
コマンドを実行できるようにする - メインPCで秘密鍵と公開鍵を作成
- RaspberryPi側に.sshディレクトリ作成
- 公開鍵をRaspberryPiに転送
- 公開鍵をauthorized_keysに書き込み
- パーミッション設定
- newuserで公開鍵認証ログイン
- piユーザーを削除
newuser(新しいユーザー)作成
$ sudo adduser newuser
名前を変える場合はnewuser
の部分を変える。
コマンドを打つと、「newuser用のパスワード」「パスワード確認」を求められた後、「Full Name[]」というようなものがしばらく聞かれるが、特に入力する必要は無い。最後にY
と入力してEnterを押せば作成完了。
newuserに権限付与
$ sudo usermod -G pi,adm,dialout,cdrom,sudo,audio,video,plugdev,games,users,netdev,input,spi,gpio newuser
要はpiユーザーが所属するグループ全部に、newuserも含めてやる。piグループにも含めるのはやりすぎ感があるが、まあ一応。piユーザーが所属するグループは以下のコマンドで確認できる。
$ groups pi
それぞれのグループの役割はここを参照。
(任意)piユーザー内のファイルをごっそり新規ユーザーにコピー
$ sudo cp -r /home/pi/* /home/newuser
cp
コマンドはコピーコマンドで、Linux操作の超基本。-r
はサブディレクトリも含めて全部コピー。/home/pi/*
はpiユーザーのホームディレクトリにあるもの全部をコピー元とし、/home/newuser
でそのコピー先を指定。
正直piユーザーで特に何もしていないならコピーする必要は無いと思う。自分で作った必要なファイルは自分で退避させる。
piユーザーの自動ログインを無効化&newuserを自動ログインさせる
$ sudo nano /etc/lightdm/lightdm.conf
126行目にあるautologin-user=pi
をコメントアウトする。その後
$ sudo nano /etc/systemd/system/autologin@.service
として、28行目の--autologin pi
を--autorogin newuser
とする。
また、ブートをデスクトップのままにしているとどうしてもpiユーザーがログインしてしまう。ブート後CLIモードで立ち上げるように設定する。
$ sudo raspi-config
3 Boot Options
→B1 Desktop / CLI
でB1 Console
を選ぶ。
こうすると、RaspberryPiにHDMIケーブルをつないで立ち上げてもCLIしか表示されなくなる。その場合、startx
コマンドを打てばGUIが立ち上がる。(未検証)
(任意)newuserで実際にパスワードログイン
できるかどうかの確認。
新規ユーザーがパスワード無しでsudo
コマンドを実行できるようにする
$ sudo visudo
最後にnewuser ALL=(ALL) NOPASSWD: ALL
の一文を加えて保存終了をする。
メインPCで秘密鍵と公開鍵を作成
これはRaspberryPi上ではなく、通常使うPC上で行う。Windowsの場合、コンソールはコマンドプロンプトかPowerShellで。Macは知らん。
$ ssh-keygen -t rsa
作成した鍵の保存場所、パスフレーズ入力、再確認を求められる。終われば、指定した保存場所にid_rsa
とid_rsa.pub
がそれぞれ作成されているはず。
以前に作ったことがあればそれを再利用することが可能。
RaspberryPi側に.sshディレクトリを作成
再度RaspberryPiにnewuserでログインして、以下を打つ。
$ mkdir ~/.ssh
ログイン直後なら~/
は無くても可。~/
はそのユーザーのホームディレクトリを指す。
公開鍵をRaspberryPiに転送
今度メインPC上に戻って、コンソールから以下を打つ。
$ scp .ssh/id_rsa.pub newuser@(RaspberryPiのIP):/home/newuser/.ssh
ログインパスワードを求められるので入力するとid_rsa.pub
が転送される。
scp
コマンドはセキュアな(つまり暗号化された)cp
コマンドで、通常はネットワーク越しの転送に使う。メインPCからRaspberryPiへ、またはその逆のときに使えばよい。
公開鍵をauthorized_keys
に書き込み
再再度RaspberryPiにnewuserでログインして以下を打つ。
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
これで、勝手にauthorized_keys
というファイルが作成されて、id_rsa.pub
の中身がコピーされる。
パーミッション設定
$ chmod 700 ~/.ssh $ chmod 600 ~/.ssh/authorized_keys
これをしないと公開鍵認証が動かない。
newuserで公開鍵認証ログイン
一旦RaspberryPiからログアウトし、メインPCのコンソールから以下を打つ。
$ ssh newuser@(RaspberryPiのIP)
ログインコマンドとしては同じだが、パスワードは聞かれない。秘密鍵にパスフレーズを設定していたらそっちを聞かれる。
piユーザーの削除
$ sudo userdel -r pi
確認コマンドは以下。
$ id -a pi id: ‘pi’: no such user
SSHの設定(rootログイン禁止、ポート変更、パスワード認証禁止等)
基本的には/etc/ssh/sshd_config
というファイルを編集することになる。このファイルを開くコマンドは以下。
$ sudo nano /etc/ssh/sshd_config
これ以降は、上記のファイルを編集するということを前提にして説明していく。ちなみに行頭に#
が付いてる行で、#
の直後がスペースじゃないものはデフォルト値。
rootログイン禁止
#PermitRootLogin prohibit-password ↓ PermitRootLogin no
公開鍵を設定していないrootで、パスワードログインを禁止していたらそりゃできないでしょってことなんだけど、一応no
として完全禁止にする。
ポート変更
#Port 22 ↓ Port (任意の数字)
任意と言っても、いろいろ予約されているポート番号があるので、49152 ~ 65535の間から選ぶようにする。
22番ポートというのはSSH用のポートとしてあまりにも有名だからハッキングを受けやすく、ほとんどの場合は変更するということになっている。でも結局自宅で運用するならルーターの設定をしっかりしておけばいいんだけど、まあ一応。
パスワードログインの無効化
#PasswordAuthentication yes ↓ PasswordAuthentication no
パスワードログインを有効にしているとでたらめにパスワードを入れられてひょっとしたら破られるかもしれないから。これは公開鍵でログインできることを確認してからでないとログインできなくなる。(その場合はモニターをつないで直接ログインするようにすれば何とかなるかも)
その他の設定
せっかくなので他の項目も知りたいという人は「sshd_config 解説」とかでググってください。最初は必要そうな項目について書こうかと思ったけど、結局初期値のままで良かったり、ユーザーが自分しかいないのであれば必要ない設定項目ばっかりだった。
SSHの再起動
$ sudo /etc/init.d/ssh restart
一旦ログアウトがてらにRaspberryPi自体を再起動して、再度ログイン。メインPCから
$ ssh newuser@(RaspberryPiのIP) -p (ポート番号)
とすればログインできるはず。
終了
お疲れさまでした。ちなみにルーターの設定(ポートフォワーディング)をしていない限りは外部からは入ってこれないはずなので、ここまで設定しなくてもいいんだけどね。
参考
初心者向!Raspberry Pi 最低限のセキュリティ設定【所要時間 30分】 – Qiita
ラズパイ入手したらまずやること、デフォルトユーザーとSSHログイン認証を変更する (1/3) – MONOist(モノイスト)
ラズパイでやらなければいけない4つのセキュリティ対策! – Qiita
Raspberry Pi Webサーバー セキュリティ設定 | アラコキからの Raspberry Pi 電子工作
ラズパイ4でpiユーザのIDを変更する方法 | rs-techdev
[Raspberry Pi] ラズパイ & Remmina on LinuxでRDP接続してリモートデスクトップさせてみる方法
Raspberry Pi3のLAN外からのSSH接続設定方法 – Qiita
Raspberry Piに外部ネットワークからアクセスできる様にして携帯でペットを遠隔監視する方法 – Qiita
セキュアなSSHサーバの設定 – Qiita
RaspberryPi 3 デフォルトユーザpiの変更 | そう備忘録
Raspberry PiのCLI/GUIログインの切り替え – ysdyt.net for tech memo
TCPフォワーディングについて
sshポートフォワーディングの使い方 – Qiita
SSHポートフォワーディング(トンネリング)とは: 小粋空間
【改訂版】SSHポートフォワード(SSHトンネル)【ローカル・リモート・ダイナミック総集編】 | ITログ
sshポートフォワーディングで詰まったら確認すること – Qiita
いますぐ実践! Linuxシステム管理 / Vol.102
Agentフォワーディングについて
ssh agent forwardingを行うサーバー側の要点の備忘録 – Qiita
ssh-agentを利用して、安全にSSH認証を行う – Qiita
ssh agent forwarding · JoeMPhilips
ゲートウェイポートについて
異なるprivateネットワーク内の端末をsshで繋ぐ – Qiita