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

Raspberry Pi のインストール

Raspberry Pi (ラズベリーパイ) は ARM プロセッサを搭載したシングルボードコ ンピュータであり,OS として Linux が動作する. Raspberry Pi は安価な教育用のコンピュータとして世界中で使われている.

Raspberry Pi は基本的に SD カードからブートする. そのため, 「インストール = OS イメージを書き込んだ SD カードを作る」である. 本実習ではラズベリーパイ財団が公式にサポートしている Debian/GNU Linux ベースの OS である Raspberry pi OS を利用する.

イメージファイルのダウンロードと SD カードへのインストール

下記の URL からダウンロードできる "Raspberry Pi Imager" という OS イメージを SD カードにインストールするための公式ツールを用いれば良い.

<URL:https://www.raspberrypi.com/software/>

"Raspberry Pi Imager" を起動するとインストールする OS の選択画面があるが, 本演習では "Raspberry OS Full (32bit)" を用いる. "Full" を用いる理由は,後ほど apt-get コマンドでインストールする パッケージの数をなるべく少なくするためである (Raspberry Pi のディスクアクアセスは遅いので,パッケージインストールに時間がかかる).

なお,時間の節約のため,本演習では OS をインストールした SD カードを配布する

Raspberry Pi の初期セットアップ

Raspberry Pi には電源スイッチは無く, 電源コードを挿すと Raspbian がただちに起動する. なお, Raspberry Pi に以下の順番で周辺機器を接続すること. 電源コードを挿したあとに HDMI ケーブルを挿すと画面が映らないことがあるためである.

  • micro SD カードの挿入
  • ディスプレイと接続. HDMI ケーブルを利用する.
  • ワイヤレスのマウス・キーボードと接続. USB レシーバーを USB ポートに挿入する.
  • イーサネットケーブルの接続
  • 電源コードの接続

起動すると, 直ちに初期設定が始まる.

  • 言語設定は日本語にすること.
  • ユーザ名は学生番号にしておくこと.
  • 有線ネットワークを利用するので無線ネットワークの設定はスキップすること.
  • "UPDATE SOFTWARE" はスキップすること. 時間がかかりすぎるので.




再起動後, 「Raspberry Pi の設定」を実行する. デスクトップ左上の Menu の 「設定」から「Raspberry Pi の設定」をクリックする. さらに「システム」タブを選択し, 以下を行う.

  • 「ホスト名」の設定
    • ホスト名は学生番号にすること.
  • 「自動ログイン」の禁止.
    • 自動ログインはセキュリティ的に問題があるので, チェックを外す. 自動ログインを有効にしたままだと, 他人が勝手に自分のラズパイを起動し, 中に入っているデータを好き勝手に編集できてしまう.

"OK" を押すと再起動するか聞かれるので「Yes」を押して再起動する.

設定の前に. ターミナル

以下, ラズパイの設定をおこなっていくが, ターミナルからコマンドを打ち込むことが多い. ターミナルは以下の図のように, 左上のアイコン群から起動することができる.

なお, 以下では背景が灰色な部分はターミナル上でコマンドを実行することを意味する.

  • 先頭が "$" の場合は一般ユーザ権限でのコマンド実行,
  • 先頭が "#" の場合は管理者権限でのコマンド実行を意味する. sudo コマンドを使って管理者権限を使っていることに注意せよ.
  • 括弧内は説明であり, ファイルに書き込む必要はないことに注意せよ.

ネットワークへの接続

有線ネットワークに接続していることを前提として以下を行う.

ネットワークパラメタの確認方法

ネットワークパラメタを確認するためにターミナルを立ち上げ, ifconfig コマンドを実行する. 何もオプションを与えないと現在起動しているインターフェイスのネットワークの状態が全て表示される. eth0 は有線 LAN のインターフェイス, wlan0 は無線 LAN のインターフェイス, lo は「ローカルループバック」と呼ばれる特殊な項目 (ホスト自身を表す仮想インターフェイス)である.

ifconfig の出力のうち, 特に注目したいのは inet と netmask である (broadcast は inet と netmask から計算できる). 以下の例では 有線 LAN (eth0) の IP は 10.52.2.65 で netmask は 255.255.255.0, であることがわかる. 無線 LAN (wlan0) には接続していないので IP が設定されていないこともわかる.

$ ifconfig

  eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
     inet 10.52.2.65  netmask 255.255.255.0  broadcast 10.52.2.255         (<-- 注目!)
     inet6 fe80::80b6:95c5:47f9:a7f1  prefixlen 64  scopeid 0x20<link>
     ether b8:27:eb:9e:39:b1  txqueuelen 1000  (イーサネット)
     RX packets 13207  bytes 7069362 (6.7 MiB)
     RX errors 0  dropped 4  overruns 0  frame 0
     TX packets 3309  bytes 242427 (236.7 KiB)
     TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

  lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
     inet 127.0.0.1  netmask 255.0.0.0
     inet6 ::1  prefixlen 128  scopeid 0x10<host>
     loop  txqueuelen 1000  (ローカルループバック)
     RX packets 0  bytes 0 (0.0 B)
     RX errors 0  dropped 0  overruns 0  frame 0
     TX packets 0  bytes 0 (0.0 B)
     TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

  wlan0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
     ether b8:27:eb:cb:6c:e4  txqueuelen 1000  (イーサネット)
     RX packets 0  bytes 0 (0.0 B)
     RX errors 0  dropped 0  overruns 0  frame 0
     TX packets 0  bytes 0 (0.0 B)
     TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ゲートウェイは netstat -rn コマンド (もしくは route コマンド, ip route show コマンド) で確認することができる. 以下の例では, 有線 LAN (eth0) のゲートウェイは 10.52.2.254 であることがわかる.

$ netstat -rn

  カーネルIP経路テーブル
  受信先サイト    ゲートウェイ    ネットマスク   フラグ   MSS Window  irtt インタフェース
  0.0.0.0         10.52.2.254     0.0.0.0         UG        0 0          0 eth0
  10.52.2.0       0.0.0.0         255.255.255.0   U         0 0          0 eth0

ネットワークの接続テスト

ネットワークへの接続確認するために, まず最初に行うのは ping コマンドの実行である. ネットワーク接続している別の計算機に ping を送ってみよう. ネットワークに接続している場合は返事が戻ってくる. 但し, 最近の Windows などでは ping に返事しないのをデフォルトにしているケースもあるので注意せよ.

ping を止める時は Ctrl-c する (Control キーと c キーを一緒に押す).

$ ping www.epi.it.matsue-ct.jp

  PING dns02.epi.it.matsue-ct.jp (10.164.5.194) 56(84) bytes of data.
  64 bytes from 10.164.5.194 (10.164.5.194): icmp_seq=1 ttl=63 time=0.596 ms
  64 bytes from 10.164.5.194 (10.164.5.194): icmp_seq=2 ttl=63 time=0.546 ms
  64 bytes from 10.164.5.194 (10.164.5.194): icmp_seq=3 ttl=63 time=0.581 ms
  ^C
  --- dns02.epi.it.matsue-ct.jp ping statistics ---
  3 packets transmitted, 3 received, 0% packet loss, time 2003ms
  rtt min/avg/max/mdev = 0.546/0.574/0.596/0.020 ms

また, ネットワーク上の径路は traceroute コマンドで確認することができる. 以下の例では, www.epi.it.matsue-ct.jp (10.164.1.194) に到達する前に, ゲートウェイ 10.162.64.254 を通過していることがわかる.

$ traceroute www.epi.it.matsue-ct.jp  

  traceroute to www.epi.it.matsue-ct.jp (10.164.5.194), 30 hops max, 60 byte packets
   1  10.52.2.254 (10.52.2.254)  3.583 ms  3.668 ms  3.619 ms
   2  10.164.5.194 (10.164.5.194)  0.504 ms  0.371 ms  0.236 ms

パッケージの更新 & 新規インストール

パッケージの更新や新規インストールはネットワーク経由で行う.

国内のミラーサイトを使う設定にする.

Linux ではパッケージ管理システムを用いてネットワーク経由でソフトウェア (パッケージ) をインストールする. ネットワーク的に近いミラーサイトを利用する方がパケージのダウンロードにかかる時間が短くて済む. まず, パッケージをダウンロードするミラーサイトを国内 (JAIST) のものに変更する. 既存のものをコメントアウトして, ホスト名を ftp.jaist.ac.jp/raspbian/ に変更する.

なお, sudo は管理者権限を使うためのコマンドである.

$ sudo -s
# vi /etc/apt/sources.list  

  deb http://ftp.jaist.ac.jp/raspbian/ bullseye main contrib non-free rpi

パッケージの最新情報の取得.

パッケージの更新やインストールの前に必ず update でミラーサイトに置かれたパッケージのバージョンを確認する. apt update コマンドの結果をよく見て, 「エラー」が発生していないことを確認すること.

# apt update

  取得:1 http://ftp.jaist.ac.jp/raspbian bullseye InRelease [15.0 kB]
  取得:2 http://archive.raspberrypi.org/debian bullseye InRelease [23.6 kB]
  取得:3 http://ftp.jaist.ac.jp/raspbian bullseye/main armhf Packages [13.2 MB]
  取得:4 http://archive.raspberrypi.org/debian bullseye/main armhf Packages [207 kB]
  取得:5 http://ftp.jaist.ac.jp/raspbian bullseye/contrib armhf Packages [60.2 kB] 
  取得:6 http://ftp.jaist.ac.jp/raspbian bullseye/non-free armhf Packages [106 kB]
  取得:7 http://ftp.jaist.ac.jp/raspbian bullseye/rpi armhf Packages [1,360 B]
  13.6 MB を 12秒 で取得しました (1,107 kB/s)
  パッケージリストを読み込んでいます... 完了

パッケージの新規インストール

apt install <パッケージ名1> <パッケージ名2> ... という風にaptコマンドを用いることでパッケージのインストールができる. インストールしたいパッケージ名をinstallに続いて入力する.複数パッケージをインストールしたい場合はスペースで区切って渡してあげると良い.

なお, ラズパイは I/O が弱点で, パッケージのインストールにかなりの時間がかかることがある.

以下では例として, 日本語入力用のパッケージ ibus-anthy をインストールする. パッケージには依存関係があるため, 1 個のパッケージをインストールする命令を出しただけにもかかわらず, 30 個程度のパッケージがインストールされている. また, 「続行しますか? [Y/n]」と聞かれたら Y を押すこと.

# apt install ibus-anthy 

  パッケージリストを読み込んでいます... 完了
  依存関係ツリーを作成しています... 完了        
  状態情報を読み取っています... 完了        
  以下のパッケージが自動でインストールされましたが、もう必要とされていません:
    libfuse2
  これを削除するには 'apt autoremove' を利用してください。
  以下の追加パッケージがインストールされます:
    anthy anthy-common dconf-cli gir1.2-ibus-1.0 ibus ibus-data ibus-gtk ibus-gtk3 im-config kasumi libanthy1 libanthyinput0 libibus-1.0-5 liblinear4 liblua5.3-0 libpcap0.8 lua-lpeg nmap-common python3-ibus-1.0
  提案パッケージ:
    ibus-clutter ibus-doc liblinear-tools liblinear-dev ncat ndiff zenmap
  以下のパッケージが新たにインストールされます:
    anthy anthy-common dconf-cli gir1.2-ibus-1.0 ibus ibus-anthy ibus-data ibus-gtk ibus-gtk3 im-config kasumi libanthy1 libanthyinput0 libibus-1.0-5 liblinear4 liblua5.3-0 libpcap0.8 lua-lpeg nmap nmap-common python3-ibus-1.0
  アップグレード: 0 個、新規インストール: 21 個、削除: 0 個、保留: 73 個。
  20.4 MB のアーカイブを取得する必要があります。
  この操作後に追加で 127 MB のディスク容量が消費されます。
  続行しますか? [Y/n]  

  (... 以下略...)

# exit
注意事項

新規パッケージをインストールする際, パッケージ名を間違えると次のようなエラーメッセージが出る. ちゃんとエラーメッセージを確認して,パッケージ名のスペルミスがないか確認しよう.

$ sudo apt install emax vim

  パッケージリストを読み込んでいます... 完了
  依存関係ツリーを作成しています
  状態情報を読み取っています... 完了
  E: パッケージ emax が見つかりません

日本語入力

日本語をキーボードから入力できるように設定する. すでに Input method として anthy がインストールされているので, 以下のように「iBus の設定」をクリックして iBus デーモンを起動する (iBus の設定は特に変える必要はない).

デスクトップ右上の言語のアイコンを左クリックし, 日本語のインプットメソッドを Anthy にする.

実際に日本語入力可能とするためにはラズパイを再起動する必要がある. 上記の設定まで終わったら, ラズパイを一度再起動すること.

$ sudo reboot

再起動後, 左クリックすると入力モードが選べるので, そこで「ひらがな」「英数」などを切り替えられる. なお, キーボードで「半角/全角」キーや Ctrl-j (Ctrl キーを押しながら j キーを押す) でも「ひらがな」と「英数」の切り替えを行うことができる. 例えばブラウザを立ち上げて, 検索窓に日本語を入力できるか試してみるとよい.

校内無線 LAN ネットワークへの接続

松江高専の無線 LAN ネットワークに接続するために, WPA2 Enterprise の設定を行う.

無線 LAN 関係の設定ファイルは /etc/wpa_supplicant/wpa_supplicant.conf である. この設定ファイルをエディター (vi, nano, leafpad 等) で編集し, アクセスポイントの情報を追加する. なお, シェルにはタブ補完という便利機能があるので使ってみると良い (例えば, /e まで打ったところでタブを押すと /etc となる. /etc/wp まで打ったところでタブを押すと /etc/wpa_supplicant となる).

個人のパスワードを平文で設定ファイルに書き込むのはセキュリティ的に問題がある. 暗号化したパスワードを設定ファイルに保存することにする.

$ read -s pass
  ********  (Wi-Fi に接続するためのパスワードを入力.入力値は表示されない)

$ echo -n "$pass" | iconv -t utf16le | openssl md4

  (stdin)= YYYYYYYYYYYYYYYYYYYYYYYY

この (stdin)= の後に続く YYYYYYYYYYYYYYYYYYYYYYYY が暗号化したパスワードである. これを用いて無線 LAN 関係の設定ファイルを書き換える.

まず設定ファイルのバックアップを取る

$ sudo cp /etc/wpa_supplicant/wpa_supplicant.conf /etc/wpa_supplicant/wpa_supplicant.conf.bk

そしてファイルを編集する.

$ sudo vi /etc/wpa_supplicant/wpa_supplicant.conf

ファイルの内容は以下のようにする.カッコ内は注釈であるため,それは書かないこと.

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP
network={
      ssid="stu5"  
      key_mgmt=WPA-EAP
      eap=PEAP
      identity="jXXXX" (学生番号. ダブルクォーテーションで囲む)
      password=hash:YYYYYYYYYYYYYYYYYYYYYYYY (上記の (stdio)= 以降の文字列のコピペ. hash: という文字列を付けるのを忘れずに. ダブルクォーテーションで囲まないこと)
}

設定を有効にする./etc/init.d の下に wpa_supplicant の起動スクリプトが 置かれていないようなので,ここでは wpa_supplicant のプロセスに HUP をかける.

プロセス一覧は以下で表示することができる.

$ ps aux

wpa_supplicant のプロセス番号を調べ,それらに HUP をかける. (/etc/init.d/XXX restart や systemctl restart XXX で内部的に行われていることを手動で行ったにすぎない).

$ pgrep wpa_supplicant

  442
  551

$ sudo kill -HUP 442 551
なお,上記のようにプロセス番号を調べて kill -HUP するのが基本であるが,"$ sudo killall -HUP wpa_supplicant" でそれらをまとめて実行することもできる.

正しく設定されていれば校内の無線 LAN ネットワーク (stu5) に接続できるはずである.

ifconfig でネットワークパラメタを, iwconfig で wifi 関連のパラメタを確認できる. もしも wlan0 が表示されない場合は,wifi の電源が切れている可能性が高い. デスクトップ右上のネットワークのアイコンをクリックして,"Turn on wifi" とすること.

$ ifconfig

  ...(略)...

  wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
          inet 10.163.64.185  netmask 255.255.255.0  broadcast 10.163.64.255
          inet6 fe80::16d8:a409:bd12:9f61  prefixlen 64  scopeid 0x20<link>
          ether bc:5c:4c:58:36:46  txqueuelen 1000  (イーサネット)
          RX packets 27  bytes 6841 (6.6 KiB)
          RX errors 0  dropped 1  overruns 0  frame 0
          TX packets 39  bytes 6111 (5.9 KiB)
          TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

$ iwconfig 

  wlan0     IEEE 802.11gn  ESSID:"stu5"
            Mode:Managed  Frequency:2.462 GHz  Access Point: 78:7D:53:38:89:16
            Bit Rate:72.2 Mb/s   Sensitivity:0/0  
            Retry:off   RTS thr:off   Fragment thr:off
            Power Management:off
            Link Quality=39/100  Signal level=31/100  Noise level=0/100
            Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
            Tx excessive retries:0  Invalid misc:0   Missed beacon:0

トラブルシューティング

もしも無線 LAN に接続できない場合は, 設定ファイルが間違っている可能性が高い. 間違いを探すときは, 手動で以下の順にコマンドを実行すると良い. エラーの原因となる行番号が表示される.

wpa_supplicant のプロセス番号を調べる

$ pgrep wpa_supplicant

  354
  405
  423  

もし例のようにプロセス番号が表示されたらそれを KILL する. 表示がなければ次に進んで良い.

$ sudo kill -KILL 354 405 423

wpa_supplicant コマンドを実行する.

# wpa_supplicant -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf 

時刻管理

センサーを用いて観測を行う際は, 正確な観測時間の記録が必要不可欠である. そのため, ラズパイ (Linux) の時刻管理がどのようになされているか把握する必要がある.

Linux のシステム時刻には, ハードウェアクロックとシステムクロックの 2 つがある.

  • ハードウェアクロック
    • マザーボード上の IC によって提供される時計. マザーボード上の電池はこのためにある.
    • 電源を落としても時刻は進む.
    • RTC(Real Time Clock)とも呼ばれる.
  • システムクロック
    • Linux カーネルの内部に存在している時計.
    • 起動時に一度だけハードウェア・クロックを参照し, システム・クロックを設定する.
    • 時刻は 1970/01/01T00:00:00 からの経過時間 (UNIX TIME) として保持される.

ラズパイはハードウェアクロックを持たないので, hwclock コマンドを実行しても「ハードウェアクロックを参照できない」と表示される. (ラズパイに電池載ってないですよね?)

$ hwclock 

  hwclock: Cannot access the Hardware Clock via any known method.
  hwclock: Use the --debug option to see the details of our search for an access method.

ハードウェアクロックの代わりとして /etc/fake-hwclock.data がある. /etc/fake-hwclock.data に前回シャットダウンの時刻が世界標準時で記録されていて, これがシステムクロックから参照される. 起動時にラズパイの時刻がずれているのはこのためである.

$ cat /etc/fake-hwclock.data 

  2021-11-22 04:17:02

UNIX 系 OS で時刻を確認する標準コマンドは date である.

$ date

  2021年 11月 22日 月曜日 13:48:35 JST

systemdに導入された timdatectl コマンドでシステム時刻の各種表示形式を確認することができる. Local time は日本時間, Universal time は世界標準時である. リアルタイムクロック (RTC) は存在しないので n/a になっている. ここでポイントは "Network time on" と "NTP synchronized" で, ハードウェアクロックを持たない代わりにネットワーク経由で時刻合わせをしている.

$ timedatectl status

               Local time: 月 2017-10-16 22:27:43 JST
           Universal time: 月 2017-10-16 13:27:43 UTC
                 RTC time: n/a
                Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes                        (NTP 使う設定)
              NTP service: active                     (NTP 同期済み)
          RTC in local TZ: no

NTP (Network Time Protocol)

NTP はネットワーク経由での時刻同期するためのプロトコルである. 先の例にあるように, ラズパイは NTP を使う設定になっている. そのため, ラズパイ起動から一定時間経過すると, ラズパイのシステムクロックは NTP と同期して正しい値となる.

以下のようにオプションを与えると, NTP との同期のログが表示される. "q" キーを打鍵すると元のターミナルに戻る.

$ systemctl status systemd-timesyncd.service

  ● systemd-timesyncd.service - Network Time Synchronization
    Loaded: loaded (/lib/systemd/system/systemd-timesyncd.service; enabled; vendor preset: enabled)
    Drop-In: /lib/systemd/system/systemd-timesyncd.service.d
             └─disable-with-time-daemon.conf
    Active: active (running) since Mon 2017-10-16 19:28:25 JST; 3h 10min ago
      Docs: man:systemd-timesyncd.service(8)
   Main PID: 312 (systemd-timesyn)
     Status: "Synchronized to time server 108.61.223.189:123 (2.debian.pool.ntp.org)."
     CGroup: /system.slice/systemd-timesyncd.service
             └─312 /lib/systemd/systemd-timesyncd

  10月 16 19:28:24 iot-00 systemd[1]: Starting Network Time Synchronization...
  10月 16 19:28:25 iot-00 systemd[1]: Started Network Time Synchronization.
  10月 16 19:29:11 iot-00 systemd-timesyncd[312]: Synchronized to time server 108.61.223.189:123 (2.debian.pool.ntp.org).

NTPサーバは /etc/systemd/timesyncd.conf にて指定出来る. 学内の NTP サーバを使うように設定してみよ.

$ sudo -s
# vi /etc/systemd/timesyncd.conf 

  [Time]
  NTP=ntp.matsue-ct.jp  (サーバ名を入力)

# reboot

再起動後, 再び systemctl を用いて, NTP サーバとして ntp.matsue-ct.jp が 用いられていることを確認する (ログの部分に着目せよ).

$ systemctl status systemd-timesyncd.service

  ● systemd-timesyncd.service - Network Time Synchronization
     Loaded: loaded (/lib/systemd/system/systemd-timesyncd.service; enabled; vendor preset: enabled)
    Drop-In: /lib/systemd/system/systemd-timesyncd.service.d
             └─disable-with-time-daemon.conf
     Active: active (running) since Mon 2017-10-16 23:04:29 JST; 8min ago
       Docs: man:systemd-timesyncd.service(8)
   Main PID: 317 (systemd-timesyn)
     Status: "Synchronized to time server 10.0.10.158:123 (ntp.matsue-ct.jp)."        (<-- 注目!)
     CGroup: /system.slice/systemd-timesyncd.service
             └─317 /lib/systemd/systemd-timesyncd

  10月 16 23:04:29 iot-00 systemd[1]: Starting Network Time Synchronization...
  10月 16 23:04:29 iot-00 systemd[1]: Started Network Time Synchronization.
  10月 16 23:05:06 iot-00 systemd-timesyncd[317]: Synchronized to time server 10.0.10.158:123 (ntp.matsue-ct.jp).     (<-- 注目!)

ssh の設定

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

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

$ sudo -s

# apt-get update

# apt-get install fail2ban

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

セキュリティを高めるために,近年は SSH でパスワード認証ではなく, 公開鍵認証を行うのが一般的である. 公開鍵認証の説明は J4 ネットワークシステム 1 で行うので,ここでは割愛する.

[参考] フィルタリング : fail2ban (iptables)

fail2ban は後述するファイヤーウォール (iptables) のフロントエンドである. fail2ban はログを監視し, 特定のパターンに引っかかる動作が記録されたらファイヤウォールに動的にルールを追加して, 通信をブロックする. 例えば ssh のブルトフォース攻撃 (パスワード総当たり攻撃) のように, 頻繁にアクセス & ログイン失敗を繰り返すホストからのアクセスを切断する.

インストールは apt-get で行う.

$ sudo -s

# apt-get update

# apt-get install fail2ban

fail2ban の設定ファイルは /etc/fail2ban/jail.conf および /etc/fail2ban/jail.d/defaults-debian.conf である. 各ポートに対して /etc/fail2ban/filter.d/ 以下にフィルタが用意されている. デフォルトの設定では ssh のみ監視されている.

sshd が監視対象となっていることは, 以下のコマンドを実行すれば確かめられる.

# fail2ban-client status 

  Status
  |- Number of jail:   1
  `- Jail list: sshd

ban された時の動作

ssh で何度もパスワード入力を誤ると fail2ban によって ban される (以下のように ssh コネクションが切られる). デフォルトでは 10 分間接続不可となる.

$ ssh XX.XX.XX.XX

  ssh: connect to host 10.138.64.109 port 22: Connection refused

ラズパイで ssh アクセスで ban された IP を確認するためには以下のコマンドを実行する.

# fail2ban-client status sshd

    Status for the jail: sshd
     |- filter
     |  |- File list:	/var/log/auth.log 
     |  |- Currently failed:	0
     |  `- Total failed:	6
     `- action
        |- Currently banned:	1
        |  `- IP list:	10.164.1.197
        `- Total banned:	1

ban された IP を解除するには以下のようにコマンドをうつ.

# fail2ban-client set sshd unbanip XX.XX.XX.XX (ban された IP)

参考:スクリーンショット

本演習では, 課題を行った証拠としてスクリーンショットを提出してもらうことがある. ここでラズパイでのスクリーンショットの取り方を説明しておく. ターミナルを立ち上げて 以下のコマンドを実行せよ. ls コマンドを実行すると, 作成されたファイルの名前が確認できる.

$ scrot    

$ ls  (ファイルの確認)

  2017-10-02-190947_1024x768_scrot.png

ある一定の時間後 (以下では 10 秒後) にスクリーンショットを取りたい場合は, -d オプションを用いる.

$ scrot -d 10

作成したファイルを確認するには, 上部に並んだアイコンから「ファイルマネージャー」を選び, 画像のアイコンをクリックすると良い.

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

自分のラズパイの IP アドレスを調べて (調べ方は <URL:lecture-note_RPi-1.htm> を参照のこと), Windows からラズパイにログインできることを確認しなさい.

ログインできた証拠として,以下のようなターミナル (teraterm, putty, etc.) のスナップショットを提出すること.提出するスナップショットには必ず以下が含まれないといけない.なお,このスナップショットは Windows PC で取得するものであることに注意すること.

  • ラズパイのホスト名
  • ラズパイの IP アドレス
  • ラズパイにログインしたユーザのユーザ名

[Extra 1]課題 : ネットワーク用語

  • ifconfig コマンド, netstat コマンド, iwconfig コマンドの出力結果を元に, 以下の値を調べて wbt のオンラインテキストに報告せよ.
    • IP アドレス
    • netmask
    • broadcast (計算すること)
    • ゲートウェイ
  • IP アドレス, netmask, broadcast, ゲートウェイ, の意味を調べて wbt のオンラインテキストに報告せよ.
  • systemctl status systemd-timesyncd.service コマンドの出力を wbt のオンラインテキストにコピペせよ. さらに使われている ntp サーバの IP とホスト名を答えよ.