こんにちは。BiTTチームのキー坊です。
今回は題にもあるとおり、Raspberry Pi(ラズパイ)のセキュリティ対策をやっていこうと思います! 前回、開発機になっているラズパイ4 メモリ8GBのOSを64ビットにしてSSDに換装するところをご紹介しました。
Raspberry Pi OSの初期設定してみた
それに伴って、以前開発機に設定していたセキュリティ対策の部分もやり直す必要が出たので、せっかくだから記事にしてみました。
皆さんの中にラズパイのセキュリティ対策をせずにOSインストールして、そのまま使っている方はいませんか?
それ実はメッチャ危険です。
どれくらい危険かというと、過去にNASAがセキュリティ対策してないラズパイが元で情報流出をしてます。皆知っている機関なので、ターゲットにされやすいというのはありますが、逆にいうとデフォルト設定のままだとターゲットにされたら突破されちゃうくらい弱いセキュリティなんです。
「ラズパイで情報流出とか、どうせラズパイ2とかが流行った初期の頃でしょ? はいはい!」とか思ったそこのあなた!
これ実は2018年の話です! 最近でもこの程度のセキュリティしかないことがわかってもらえたでしょうか?
デフォルトのまま使うってのをイメージしやすく置き換えるなら、掘っ立て小屋に木の突っ張り棒で扉にロックして、「最強!」って言ってるくらいヤバいです! どう見ても力業でなんとかできちゃうレベルってことです。
この記事を参考に、まったくセキュリティ対策されていない方も最低限のセキュリティ対策を一緒にやれたらいいなと思います!
では、さっそくやっていきましょう。
今回やること
- ユーザーの追加
- GUIのデフォユーザーを新ユーザーに設定
- piユーザを削除
- SSHを公開鍵認証に設定
この4つをやっていきます。ほかにやれることとしてはSSHのポート変更もありますが、今回はやっていないです。間違いなくポート番号を忘れて、管理者本人も突破できない鉄壁のセキュリティ(笑)になるので。
ユーザーの追加
まずrootユーザーにパスワードを追加します。この設定中に何かあったときにrootでログインして復旧できるようにするためです。ただし、これはセキュリティレベルを下げる行為となります。そもそもrootユーザにパスワードがないと、SSHでログインできません。のちほどこれも対策します。
まずはご自分の使用しているメインPCからターミナルを立ち上げ、sshでラズパイに入ってください。
$ ssh pi@{ラズパイのホスト名 or IPアドレス}
ここからは{}で括弧書きしてあるところが任意入力となります。皆さんの環境にあった情報などを入力してください。ターミナルにいろいろなメッセージが流れるので、記事中でわかりやすくするためにこうしています。基本的には入力を求められるため、画面の内容を見ればわかりますので、補足として見ていただければと思います。
$ sudo passwd root
新しいパスワード: {rootのパスワードを入力}
新しいパスワードを再入力してください: {再度rootのパスワードを入力}
passwd: パスワードは正しく更新されました
このように設定できたかと思います。続いて新しいユーザーを作ります。
$ sudo adduser {ユーザー名}
ユーザ `{ユーザー名}' を追加しています...
新しいグループ `{ユーザー名}' (1001) を追加しています...
新しいユーザ `{ユーザー名}' (1001) をグループ `{ユーザー名}' として追加しています...
ホームディレクトリ `/home/{ユーザー名}' を作成しています...
`/etc/skel' からファイルをコピーしています...
新しいパスワード: {パスワードを入力}
新しいパスワードを再入力してください: {パスワードを入力}
passwd: パスワードは正しく更新されました
{ユーザー名} のユーザ情報を変更中
新しい値を入力してください。標準設定値を使うならリターンを押してください
フルネーム []: {必要な方は入力。要らなければEnter}
部屋番号 []:
職場電話番号 []:
自宅電話番号 []:
その他 []:
以上で正しいですか? [Y/n] {良ければYとEnterを押す}
次にpiユーザーと同じ権限を付与していきます。そのために、まずはpiユーザーのグループを確認しましょう。
$ groups pi
pi : pi adm dialout cdrom sudo audio video plugdev games users input netdev spi i2c gpio lpadmin
新ユーザーを同じグループに登録します。
$ sudo usermod -G pi,adm,dialout,cdrom,sudo,audio,video,plugdev,games,users,input,netdev,spi,i2c,gpio,lpadmin {ユーザー名}
登録できたら、以下のコマンドでpiユーザーと同じグループになっているか確認しましょう。正確にはpiユーザーは最初からpiグループになっているので、新ユーザーにはpiグループも追加されています。上のコマンドでグループ指定の最初にpiと書いてあるので、そりゃそうなんですが一応の補足です。
$ groups {ユーザー名}
{ユーザー名} : {ユーザー名} adm dialout cdrom sudo audio video plugdev games users input netdev pi spi i2c gpio lpadmin
次に新ユーザーがパスワードなしでsudoを実行できるようにします。
$ sudo visudo
一番下の行に以下のように入力してください。
{ユーザー名} ALL=(ALL) NOPASSWD: ALL
ここまでできたら一度ログアウトして、SSHで今度は新しいユーザーで入り直して見てください。アクセスできないようでしたら、もう一度piユーザーでアクセスして設定を見直してください。
GUIのデフォユーザーを新ユーザーに設定
次にGUI用のデフォユーザーを変更します。デフォルトだとpiユーザーなので、このままpiユーザーを削除するとエラーが出ます。CUIのみでしか使っていない方や「Raspberry Pi OS Lite版」をお使いの方は、スキップしても問題ありません。
$ sudo vi /etc/lightdm/lightdm.conf
nanoをお使いの方はviをnanoに読み替えてください。ファイルを下のほうまで見ていくと、以下のようにautologin-userという記述が見つかると思います。そこを、今回作成したユーザーに変更しましょう。
autologin-user={ユーザー名}
さらに、以下のファイルも編集します。
sudo vi /etc/systemd/system/autologin@.service
この中の以下の記述を見つけて変更してください。
ExecStart=-/sbin/agetty --autologin {ユーザー名} --noclear %I $TERM
再起動してVNCでGUIを確認してみてください。macのVNC viewerで接続するときは写真のForgot sensitive dataボタンを押してから接続すると、ユーザー名とパスワードを確認してくれるので、新しいユーザー名とパスワードを入力してください。
piユーザを削除
必要なくなったpiユーザーを削除します。
「念のためしばらくとっておきたい!」という方は以下のコマンドでアカウントを有効期限切れ状態にすることができます。こうすることでログインできなくなるので、この状態でしばらく保管してください。
$ sudo usermod --expiredate 1 pi
piユーザーを削除する前に一度CLIでの起動に切り替えておく必要があるようです。
まずは起動オプションの変更からやっていきましょう。
$ sudo raspi-config
出てきたメニューを「System Option -> Boot / Auto Login」と辿ってConsoleを選択します。あとはEscapeなどを押してraspi-configを終了すればOKです。
次に以下のコマンドでpiユーザーの削除をします。
$ sudo userdel -r pi
userdel: グループ pi には他のメンバーがいるので削除しませんでした
userdel: pi のメールスプール (/var/mail/pi) がありません
userdel: /home/pi は pi の所有ではありません。削除は行いません
実行したところ、上のようなメッセージとともにpiユーザーが削除されました。
/home/piは、あとで覗いて必要なものを新しいユーザーにコピーしようと思って所有者を変えておいたため、削除されなかったようです。もしかすると皆さんと少しメッセージが違うかもしれません。
一応削除されたことを確認するために、下のコマンドを打ってみましょう。
$ sudo id -a pi
id: `pi': no such user
piというユーザーはいないことがわかります。
あとは、もう一度raspi-configを呼び出して、今度はdesktop起動かdesktopのAutologinを選択すれば良いと思います。セキュリティ的にはdesktopなのでしょうが、僕は開発機なのでAutologinを選びました。そもそも電源が入っていなければ不正アクセスはできないので。
SSHを公開鍵認証に設定
次にSSHを公開鍵認証方式に切り替えていきます。公開鍵認証を簡単に説明すると、秘密鍵と公開鍵を使って行う認証になるんですが、鍵(秘密鍵)と錠前(公開鍵)のように考えるとわかりやすいです。
扉(マシンへの認証)を錠前(公開鍵)でロックすると、開けられるのは自分が持っている鍵(秘密鍵)だけになりますよね? 今は、ID /Password方式なので、自分の名前と合言葉がいえたら誰でも入れる扉なわけです。どちらがセキュリティ的に強固かは言わずもがなですね。
しかし、逆に秘密鍵を流出しちゃうと大変なことになります。少し昔の話ですが、AWSの鍵をgithubにpushしたら1ヶ月でとんでもない請求が来たって話があったと思うのですが、それはこういう理由からなんですねー。くれぐれも秘密鍵の扱いにはご注意ください。
では、SSHでログインするPCで秘密鍵と公開鍵を作っていきます。すでに鍵を作ってある方は、下手にコマンド打つと今の鍵をなくしちゃうので気をつけてください。
$ ssh-keygen -t rsa
鍵ファイルを保存するフォルダの名前とパスフレーズを聞かれると思うので、任意で入力してください。入力しない場合はEnterでスキップできます。
以下のコマンドでファイルができていることが確認できます。
$ ls ~/.ssh
id_rsaとid_rsa.pubがそれぞれ秘密鍵と公開鍵になります。次は公開鍵を認証に使えるように名前や権限を変更します。
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys
今度はMacに移って作業をします。
$ cd ~/
$ scp {ユーザー名}@{ラズパイのホスト名}.local:/home/{ユーザー名}/.ssh/id_rsa ./
これでMacのホームディレクトリにラズパイの秘密鍵を持ってくることができました。
.ssh/の下にはすでにMacで作った鍵があるので、上書きしないように一旦ホームディレクトリの配下に置いてます。
ラズパイで作った秘密鍵・公開鍵と、Macで作った秘密鍵・公開鍵のどちらも認証に使えます。今回は作業の流れ上、ラズパイで作ったものを使っていますが、Macで作った公開鍵をラズパイに送ってauthorized_keyに追加しても問題無いです。
鍵は適当にaspi4と頭につけてリネームしておきました。鍵を使ったSSHも試しておくと良いです。
$ mv id_rsa .ssh/raspi4_rsa
$ ssh -i .ssh/raspi4_rsa {ユーザー名}@{ラズパイのホスト名}.local
最後にラズパイ側に戻ってパスワードでの認証を無効化しましょう。
$ sudo vi /etc/ssh/sshd_config
# PasswordAuthentication yes
この行を以下のように変更。
PasswordAuthentication no
保存したらラズパイを再起動しましょう。起動したら、上でも試した以下のコマンドでアクセスできれば完了です。
$ ssh -i .ssh/raspi4_rsa {ユーザー名}@{ラズパイのホスト名}.local
まとめ
いかがでしたか?
セキュリティ対策って聞くとすごい面倒に聞こえるかもしれませんが、今回やっていることを簡単にいうと扉に鍵をつけただけなんですよね。誰だってお家を建てたら最低限鍵くらいつけますよね。情報流出は怖いので、たとえ遊びで使う場合や開発機だからといって、疎かにしないよう気をつけていただけたら嬉しいです(ブーメランが痛い)。それでは〜!
LIGはWebサイト制作を支援しています。ご興味のある方は事業ぺージをぜひご覧ください。