2021 年度 OSS リテラシ 3 : Raspberry Pi のセットアップ (2)

はじめに

今回の手順書は穴埋めになっています.本文中の穴埋め (1)--(8) を順番に行い, 作業を完成させなさい.

ユーザ管理

ユーザの作成

自分と教員のユーザアカウントを作成する. サーバ (VM) のDebian の基本セットアップを参照して, 以下の課題を行うこと. なお, 標準的な Linux コマンドの解説は, 例えば LPI-Japan「Linux 標準教科書」 を参照のこと.

穴埋め (1)

自分のユーザアカウントを adduser コマンドで作成する. アカウント名はサーバ (VM) のアカウント名と同じとすること.

穴埋め (2)

教員のユーザアカウント (sugiyama) をパスワードなし (adduser コマンドで --disabled-password オプション付き) で作成する. 教員のユーザアカウントは sugiyama とすること.

グループの設定

新規作成したユーザ hogehoge (hogehoge は適宜自分のユーザアカウントに読み替えること) と sugiyama をユーザ pi と同じグループに登録する (十分調査していないが, 同じグループに入れておかないとラズパイの動作がおかしくなることがあった).

まず, ユーザ pi の所属するグループを一覧する. /etc/group を直接見ても良いが, groups コマンドを使う方が簡単である.

$ sudo -s

# groups pi

  pi : pi adm dialout cdrom sudo audio video plugdev games users input netdev spi i2c gpio lpadmin

このうち, 最初の pi グループはシステムの作るユーザ名と同じ名前のグループである. pi グループ以外のグループに hogehoge と sugiyama を追加する. サーバ (VM) のDebian の基本セットアップを参照して, 以下の穴埋めを行うこと.

穴埋め (3)

usermod コマンドを用いて, hogehoge と sugiyama を pi の所属するグループ (除く pi) に追加せよ.

なお, usermod コマンドであるユーザを複数グループに登録する場合は, usermod -aG GroupA, GroupB, GroupC, ... USER というように, グループ名をカンマ区切りで並べれば良い. usermod のオプションは -aG とすること.a は add の意味で,a を抜かして -G とするとグループ情報が置換されてしまい,元々入っていたグループから抜けてしまう.

また, 登録後に /etc/group を less で表示し, hogehoge や sugiyama が上記グループに含まれていることを確認せよ.

管理者権限の設定

新規作成したユーザ hogehoge (hogehoge は適宜自分のユーザアカウントに読み替えること) と sugiyama の両名を sudo コマンドで管理者権限を使えるように設定する.

設定ファイル /etc/sudoers を確認すると,サーバ (VM) と同様に sudo グループに属するユーザは管理者権限を使えるようになっていることが分かる (「Debian の基本セットアップ」で確認手順を参照すること).

sudo するときは自分のパスワードを入力すのがデフォルトであるが, Raspberry Pi のデフォルトユーザである pi はパスワード入力なしで sudo できるようになっている. パスワードを入力せずに済ませるのはセキュリティ的にはよろしくないが, pi ユーザと同様に設定しておかないと動作がおかしくなることがあるため, 仕方なくパスワード入力不要な設定を行うことにする.

raspbian のような Debian 系 Linux の場合, 各種設定ファイルは「全体設定」と「個別的設定」が別々のファイルとなっていて, 個別設定は *.d/ というディレクトリに置かれていることが多い.  今までに出てきた例としては, sudo や apt の設定が挙げられる.

  • /etc/sudoers [全体設定]
  • /etc/sudoers/sudoers.d/010_pi-nopasswd [個別的な設定]
  • /etc/apt/sources.list [全体設定]
  • /etc/apt/sources.list/sources.list.d/raspi.list [個別的な設定]

そのため,今回は /etc/sudoers/sudoers.d 以下に 011_hogehoge-nopasswd や 012_sugiyama-nopasswd というファイルを作り, そこにパスワード不要な設定を書く (hogehoge は自分のアカウント名に読み替えること). なお,ファイルのパーミッションは 440 なので, vi で編集して保存するときは ":wq!" (ビックリマークで強制書き込み) する必要がある.

# cd /etc/sudoers.d

# cp 010_pi-nopasswd 011_hogehoge-nopasswd

# vi 011_hogehoge-nopasswd

  (以下のようにユーザ名部分のみ書き換える)
  hogehoge ALL=(ALL) NOPASSWD: ALL

# cp 010_pi-nopasswd	012_sugiyama-nopasswd

# vi 012_sugiyama-nopasswd

  (以下のようにユーザ名部分のみ書き換える)
  sugiyama ALL=(ALL) NOPASSWD: ALL
注意 : /etc/sudoers.d/ 以下のファイルで書き間違いするとラズパイが動かなくなる. 書き間違いの無いよう注意すること.

設置が終わったら再起動する.

# reboot

再起動後はユーザ pi ではなく,新たに作成したユーザ (hogehoge) でログインせよ. また,再起動後に sudo -s コマンドでパスワードを聞かれることなく管理者権限になれるかも確認せよ.

ログ

以降は, 新たに作成したユーザ hogehoge でログインしているものとする.

ログの確認

ユーザのログインの履歴は last コマンドや lastlog コマンドで確認することができる. last コマンドは時系列で, lastlog コマンドはユーザ毎にログイン履歴を表示する.

hogehoge$ last

  hogehoge pts/1        10.164.1.197     Sat Sep 30 16:14   still logged in
  hogehoge tty7         :0               Sat Sep 30 16:13    gone - no logout
  reboot   system boot  4.9.41-v7+       Thu Jan  1 09:00   still running
  pi       pts/1        10.164.1.197     Sat Sep 30 15:13 - 16:11  (00:57)
  pi       tty7         :0               Sat Sep 30 15:11 - 16:11  (00:59)
  reboot   system boot  4.9.41-v7+       Thu Jan  1 09:00 - 16:11 (17439+07:11)
  pi       tty7         :0               Sat Sep 30 15:05 - down   (00:04)
  ...(後略)...
hogehoge$ lastlog

  ユーザ名         ポート   場所             最近のログイン
  root                                       **一度もログインしていません**
  ...(中略)...
  pi               pts/1    10.164.1.197     土  9月 30 15:13:18 +0900 2017
  ...(中略)...
  hogehoge         pts/1    10.164.1.197     土  9月 30 16:14:31 +0900 2017

また, sudo コマンドを用いて管理権限を実行した場合, /var/log/auth.log に記録される. cat コマンドを使うとファイルの内容全てが表示されるが, tail コマンドを使うとファイル末尾だけを表示させることができる (-n 以下に表示する行数を与える).

hogehoge$ sudo -s
# cat /var/log/auth.log

 ...(中略)....
 Sep 30 16:19:26 iot-00 sudo: hogehoge : TTY=pts/1 ; PWD=/home/hogehoge ; USER=root ; COMMAND=/bin/cat /var/log/auth.log
 Sep 30 16:19:26 iot-00 sudo: pam_unix(sudo:session): session opened for user root by hogehoge(uid=0)

# tail -n 10 /var/log/auth.log

 ...(中略)....
 Sep 30 16:19:26 iot-00 sudo: hogehoge : TTY=pts/1 ; PWD=/home/hogehoge ; USER=root ; COMMAND=/bin/cat /var/log/auth.log
 Sep 30 16:19:26 iot-00 sudo: pam_unix(sudo:session): session opened for user root by hogehoge(uid=0)

ssh の設定

SSH インターフェイスの設定を変更しないと, ラズパイは SSH 接続を受け付けない. "メニュー" => "設定" => "Raspberry Pi の設定" を起動し, "インターフェイス" タブを選択する. 以下のように SSH を「有効」にする.

ssh の接続テスト (ローカルホスト内)

まず始めに, テストとしてローカルホスト (ラズパイ自身) に ssh でログインする. なお, 初めて ssh 接続するホストの場合は鍵を .ssh/known_host ファイルに登録してよいか聞かれるが通常は "yes" で良い. パスワードを入力するとログインが完了する. ログアウトする場合は exit を入力する. w コマンドでログイン情報が表示できる.

$ ssh localhost

  The authenticity of host 'localhost (::1)' can't be established.
  ECDSA key fingerprint is SHA256:kxOhw7sERvC9lrf0LddfB0ekBrKfqUZAohy5N/EaYaM.
  Are you sure you want to continue connecting (yes/no)? yes                      (<-- 鍵の登録)
  Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
  hogehoge@localhost's password:                                                  (<-- パスワード入力)
  Linux iot-00 4.9.41-v7+ #1023 SMP Tue Aug 8 16:00:15 BST 2017 armv7l

  The programs included with the Debian GNU/Linux system are free software;
  the exact distribution terms for each program are described in the
  individual files in /usr/share/doc/*/copyright.

  Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
  permitted by applicable law.
  Last login: Thu Oct 19 13:37:06 2017 from 10.164.1.197

$ w 

  04:56:53 up 15:25,  3 users,  load average: 0.00, 0.00, 0.00
  USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
  hogehoge tty7     :0               木13    15:25m 21.04s  0.30s /usr/bin/lxsession -s LXDE-pi -e LXDE
  hogehoge tty1     :0               04:06    0.00s  0.33s  0.09s ssh localhost
  hogehoge pts/2    ::1              04:56    5.00s  0.26s  0.03s w

$ ls
$ exit

リモートアクセス (公開鍵認証): サーバ (VM) => ラズパイ

以下ではサーバ (VM) とラズパイを区別するために, サーバ上で実行するコマンドについては, プロンプトの前に VM の文字列を付す.

例)
  $ ls      (ラズパイで実行するコマンド)
  # ls      (ラズパイで実行するコマンド)
  VM$ ls    (サーバ (VM) で実行するコマンド)
  VM# ls    (サーバ (VM) で実行するコマンド)

まずサーバ上で ssh 公開鍵を作成する. 途中, 「パスフレーズ」を入力するよう求められる. これは公開鍵認証を行うときに使うパスワードみたいなもので, 他で使っていない 文字列を入力すること.

VM$ ssh-keygen 

  Generating public/private rsa key pair.
  Enter file in which to save the key (/home/hogehoge/.ssh/id_rsa):  (何も入力せず Enter キーを押す => 鍵が /home/hogehoge/.ssh/id_rsa に作られる)
  Enter passphrase (empty for no passphrase):                     (パスフレーズを入力, 画面表示されない)
  Enter same passphrase again:                                    (パスフレーズを入力, 画面表示されない)
  Your identification has been saved in /home/hogehoge/.ssh/id_rsa.
  Your public key has been saved in /home/hogehoge/.ssh/id_rsa.pub.
  The key fingerprint is:
  36:12:2d:9f:5f:14:50:92:16:3e:99:77:68:f0:fa:fa hogehoge@sky
  The key's randomart image is:
  +---[RSA 2048]----+
  |          ==o    |
  |       . .o* o   |
  |      o ..= * .  |
  |       + . * .   |
  |      . S . .    |
  |       o o o     |
  |          . .    |
  |           .     |
  |          ..E    |
  +-----------------+

公開鍵の種類とbit長は以下のコマンドで確認できる. "Comment:" 行に注目すると, この鍵の場合は鍵の bit 長が 3072 の RSA 形式であることがわかる.

VM$ ssh-keygen -e

  Enter file in which the key is (/home/hogehoge/.ssh/id_rsa):     (何も入力せず Enter キーを押す)
  ---- BEGIN SSH2 PUBLIC KEY ----
  Comment: "3072-bit RSA, converted by hogehoge@iot-00 from OpenSSH"
  AAAAB3NzaC1   .... (以下略).....

  ---- END SSH2 PUBLIC KEY ----

公開鍵をラズパイへコピーするため, ssh-copy-id コマンドを実行する. hogehoge は適宜自分のアカウント名で読み替えること.

VM$ ssh-copy-id hogehoge@XX.XX.XX.XX (ラズパイの IP)

  ECDSA key fingerprint is 4f:aa:eb:69:d0:29:42:32:d4:75:6d:4b:3c:ce:9b:a6.
  aAre you sure you want to continue connecting (yes/no)? yes    (yes 入力)

  /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
  /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
  hogehoge@10.138.64.114's password:        (ラズパイのパスワード入力)

  Number of key(s) added: 1

  Now try logging into the machine, with:   "ssh 'hogehoge@10.138.64.114'"
  and check to make sure that only the key(s) you wanted were added.

テスト接続を行う. 公開鍵認証が優先されるので, パスフレーズの入力が求められる.

VM$ ssh -l hogehoge XX.XX.XX.XX

  Enter passphrase for key '/home/hogehoge/.ssh/id_rsa':     (パスフレーズの入力)

  Linux iot-00 4.9.41-v7+ #1023 SMP Tue Aug 8 16:00:15 BST 2017 armv7l

  The programs included with the Debian GNU/Linux system are free software;
  the exact distribution terms for each program are described in the
  individual files in /usr/share/doc/*/copyright.

  Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
  permitted by applicable law.
  Last login: Mon Oct  2 19:54:47 2017 from 10.164.1.197

$ exit   (ラズパイからログアウト)

VM$ 

リモートアクセス: 教員

穴埋め (4)

<URL:lecture-note_vm.htm#label-17>を参考に, ラズパイにおいて教員の公開鍵の設定を行うこと.

リモートアクセス: Windows => ラズパイ

穴埋め (5)

<URL:lecture-note_sec_ssh.htm>を参考に, Windows からラズパイに公開鍵認証でリモートアクセス可能とすること.

セキュリティ対策

開放ポートの確認

セキュリティ対策 ポートの確認 を参考に netstat コマンドや nmap コマンドを用いて 空きポートを確認する. もしも 22 以外のポートが開いている場合は, それらを閉じることにする. 実際に netstat や nmap コマンドで実際に開いているポートを確認してみると,631, 4369 が開いていることがわかるだろう.

631 ポートは Internet Printing Protocol であることが,/etc/services に書かれている. このポートは名前の通り,ネットワークプリンタのためのポートである. 検索すればすぐに分かるが,このポートを管理しているサーバソフトウェアは cups (Common UNIX Printing System) である.

$ grep 631 /etc/services 

  ipp        631/tcp             # Internet Printing Protocol

また,4369 ポートは, Erlang で使うものらしい.以下のように /etc/services で確認できる.

$ grep 4369 /etc/services 

  epmd        4369/tcp         # Erlang Port Mapper Daemon

Erlang に関係するパッケージは dpkg -l コマンドで確認できる.

$ dpkg -l | grep Erlang

  ii  erlang-base                           1:23.2.6+dfsg-1                   armhf        Erlang/OTP virtual machine and base applications
  ii  erlang-crypto                         1:23.2.6+dfsg-1                   armhf        Erlang/OTP cryptographic modules
  ii  erlang-syntax-tools                   1:23.2.6+dfsg-1                   armhf        Erlang/OTP modules for handling abstract Erlang syntax trees

穴埋め (6)

セキュリティ対策 ポートを閉める を参考に /etc/init.d 以下のスクリプトを用いて 631 ポートを閉めてみよ. なお,cups 関係は,cups と cups-browsed の 2 つあることに注意せよ.

/etc/init.d 以下のスクリプトでは,一時的にポートを閉める (= サーバソフトウェアをシャットダウンする) だけであるため,再起動すると再びサーバソフトウェアが起動し,ポートが開いてしまう. 再起動した時にも cups が起動しないようにするためには,systemctl disable コマンドを使う. systemctl コマンド (特に disable オプション) の使い方を検索して,再起動しても cups が起動しないようにしてみよ.

4369 ポートを閉める方は,Erlang に関係するパッケージをアンインストールすることで実現せよ. apt-get remove コマンドで,erlang-base を削除してみよ.

最終的に netstat コマンドや nmap コマンドで,631, 4369 が閉じたことを確認すること.

SSH の設定

ssh のブルトフォース攻撃 (パスワード総当たり攻撃) を防ぐのに有効な fail2ban をインストールする. fail2ban の詳細は <URL:lecture-note_sec_ssh.htm#label-9> を参照すること.

$ sudo -s

# apt-get update

# apt-get install fail2ban

穴埋め (7)

さらにセキュリティを高めるために パスワード認証を無効化し, 公開鍵認証のみサポートする. <URL:lecture-note_sec_ssh.htm#label-6> を参照して, パスワードによる認証を無効にし, 公開鍵認証のみをサポートせよ.

不要なユーザのアカウントのロック

穴埋め (8)

<URL:lecture-note_sec_user.htm> を参照に, 不要なユーザ pi のアカウントをロックすること.

再起動

最終的に再起動を行うこと.

$ sudo -s

# reboot

課題

  • 本文中の穴埋め (1)--(8) を行い, 作業を完成させよ.
  • 教員が実行するチェックスクリプトに合格すること. 教員に学生番号とラズパイの IP を伝えること.
    • 教員に連絡する前に自分でテストしてエラーが出ないことを確認すること. 以下のようにラズパイにチェックスクリプトをダウンロードし, 実行してみるとよい.

      $ wget http://www.gfd-dennou.org/arch/iotex/oss/IoTeX_2021/check_2021.rb
      
      $ ruby check_2021.rb
      
        IP Address : 127.0.0.1
        USER Name : sugiyama 
      
        +++ CHECK: USER OK! ++++++++++++++++++++++++++
      
        +++ CHECK: Groups OK! ++++++++++++++++++++++++ 
      
        +++ CHECK: user sugiyama OK! ++++++++++++ 
      
        +++ CHECK: NTP server OK! +++++++++++++++++++
      
        開いているポート (local) :["22/tcp"]
        +++ CHECK: Network ports (local) OK! +++++++++++++++++ 
      
        開いているポート :["22/tcp"]
        +++ CHECK: Network ports OK! +++++++++++++++++ 
      
        +++ CHECK: fail2ban install OK! +++++++++++++ 
      
        PasswordAuthentication no
        +++ CHECK: sshd_config OK! +++++++++++++ 
      
        +++ CHECK: settings of user pi OK! +++++++++++++
      
        **************** ALL CLEAR *********************