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

はじめに

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

ユーザ管理

昨年度まではラズパイの初期ユーザ名は pi で固定されていたが (2017年度以前はパスワードは raspberry で固定だったが), 現在は初期ユーザ名を自由につけることができるようになった. 管理者としての設定など一通りなされているので,ここではそれを確認する.

グループの確認

新規作成したユーザ hogehoge (hogehoge は適宜自分のユーザアカウントに読み替えること) の所属するグループを確認する.初期に作成したユーザは管理者が入るべきグループに入っていることがわかる.このうち, 最初の hogehoge グループはシステムの作るユーザ名と同じ名前のグループである.

$ groups hogehoge

  hogehoge adm dialout cdrom sudo audio video plugdev games users input render netdev lpadmin gpio i2c spi

管理者権限の設定

新規作成したユーザ hogehoge (hogehoge は適宜自分のユーザアカウントに読み替えること) が sudo コマンドで管理者権限を使えるのは,hogehoge が sudo グループに含まれているためである. 設定ファイル /etc/sudoers を確認すると,サーバ (VM) と同様に sudo グループに属するユーザは管理者権限を使えるようになっていることが分かる.

sudo するときは自分のパスワードを入力すのがデフォルトであるが, Raspberry Pi の初期ユーザ hogehoge はパスワード入力なしで sudo できるようになっている. パスワードを入力せずに済ませるのはセキュリティ的にはよろしくないが, パスワード入力不要にしないと挙動が怪しいことがあるので,そのままにしておく.

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

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

ファイル 010_pi-nopasswd を確認すると,パスワード不要という設定が書かれていることがわかる.

$ sudo -s

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

   hogehoge ALL=(ALL) NOPASSWD: ALL

ユーザのログの確認

ユーザのログインの履歴は 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

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

穴埋め (1)

<URL:lecture-note_sec_ssh.htm>を参考に, Windows からラズパイに公開鍵認証でリモートアクセス可能とすること. 前回にサーバ (VM, 10.176.0.XX) にアクセスするために作った公開鍵をそのまま使っても良い.

セキュリティ対策

開放ポートの確認

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

$ sudo netstat -ntlp

   稼働中のインターネット接続 (サーバのみ)
   Proto 受信-Q 送信-Q 内部アドレス            外部アドレス            状態        PID/Program name
   tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1693/sshd: /usr/sbi
   tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      516/cupsd
   tcp6       0      0 :::22                   :::*                    LISTEN      1693/sshd: /usr/sbi
   tcp6       0      0 ::1:631                 :::*                    LISTEN      516/cupsd
   tcp6       0      0 :::4369                 :::*                    LISTEN      1/init

$ nmap  localhost -p 0-5000

  Starting Nmap 7.80 ( https://nmap.org ) at 2022-10-22 18:27 JST
  Nmap scan report for localhost (127.0.0.1)
  Host is up (0.00049s latency).
  Other addresses for localhost (not scanned): ::1
  Not shown: 4998 closed ports
  PORT     STATE SERVICE
  22/tcp   open  ssh
  631/tcp  open  ipp
  4369/tcp open  epmd

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

今回は次の「穴埋め (2)」で SSH 以外のポートは閉めるので, 631, 4369 ポートはこのままにしておく.

穴埋め (2)

セキュリティ対策 ファイヤーウォールを用いる を参考に ufw で「受信は SSH のみ」「送信は全て OK」という設定を行いなさい.

SSH の設定

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

$ sudo -s

# apt-get update

# apt-get install fail2ban

穴埋め (3)

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

再起動

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

$ sudo -s

# reboot

課題

  • 本文中の穴埋め (1)--(3) を行い, 作業を完成させよ.
  • チェックテストを実行し,エラーが出ないことを確認すること. 以下のようにラズパイにチェックスクリプトをダウンロードし, 実行してみるとよい.
    • 必ず一般ユーザ権限で行うこと.管理者権限で行うと NG が出る.

      $ sudo apt install nmap
      
      $ wget http://www.gfd-dennou.org/arch/iotex/oss/IoTeX_2022/check_2022.rb
      
      $ ruby check_2022.rb
      
        IP Address : 127.0.0.1, 10.52.2.66
        USER Name : hogehoge
      
        +++ CHECK: USER OK! ++++++++++++++++++++++++++
      
        +++ CHECK: Groups OK! ++++++++++++++++++++++++
      
        +++ CHECK: NTP server OK! +++++++++++++++++++
      
        開いているポート (127.0.0.1) :["22/tcp", "631/tcp", "4369/tcp"]
        開いているポート (10.52.2.66 ):["22/tcp", "4369/tcp"]
      
        +++ CHECK: fail2ban install OK! +++++++++++++
      
        PasswordAuthentication no
        +++ CHECK: sshd_config OK! +++++++++++++
      
        "Default: deny (incoming), allow (outgoing), disabled (routed)"
        "22/tcp (SSH)               ALLOW IN    Anywhere                  "
        +++ CHECK: ufw settings OK! +++++++++++++
      
        **************** ALL CLEAR *********************