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

ユーザ管理

ユーザの作成

自分と教員のユーザアカウントを作成する. サーバ (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

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

課題 (3)

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

なお, usermod コマンドであるユーザを複数グループに登録する場合は, usermod -G GroupA, GroupB, GroupC, ... USER というように, グループ名をカンマ区切りで並べれば良い.

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

管理者権限の設定

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

raspberry pi では管理者 root のパスワードは潰されており, root でログインすることはできない. そのことは /etc/shadow の root のパスワードフィールドが * になっていることから分かる.

$ sudo -s

# grep root /etc/shadow

  root:*:17416:0:99999:7:::

# exit
$

Linux で管理者権限を用いる時は, root でログインするのではなく, sudo コマンドを用いるのが一般的である. raspbian においては, 初期ユーザ pi は sudo が使えるように最初から設定されているが, 新たに作成したユーザについては自分で sudo の設定を行わねばならない. root のパスワードを設定し, それを複数人で共有することを決してしてはならない.

今回は新たに作成した自分のアカウントと教員のユーザアカウントについて sudo の設定を行う. sudo コマンドの設定ファイル (/etc/sudoers) を確認すると, sudo グループに属するユーザは管理者権限を行使できるようになっていることがわかる. 先頭の "%" はグループを意味するので, 以下の例の "%sudo" は "sudo グループに属するユーザ" という意味である. すなわち, デフォルトで sudo グループに属するユーザは管理者権限を使えるようになっている.

$ sudo -s
# cat /etc/sudoers

  (...中略...)
    # Allow members of group sudo to execute any command
    %sudo   ALL=(ALL:ALL) ALL
  (...後略...)

# exit
$

前節で hogehoge を sudo グループに追加したので, 実は彼らは管理者権限を使うことができるようになっている. 確認を行うために, まずは, su コマンドを使って新たに作成したユーザ hogehoge にログインし, sudo -s コマンドを実行する. プロンプトが $ から # へ変わることを確認する. sudo コマンドを初めて実行するときは, 管理者権限を使う心得が表示されるので, 心に刻むこと.

pi$ whoami  (現在のユーザを確認)

  pi     

pi$ su hogehoge  (ユーザの変更)

  パスワード:

hogehoge$ whoami  (現在のユーザを確認)

  hogehoge

hogehoge$ sudo -s    (hogehoge から管理者に移行) 

  あなたはシステム管理者から通常の講習を受けたはずです。
  これは通常、以下の3点に要約されます:

     #1) 他人のプライバシーを尊重すること。
     #2) タイプする前に考えること。
     #3) 大いなる力には大いなる責任が伴うこと。

    [sudo] hogehoge のパスワード:

#                (管理者権限となったのでプロンプトが # に変わる)

# exit           (管理者から hogehoge へ移行)

hogehoge$ exit   (hogehoge から pi へ移行)

pi$ 

なお, これまで使っていた pi ユーザでは sudo を行う際に一々パスワードを入力する必要がなかった. これは, pi ユーザはパスワードを入力をしなくて良いという設定がなされているためである. 具体的には, ファイル /etc/sudoers.d/010_pi-nopasswd に設定 "NOPASSWD" が書かれている.

pi$ sudo -s

# cat /etc/sudoers.d/010_pi-nopasswd 

  pi ALL=(ALL) NOPASSWD: ALL

パスワードを入力せずに済ませるのはセキュリティ的にはよろしくないが, pi ユーザと同様に設定しておかないと動作がおかしくなることがあるため, 仕方なく行うことにする. 以下のように sudo の NOPASSWD の設定を追加する. hogehoge は適宜自分のユーザ名に読み替えること. また, 011_hogehoge-nopasswd や 012_sugiyama-nopasswd はパーミッションが 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/ 以下のファイルで書き間違いするとラズパイが動かなくなる. 書き間違いの無いよう注意すること.

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 [個別的な設定]

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

# reboot

ログ

以降は, 新たに作成したユーザ 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/jxxxx/.ssh/id_rsa):  (何も入力せず Enter キーを押す => 鍵が /home/jxxxx/.ssh/id_rsa に作られる)
  Enter passphrase (empty for no passphrase):                     (パスフレーズを入力, 画面表示されない)
  Enter same passphrase again:                                    (パスフレーズを入力, 画面表示されない)
  Your identification has been saved in /home/jxxxx/.ssh/id_rsa.
  Your public key has been saved in /home/jxxxx/.ssh/id_rsa.pub.
  The key fingerprint is:
  36:12:2d:9f:5f:14:50:92:16:3e:99:77:68:f0:fa:fa jxxxx@sky
  The key's randomart image is:
  +---[RSA 2048]----+
  |          ==o    |
  |       . .o* o   |
  |      o ..= * .  |
  |       + . * .   |
  |      . S . .    |
  |       o o o     |
  |          . .    |
  |           .     |
  |          ..E    |
  +-----------------+

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

VM$ ssh-keygen -e

  Enter file in which the key is (/home/hogehoge/.ssh/id_rsa):     (何も入力せず Enter キーを押す)
  ---- BEGIN SSH2 PUBLIC KEY ----
  Comment: "2048-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 からラズパイに公開鍵認証でリモートアクセス可能とすること.

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

ラズパイからサーバ (VM) へ公開鍵認証を用いたリモートアクセスを可能にする. サーバ (VM) では既にパスワード認証をサポートしていないため, 前述の ssh-copy-id コマンドでは公開鍵をラズパイからサーバに送ることはできない.

課題 (6)

ラズパイで公開鍵を作成せよ. さらに<URL:lecture-note_vm.htm#label-17>の教員の公開鍵の設定と同様に手動で ~/.ssh/authorized_keys の設定を行うことで, ラズパイからサーバ (VM) へ公開鍵認証を用いたリモートアクセスを可能にせよ.

セキュリティ対策

開きポートの確認

セキュリティ対策 ポートの確認 を参考に netstat コマンドを用いて 空きポートを確認する. 22 (ssh) のみが開いていることを確認する.

  • 22 番ポート(ssh) が全てのホスト (0.0.0.0, ::) に対して開いていることを確認する.

もしも 22 以外のポートが開いている場合は, 誤って余計なパッケージをインストールしてしまった可能性が高い. 誤ってインストールしたパッケージを削除すればポートを閉めることができるが, まずは教員に相談するとよい.

また, nmap コマンドは標準ではラズパイにインストールされていないので, もし nmap コマンドを 使いたい場合は, apt-get install nmap で nmap をインストールする必要がある.

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 のアカウントをロックすること.

課題

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

      $ wget http://www.gfd-dennou.org/arch/iotex/oss/IoTeX_2020/check_2020.rb
      
      $ ruby check_2020.rb
      
        IP Address : 127.0.0.1
        USER Name : hogehoge
        +++ CHECK 1: USER OK! ++++++++++++++++++++++++++
        +++ CHECK 2: Login OK! +++++++++++++++++++++++++
        +++ CHECK 3: Groups OK! ++++++++++++++++++++++++
        ["hogehoge", "adm", "dialout", "cdrom", "sudo", "audio", "video", "plugdev", "games", "users", "input", "netdev", "gpio", "i2c", "spi"]
        +++ CHECK 4: sudo & /etc/shadow for sugiyama OK! ++++++++++++
        sugiyama:*:18219:0:99999:7:::
        +++ CHECK 5: NTP server OK! +++++++++++++++++++
           Status: "Synchronized to time server for the first time 10.0.10.6:123 (ntp.matsue-ct.jp)."
        開いているポート :["22/tcp", "25/tcp", "10050/tcp"]
        +++ CHECK 6: Network ports OK! +++++++++++++++++
        +++ CHECK 7: fail2ban install OK! +++++++++++++
        ii  fail2ban                              0.10.2-2.1                            all          ban hosts that cause multiple authentication errors
        +++ CHECK 8: sshd_config OK! +++++++++++++
        PasswordAuthentication no
        +++ CHECK 9: settings of user pi OK! +++++++++++++
        pi:!$....... (略)
      
        **************** ALL CLEAR *********************