【ラズパイ】初期セキュリティについて

基本的には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 OptionsB1 Desktop / CLIB1 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_rsaid_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

【ラズパイ】Raspberry PiとAndroidをつなぐ

スマホのテザリング機能を使ってRaspberryPiをスマホにつなげて、SSH接続とリモートデスクトップ接続を目指す。

前提としてすでに家のWifiなどに繋がっていて、今回新たにAndroidとの接続設定をする状況を想定する。

概要

テザリングでスマホとRaspberryPiがつながれば同じLANネットワークに繋がっているようなものなので、IP特定して、固定化して、後はPCと同じようにして繋げばいいだけ。SSH、RDP、VNC等のAndroid用アプリもそろっているのでそれを使えばPCと同じことができるよって話。

iPhoneは持っていないので知りません。大体同じ?

スマホのテザリングをONにし、RaspberryPiをつなぐ

スマホのテザリングON。やり方はスマホによって違うのでおググりください。

RaspberryPiの設定もデスクトップのタスクバーからWifi設定をONにしてスマホのテザリングに繋ぎに行くだけ。ヘッドレス(モニター無し)の場合はこの作業は不要(というかできない)。

Wifiの優先度設定

家のWifiとスマホのテザリングといったように複数のWifiに接続すると、何を優先するのかが不明になったりするので、ちゃんとコントロールできるようにする。スマホのテザリングに接続後、RaspberryPiのターミナルから

$ sudo nano /etc/wpa_supplicant/wpa_supplicant.conf

と打ち、以下のようにpriorityを追加し保存する。

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

(家のwifi)
network={
        ssid="XXXXXXXX"
        psk="xxxxxxx"
        key_mgmt=WPA-PSK
        priority=0
}

(スマホのテザリング)
network={
        ssid="YYYYYYYY"
        psk="yyyyyyyy"
        key_mgmt=WPA-PSK
        priority=1
}

ヘッドレスでやっている場合は「スマホのテザリング」が丸々抜けているはずなので、抜けている部分を全部手動で入力する。

ssidはその通りSSID、pskはパスワードになっている。priorityの項目を自分で追記。数字が大きい方が優先されるので、スマホのSSIDを優先度高にしておけば、普段は家のWifiにつなぐけど、スマホのテザリングをONにしているときはスマホに繋ぎに行く、というような挙動になる。

RaspberryPiのIP固定化

次に、スマホにつないだ時もIPを固定されるようにする。

テザリングで繋がっている今はスマホがルーター代わりになっており、スマホ自身のIPを確認する必要がある。GoogleストアからTermux(ターミナルエミュレーター)をインストールして

$ ifconfig wlan0

と打てば、どこかにinet 192.168.43.xxxと表示されていると思う。これがスマホの(無線LANデバイスが持つ)IPアドレス。43は別の数字になっているかもしれない。

次に、RaspberryPiのターミナルから

$ sudo nano /etc/dhcpcd.conf

と打ち、以下を追記する。ssid XXXXXXXXはPCのSSIDを想定していて、すでに記述されているものとする。

interface wlan0
ssid XXXXXXXX
static ip_address=192.168.1.xxx/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1

(以下を追記)
ssid YYYYYYYY
static ip_address=192.168.43.yyy/24
static routers=192.168.43.xxx
static domain_name_servers=192.168.43.xxx

yyyは自分で決める。AndoroidテザリングのDHCPサーバー機能(簡単に言えば、IPの自動割り振り機能)のアドレス範囲は設定変更不可らしい。何か別の機器とIPが衝突したときは南無ということで。

dhcpcd.confが更新されたら自動的にネットワーク接続も更新するみたい。確認のためにRaspberryPiのターミナル上でifconfig wlan0と打って設定した通りの表示になったらOK。

SSH接続

AndroidのSSHクライアントをインストールして、PCの時と同じようにログインすればよい。自分はこれを使っている。

リモートデスクトップ:RDPで接続

前回の記事からの流れで、RaspberryPiにxrdpを入れている人は、スマホにRDPクライアントを入れるだけでOK。新しい接続先の設定時に「固定したRaspberryPiのIP」「ユーザー名(初期設定のままならpiユーザー)」「ログインパスワード」を入れればよい。Googleストアで「rdp」と検索すればRDPクライアントソフトが色々出てくるけど、ダウンロード数の多さと評価の高さでMicrosoftのやつでいいんじゃないですか?

リモートデスクトップ:RaspberryPiのVNC有効化して、VNC Viewerで接続

xrdpを入れればいいだけなんだけど、一応別の方法として紹介。

RaspberryPiの設定からVNCをEnableにしておく。SSHの有効/無効のすぐ下にある。

後はこれをインストールして、接続先を追加する。設定項目としては「固定したRaspberryPiのIP」「接続先を識別するための名前(ユーザー名とは別)」「ユーザー名(初期設定のままならpiユーザー)」「ログインパスワード」を然るべき場所に入れる。

接続

お疲れ様でした。

追記:wpa_supplicant.confに記述するパスワードの暗号化

記事中に示した書き方だと、パスワードが平文のままなので、暗号化しておく。

$ wpa_passphrase "XXXXXXXX"

XXXXXXXXはSSID名。ダブルクォーテーション必要。上のコマンドを打つと

# reading passphrase from stdin

と表示されるので、そのままWifiに接続するためのパスワードを打つ。stdinは標準入力のことで、ここではコンソール画面のことを指す。

パスワードを打つと

network={
        ssid="XXXXXXXX"
        #psk="xxxxxxxx"
        psk=(いかにも暗号化されたような文字列)
}

と表示されるが、これは表示されるだけで設定まではしてくれないので、psk=(いかにも暗号化されたような文字列)の部分を手動でwpa_supplicant.confにコピペする。

>>の意味が分かる人は、rootユーザーに昇格してから

# wpa_passphrase "testing" >> /etc/wpa_supplicant/wpa_supplicant.conf

と打てば、パスワードを入力したときに自動でwpa_supplicant.confに追記してくれるので、後は適当にwpa_supplicant.confを開いて中身を整形する。

【ゼロから始める】Raspberry Piの立ち上げ~遠隔操作まで

立ち上げ方は2通りある。

  • モニターやマウス・キーボードをつないでセットアップし、遠隔操作までできるようになってからモニター等を外す。(簡単)
  • 最初からモニター・マウス・キーボード無しで男らしくセットアップしてしまう。(中級)

どちらもSDカードにOSを書き込むまでは同じ。前者はその後画面の指示に従いセットアップ。後者は「SSH許可、Wifi設定書き込み」「メインPCからネットワーク上のRaspberryPiを探す」「SSH接続」という段取りを踏む。リモートデスクトップ接続までいけばメインPC上でRaspberryPiのデスクトップ画面を開くことができ、モニターがあっても無くてもどっちでもよくなる。

購入

Raspberry Pi本体は、CPUとかメモリが取り付け済みのちっちゃいマザーボードと言った感じで、それだけだと「まじかよ」とつぶやきたくなるぐらいむき出し。以下の付属品が付いたスターターキットとか売ってるけど、恩恵があるのはぶっちゃけ電源のみ。

  • 電源(必要。5V3Aのコンセント直取り。まあ探せば買える。スマホ充電ケーブルだとアンペア数が足りないかも)
  • ケース(数あるケースの中から自分で選んで個性を出すべき。というかどうせ後から買い替えたくなる)
  • microSDカード(大容量のものがゴミみたいな値段で売られてる。OSがプリインストール済みとか無駄に高いから自分でやるべき。OSアップデートが一時的に容量食うので、余裕をもった容量を選ぶ)
  • HDMIケーブル(家に1本ぐらいあるでしょ)

そのほか、モニター・マウス・キーボードが「必要だったら」揃える。

microSDにOS書き込み

メインPC上でMicroUSBにOS(Raspbian)を書き込んでおく。モニター有りか無しかで書き込み方法が変わる。どちらもRaspberry Pi Downloads – Software for the Raspberry PiからDLできる。

(モニター有り・簡単・標準)上記リンクから「Raspberry Pi Imager for ****」というリンクを辿れば、SDカードのフォーマットとOSの書き込みを同時にやってくれるソフトが手に入る。楽ちん。

(モニター無し)上記リンクから「Raspberry Pi OS (previously called Raspbian)」というリンクを辿り、「Raspberry Pi OS (32-bit) with desktop and recommended software」または「同おすすめソフト無し版」のどちらかのzipファイルをダウンロードする。中からイメージファイルが出てくるので、イメージ書き込みソフト(balenaEtcher、Win32DiskImager、Upswift imgFlasherのどれか)を使ってSDカードに書き込む。
イメージ書き込み後、microSDのトップに「ssh(拡張子無し)」という名前の中身のないファイルを作成し、「wpa_supplicant.conf」という名前のファイルを、以下の中身で作成しておく。

country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
    ssid="SSID名"
    psk="暗号化キー"
}

これでRaspberryPiが勝手にWifiに繋ぎにいってくれる。SSHも許可しているので、メインPCからリモートでログインして残りの各種設定をする。

電源供給

モニター有りの場合は電源供給前にHDMIケーブルでモニターをつないでおくこと。モニター無しの場合SDカードアクセスランプが落ち着いたらOSが読み込まれたことになるので、その後で接続を試みるようにする。

設定

(モニター有り)パスワード決めろとか、言語とかタイムゾーンは何だとか、簡単なことを聞かれるので適当に設定。決めたパスワードはPiというユーザーのもの。Linuxサーバー的な話をするとrootユーザー以外にはPiというユーザーしか存在しない。

(モニター無し)まずRaspberryPiにどのIPが振られたのかを確認しないといけない。これはメインPCから総当たりでIPを探す方法と、ルーターの中を覗いてRaspberryPiに振られているIPを見つける方法がある。これはRaspberryPiが繋がっているWifiによる。ルーターが覗けるならそっちの方が早い。ホスト名が表示されるなら見つけるのは簡単だけど、もし表示されなくてもRaspberryPiのMacアドレスは「B8-27-EB-xx-xx-xx」か「DC-A6-32-xx-xx-xx」なので、それを手掛かりに特定する。もしルーターを覗くことが無理なら総当たりで探していくしかない。と言ってもそんな大変なものではなく、nmapというツールを使えば自動で総当たりpingを飛ばしてくれる。ダウンロード・使い方はここの「nmap command」を読めば分かる。
IPが分かったら、メインPCからコンソールを立ち上げ「ssh pi@(見つけたIP)」などと打ちSSH接続を行う。初期パスワードは「raspberry」。ログインできたら

$ sudo raspi-config

と打ち、設定画面を立ち上げる。各種設定はここが参考になる。パスワードは絶対に変えておく。

IP固定化

モニター有りの場合も、ここからはターミナルを立ち上げてコマンドラインで操作していくことになる。

DHCPサーバーのアドレス範囲

通常、Wifiに繋ぎにいったらルーターが勝手にLAN内IPを振ってくれる(DHCPサーバー機能)けど、その割り振り用IPには範囲が必ず設定されている。その範囲外で固定すれば他の機器が邪魔することはないってこと。結局ここでルーターを覗くことになるけど、覗けない環境の場合でも自動割り振りの範囲を無視してIPを固定化することはできる。ただIPが他の機器とぶつかっても知らんけどね。
ルーターを覗けばどこかにIPアドレスプールとかDHCPプールとかいう設定があるはず。それを確認する。もし変更できる権限があるのであれば、プール範囲を狭めてRaspberryPi用にIPを確保してもいいかもしれない。

IP固定化作業(RaspberryPi内)

モニター有りの場合はターミナルを立ち上げ、モニター無しの人はそのままSSH接続で、以下のコマンドを打つ。

$ sudo nano /etc/dhcpcd.conf

「nano」というRaspberryPi付属のテキストエディタが立ち上がるので、以下の内容を最後に追加してCtrl + Sでセーブ、Ctrl + Xでnanoを終了する。

interface wlan0
static ip_address=192.168.aaa.aaa/24
static routers=192.168.bbb.bbb
static domain_name_servers=192.168.bbb.bbb

192.168.aaa.aaaはRaspberryPiに割り当てたいIP、192.168.bbb.bbbはルーターのIP。

OSアップデート

以下のコマンドを打つ。モニターがある場合は「RaspberryPiの設定」からアップデートしても同じ。結構な時間がかかる。終わったら一応再起動。

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo reboot

メインPCからリモートデスクトップを試みる

RaspberryPiにrdpを入れる

RDP(Remote Desktop Protocol)を入れるためにxrdpというソフトをインストールする。昔はVNCが必要だったけど今は要らないらしい。そこまで詳しくないのでよく分からない。

$ sudo apt-get -y install xrdp

Windows標準のリモートデスクトップからアクセスを試みる

自分はWindowsしか知らないのと、Windows環境しかないので、Macの場合はまた今度。「リモートデスクトップ接続」というものを立ち上げ、オプションを表示。

コンピューターにさっき決めたIP、ユーザー名はpi。

画面タブでちょうどいいサイズを選んでおけば勝手にデスクトップサイズを合わせてくれる。

接続!

キター!

今後同じようにメインPCからリモートデスクトップ接続、またはSSH接続をすればモニター・キーボード・マウス無しでRaspberryPiを操作できる。

ちなみにリモートデスクトップからはシャットダウンボタンを押してもシャットダウンしないので、ターミナルを立ち上げて以下のコマンドを打つ。

$ sudo shutdown -h now

するとシャットダウンが始まり、リモートデスクトップの接続が切れるので、ランプが落ち着いてから電源を抜く。

セキュリティについて

セキュリティは別記事にまとめるとして、それまでは基本的にはRaspberryPiの電源を切るようにしておくこと。動かなければ乗っ取りもクソもない。

参考

RaspberryPi Raspbian ヘッドレスインストール(Buster編) – Qiita
Installing operating system images – Raspberry Pi Documentation
Setting up a Raspberry Pi headless – Raspberry Pi Documentation
IP Address – Raspberry Pi Documentation
Raspberry Pi 4 のMACアドレスの範囲が変わったぞ – Qiita