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 *********************