SSHを使用し追加のキーボードとマウス、ディスプレイ無しでWindows PCからRaspberry Pi 3 の初期設定+セキュリティ設定をする

この記事は、Raspberry Pi Advent Calendar 2017 - Qiita17日目の記事となります。

Google Homeを買ったら意外と面白かったため、Google Homeを軸としたスマートホーム化を試みようとしました。常時起動用PCとしてRaspberry Piを使いたくなったのですが、初期設定のためだけに追加のキーボードとマウス、ディスプレイを用意するのは面倒だったので、それらを使わずにRaspberry Pi 3の初期設定をしました。またネットワークに常時接続するためセキュリティ設定もしました。

設定する環境

Raspbian Stretch Lite(デスクトップ無しの環境)+公開鍵認証方式のSSH+ファイアウォール

使うもの

  • Raspberry Pi 3 Model B
  • マイクロSDカード(8GB以上推奨、今回は16GB。ラズパイとSDカードには相性があるらしいので注意)
  • マイクロUSB Bタイプ対応のACアダプタ
  • LANケーブル
  • Windows 10 PC(試していないがmacOSLinuxからの接続も当然できるはず。一方Windowsのバージョンが古いとopensshが使えない可能性がある)
  • PowerShell
  • PC内蔵SDカードアダプタ or 外付けSDカードアダプタ(PCでSDカードを認識させるのに利用)

タイトルの通り、今回はRaspberry Piの初期設定のためだけに別途キーボードやディスプレイを用意することはありません。SDカードには注意が必要で相性があるそうです。詳しくはこちらをご覧ください。

主な参考資料

前半はHeadless Raspberry Pi Setup、後半はRaspberry Piを攻撃から守るための手順 を特に参考にしました。

Raspbian LiteのイメージをダウンロードしSDカードにイメージを焼く

英語が分かる方は下のサイトをご覧ください。

www.raspberrypi.org

まず下のサイトから"RASPBIAN STRETCH LITE"のzip版を選択しダウンロードします。

www.raspberrypi.org

次にSDメモリカードフォーマッターを使用してSDカードをフォーマットします。

SDカードをフォーマットしたら、SDカードにイメージを焼くソフトであるEtcherをインストールします。

Etcherを使用して最初にダウンロードしたイメージを用意したSDカードに焼きます。

最後にSDカードのbootパーテーションに"ssh"という名前のファイルを作成します。拡張子はつけないでください。この操作はデフォルトで無効化されているSSHを有効にするために必要です。

Raspberry Piの起動

  • SDカード
  • ACアダプタ
  • LANケーブル

Raspberry PiにつなげてRaspberry Piを起動します。

SSHRaspberry Piに接続

まず、LANにつながっているデバイスを探索するために、Advanced IP Scannerをインストールします。scanを開始し、"raspberrypi"という名前のデバイスが見つかることを確認します。

次に、WindowsからSSH接続するために、MS公式のOpenSSHモジュールを使用します。下のサイトを参考にしました。

azure.sios.jp

まずここからOpenSSH-Win64.zipをダウンロードし、任意の場所へ展開します。今回は 'C:\Program Files\' に展開しました。

PowerShellを管理者権限で実行します。その上でPowerShellの実行ポリシーをRestrictedに変更します。

PS Get-ExecutionPolicy
Restricted
PS Set-ExecutionPolicy RemoteSigned
PS Get-ExecutionPolicy
RemoteSigned

次にインストールスクリプトを実行します。

PS cd 'C:\Program Files\OpenSSH-Win64\' #展開場所に移動
PS .\install-sshd.ps1
# 環境変数を追加
PS $path = [System.Environment]::GetEnvironmentVariable("Path", "Machine")
PS $path += ";c:\Program Files\OpenSSH-Win64"
PS [System.Environment]::SetEnvironmentVariable("Path", $path, "Machine")

そしてPowerShellを再起動すると、sshが実行できるようになるのでRaspberry Piに接続します。

PS ssh
usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]
           [-D [bind_address:]port] [-E log_file] [-e escape_char]
           [-F configfile] [-I pkcs11] [-i identity_file]
           [-J [user@]host[:port]] [-L address] [-l login_name] [-m mac_spec]
           [-O ctl_cmd] [-o option] [-p port] [-Q query_option] [-R address]
           [-S ctl_path] [-W host:port] [-w local_tun[:remote_tun]]
           destination [command]
PS ssh pi@raspberrypi.local 
password: #初期パスワードはraspberry
pi@raspberrypi: ~ $ #SSHで接続出来た

raspi-configからの各種設定

ここを参考にします。

タイムゾーンの設定

Raspberry Piの時刻設定をGMTから東京のタイムゾーンに変更します。

"4 Localization Options" > "I2 Change Timezone" > "Asia" > "Tokyo"

パーティションの拡張

初期イメージのままではパーティション2GBのみしか使用できないので、フルに活用するためにパーティションを拡張します。

"7 Advanced Options" > "A1 Expand Filesystem"

ホスト名変更

将来的にRaspberry Pi複数運用もありえるかもしれないので、名前が重複しないように"raspi01"のようにホスト名を変更します。

"2 Network Options" > "N1 Hostname"

raspi-configを終了するとrebootするか聞かれるため、素直にrebootします。

Wi-fi設定

Wi-fiに接続します。raspi-configからWi-fiを設定するとWi-fiパスフレーズが平文で保存されるためセキュリティホールになります。

$ sudo sh -c 'wpa_passphrase SSID パスフレーズ >> /etc/wpa_supplicant/wpa_supplicant.conf'
$ sudo vi /etc/wpa_supplicant/wpa_supplicant.conf
# #psk="*************"の行を削除する
$ sudo reboot

Wi-fiにつながっているはずなので、LANケーブルを抜きこれ以降は無線で接続します。

アカウント設定

アカウント名:pi、パスワード:raspberryは危険すぎるので、変更します。参考はこちらです。

まず、あとで無効化するのですが、念のためpiのパスワードを変更します。

$ passwd

次にアカウントを追加し、パスワードを設定します。

$ sudo /usr/sbin/useradd --groups sudo -m user # userは好きなユーザー名に置き換え
$ sudo passwd user

ルートパスワードを設定し、piを無効化します。

$ sudo passwd root
$ sudo passwd --lock pi

ここでpiをログアウトしuserにログインすると、ログインシェルがshで非常に悲しいこととなるので、デフォルトのシェルをbashに変更します。

$ sudo vi /etc/passwd
# user:x:1001:1001::/home/newuser:
# ->user:x:1001:1001::/home/newuser:/bin/bash に変更

ここでpiからexitでログアウトし、newuserで接続します。

公開鍵認証方式での接続によるSSHの保護

平文パスワードでSSHに接続するのは危ないので、公開鍵認証方式に変更します。

公開鍵・秘密鍵の生成

まず、公開鍵、秘密鍵をPC側で生成します。

PS ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (C:\Users\<User>/.ssh/id_rsa): # そのままで良い
Enter passphrase (empty for no passphrase): # 秘密鍵を保護するパスワードを設定(安全な場所にメモすること)
Enter same passphrase again: # パスワード再入力

成功していれば、~/.ssh/id_rsa秘密鍵が、~/.ssh/id_rsa.pubに公開鍵が保存されます。

公開鍵をRaspberry Piに登録する

公開鍵をRaspberry Piに送り、登録します。

 cat ~/.ssh/id_rsa.pub | ssh user@raspi01.local 'mkdir ~/.ssh; cat >> ~/.ssh/authorized_keys; chmod 700 ~/.ssh; chmod 600 ~/.ssh/authorized_keys'

ここでsshに接続するとパスワードではなくRSAパスフレーズが聞かれるようになります。

PS ssh user@raspi01.local
Enter passphrase for key 'C:\Users\User/.ssh/id_rsa': # パスワードじゃない

SSHサーバーの設定変更

/etc/ssh/sshd_configを変更して、SSHをより強固にします。

$ sudo vi /etc/ssh/sshd_config
Port 50000 # 49152-65535のうち好きなポート番号
PermitRootLogin no
# RSAを使った公開鍵認証を明示的に使えるようにする
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys
# 平文パスワード禁止
PasswordAuthentication no
# 空文パスワード禁止
PermitEmptyPasswords no
# Pluggable Authentication Modules(PAM)を無効化
UsePAM no
$ sudo systemctl restart ssh

SSHで接続できるか確認するために別のシェルで接続します。

PS ssh user@raspi01.local -p 50000

ssh configの設定

ポート番号をいちいち打ち込むのは面倒なのでssh configを設定します。

PS vi ~/.ssh/config
Host raspi01
  HostName raspi01.local
  User user
  Port 50000
  ServerAliveInterval 1
  ServerAliveCountMax 1
PS ssh raspi01 # これで接続できるはず

パッケージの更新

パッケージを更新します。

まずデフォルトの接続先設定だと極端に遅くなることがあるため、近くのサーバーを直接設定します。ミラーサーバーの一覧はこちらです。

$ sudo vi /etc/apt/sources.list
#deb http://mirrordirector.raspbian.org/raspbian/ stretch main contrib non-free rpi # コメントアウト
deb http://ftp.jaist.ac.jp/raspbian/ stretch main contrib non-free rpi

例えば上のようにします。

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

時間がかかりますが、これでパッケージが更新できます。

vimのインストール

一応何もしなくてもvimは使えるのですが、デフォルトのよりも新しくインストールするほうが使いやすいそうなので、インストールします。emacs派はそっちで。

$ sudo apt-get install vim

ファイアウォールの設定(執筆中)

ufwを使います(現在作成中)。

参考資料

https://hackernoon.com/raspberry-pi-headless-install-462ccabd75d0

www.bleepingcomputer.com

qiita.com

Raspberry Pi 3 Model B をインストールしてSSH接続できるようにしてみる – CLARA ONLINE techblog

azure.sios.jp

makezine.jp

www.feijoa.jp

qiita.com

qiita.com

www.llul.info