2018 年度 OSS リテラシー 3 : 第 8 回 サーバセットアップ

はじめに

本演習ではサーバとして VMware 上の仮想マシンを用いる. 仮想マシンは既に Debian GNU/Linux 9 の基本インストールが終了しているので, ラズパイで行ってきたのと同様な各種設定を行うことにする.

なお, 仮想マシンの IP, ユーザ名などは演習時間中に周知する.

仮想マシンへのログイン

演習で周知された IP, ユーザ名, パスワードを用いて仮想マシンへログインせよ. 演習室の Windows の putty を用いること.

基本セットアップ

sudo コマンドをインストールする前に root 権限を使う場合は,

$ su 

として, root ユーザに切り替えること. 途中でパスワードが聞かれるが, そこでは自分のパスワードでなく root のパスワードを入力すること.

ホスト名の変更

まずは現在のホスト名を表示する.

# hostname

  jxxxx

以下のように変更する. ここで<学生生番号>は適宜修正すること.

# hostnamectl set-hostname <学生番号>

# hostname

  <学生番号>

このままでは後にワーニングが出ることがある. /etc/hosts 内の jxxxx を学生番号に修正すること.

# vi /etc/hosts

  127.0.0.1     localhost
  127.0.0.1     <学生番号>.epi.it.matsue-ct.jp    <学生番号>    (この行を修正)

パッケージの更新

パッケージの更新の際に使うリポジトリは既に /etc/apt/sources.list に記述されており, それを変更する必要はない. 以下のように update & upgrade を行うこと.

# apt-get update

  無視:1 http://ftp.jp.debian.org/debian stretch InRelease
  取得:2 http://ftp.jp.debian.org/debian stretch-updates InRelease [91.0 kB]
  ヒット:3 http://ftp.jp.debian.org/debian stretch Release                                 
  ヒット:4 http://security.debian.org/debian-security stretch/updates InRelease            
  91.0 kB を 0秒 で取得しました (175 kB/s)                  
  パッケージリストを読み込んでいます... 完了

# apt-get upgrade

  パッケージリストを読み込んでいます... 完了
  依存関係ツリーを作成しています                
  状態情報を読み取っています... 完了
  アップグレードパッケージを検出しています... 完了
  以下のパッケージは保留されます:
    linux-image-amd64
  アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 1 個。

ネットワークの設定: 固定 IP の利用

設定ファイル /etc/network/interfaces を設定する. 利用する IP は 10.176.0.0/24 とする. IP の最後の 8 byte は自分のラズパイの番号 (101~150) と同じにする.

# cd /etc/network

# cp interfaces interfaces.bk  (バックアップ作成)

# vi interfaces 

  # The primary network interface
  allow-hotplug ens192
  #iface ens192 inet dhcp
  iface ens192 inet static
          address         10.176.0.xxx      (xxx は自分のラズパイ番号とする)
          netmask         255.255.255.0
          gateway         10.176.0.254   
          dns-nameservers 10.0.0.7 10.0.0.1

設定が終わったら再起動して設定を有効にする.

# reboot

再起動後に再度サーバへ ssh でログインする.

時刻の設定

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

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

ラズパイはハードウェアクロックを持たなかったが, 仮想サーバにはハードウェアクロックが存在する.

$ su

# hwclock 

  2018-12-04 09:17:57.213243+0900

systemdに導入された timdatectl コマンドでシステム時刻の各種表示形式を確認することができる. Local time は日本時間, Universal time は世界標準時である. ここでポイントは "Network time on" と "NTP synchronized" で, ネットワーク経由で時刻合わせをしていることがわかる.

# timedatectl status
        Local time: 火 2018-12-04 09:18:29 JST
    Universal time: 火 2018-12-04 00:18:29 UTC
          RTC time: 火 2018-12-04 00:18:29
         Time zone: Asia/Tokyo (JST, +0900)
   Network time on: yes
  NTP synchronized: yes
   RTC in local TZ: no

学内の NTP サーバを使うように設定してみよ.

# vi /etc/systemd/timesyncd.conf 

  [Time]
  NTP=ntp.matsue-ct.jp          (ホスト名の設定)
  FallbackNTP=0.debian.pool.ntp.org 1.debian.pool.ntp.org 2.debian.pool.ntp.org 3.debian.pool.ntp.org    (コメントアウト外す)

# 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 pres
    Drop-In: /lib/systemd/system/systemd-timesyncd.service.d
             └─disable-with-time-daemon.conf
     Active: active (running) since Tue 2018-12-04 09:20:39 JST; 21s ago
       Docs: man:systemd-timesyncd.service(8)
   Main PID: 473 (systemd-timesyn)
     Status: "Synchronized to time server 10.0.10.6:123 (ntp.matsue-ct.jp)."
      Tasks: 2 (limit: 4915)
     CGroup: /system.slice/systemd-timesyncd.service
             └─473 /lib/systemd/systemd-timesyncd

ユーザ管理

自分自身と教員のユーザアカウントを作成し, 両名を sudo コマンドで管理者 権限を使えるように設定する.

以下の例では自分自信のアカウント名は hogehoge としているが, 適宜希望アカウント名で置き換えること. ラズパイのユーザ名と同じにしておくのが良いだろう.

なお標準的な Linux コマンドの解説は, 例えば LPI-Japan「Linux 標準教科書」 を参照のこと.

自分のユーザアカウントの作成

まずは root のパスワードを変更する.

$ su

# passwd

  新しい UNIX パスワードを入力してください:       (キーボード入力しても何も表示されない)
  新しい UNIX パスワードを再入力してください:
  passwd: パスワードは正しく更新されました


# exit

$ 

現在のアカウント名を確認してみよう. 現在のユーザが jxxxx であることが確認できる.

$ whoami

   jxxxx

自分のユーザアカウントを adduser コマンドで作成する. 以下ではアカウント名を hogehoge としているが, 各自の好きな文字列で置き換えること (学籍番号は使わない). ターミナルを起動し, adduser コマンドでユーザを作成する. 途中で名前や部屋番号など 聞かれるが, フルネームのみ真面目に入力すれば良い.

$ su

# adduser hogehoge (hogehoge の部分は適宜変更すること)

  ユーザ `hogehoge' を追加しています...
  新しいグループ `hogehoge' (1001) を追加しています...
  新しいユーザ `hogehoge' (1001) をグループ `hogehoge' として追加しています...
  ホームディレクトリ `/home/hogehoge' を作成しています...
  `/etc/skel' からファイルをコピーしています...
  新しい UNIX パスワードを入力してください:
  新しい UNIX パスワードを再入力してください:
  passwd: パスワードは正しく更新されました
  hogehoge のユーザ情報を変更中
  新しい値を入力してください。標準設定値を使うならリターンを押してください
  フルネーム []: SUGIYAMA Ko-ichiro    (自分の名前を入れる)
  部屋番号 []: 
  職場電話番号 []: 
  自宅電話番号 []: 
  その他 []: 
  以上で正しいですか? [Y/n] 

教員のユーザアカウントの作成

教員のユーザアカウント (sugiyama) を作成する. ここではパスワードを設定しないので, --disabled-password オプションを付けて adduser コマンドを実行する. フルネームには SUGIYAMA Ko-ichiro と入れること.

# adduser --disabled-password sugiyama

  ユーザ `sugiyama' を追加しています...
  新しいグループ `sugiyama' (1002) を追加しています...
  新しいユーザ `sugiyama' (1002) をグループ `sugiyama' として追加しています...
  ホームディレクトリ `/home/sugiyama' を作成しています...
  `/etc/skel' からファイルをコピーしています...
  sugiyama のユーザ情報を変更中
  新しい値を入力してください。標準設定値を使うならリターンを押してください
      フルネーム []: SUGIYAMA Ko-ichiro
      部屋番号 []: 
      職場電話番号 []: 
      自宅電話番号 []: 
      その他 []: 
  以上で正しいですか? [Y/n] Y

グループの設定

新規作成したユーザ hogehoge と sugiyama をグループ netdev と sudo に加えておく.

# usermod -G netdev,sudo hogehoge

# usermod -G netdev,sudo sugiyama

確認として, /etc/group の中身を確認する.

# grep netdev /etc/group

  netdev:x:108:jxxxx,hogehoge,sugiyama

# grep sudo /etc/group

  sudo:x:27:sugiyama,hogehoge

管理者権限の設定

Linux で管理者権限を用いる時は, root でログインするのではなく, sudo コマンドを用いるのが一般的である. ラズパイと同様に sudo を使って管理者権限を使えるようにする.

# apt-get update

  ...略...

# apt-get install sudo

  ...略...

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

# cat /etc/sudoers

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

# exit

$ exit     (ログアウト)

なお今回はパスワードなしで sudo 権限を使えるようにする必要がない.

再ログインと sudo の確認

再度仮想マシンにログインをする. ログインする際はユーザ hogehoge を使うこと.

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

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

  hogehoge

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

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

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

    [sudo] hogehoge のパスワード:

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

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

$ exit           (ログアウト)

ssh の設定

次に, 公開鍵認証による ssh 接続を許可する. sshd_config の中の "PubkeyAuthentication yes" と書かれた行のコメントアウトを外す. 設定を変更した後は必ず SSH サーバを再起動すること.

$ sudo -s
  [sudo] hogehoge のパスワード:

# vi /etc/ssh/sshd_config 

  ...(略)...
  PubkeyAuthentication yes      (コメントアウトを外す)
  #PubkeyAuthentication yes

# /etc/init.d/ssh restart       (SSH サーバの再起動)

  [ ok ] Restarting ssh (via systemctl): ssh.service.

# exit
$

リモートアクセス (公開鍵認証): sky サーバ => 仮想マシン

自分のアカウントの設定

まず, 仮想マシンからサーバ sky.epi.it.matsue-ct.jp にログインする. サーバと仮想マシンの区別をするために, サーバのコマンドプロンプト ($, #) の 前にホスト名 (sky) を付けていることに注意せよ.

$ ssh -l jxxxx sky.epi.it.matsue-ct.jp

  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.

 sky$ 
 sky$

既にサーバ上で ssh 公開鍵を作成したので, それを仮想マシンにもコピーする. 公開鍵をコピーするために ssh-copy-id コマンドを実行する.

sky$ 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.176.0.151's password:        (仮想マシンのパスワード入力)

  Number of key(s) added: 1

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

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

sky$ ssh -l hogehoge XX.XX.XX.XX

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

  Linux iotex 4.9.0-7-amd64 #1 SMP Debian 4.9.110-3+deb9u2 (2018-08-13) x86_64

  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: Tue Dec  4 09:55:39 2018 from 10.163.64.125

$ exit   (仮想マシンからログアウト)

sky$ 

教員のアカウントの設定

教員のアカウントで, サーバから仮想マシンにログインできるようにする. 以下で行う手順 (1), (2) は ssh-copy-id コマンドの内部で実際に行なわれている処理である (ssh-key-copy コマンドが使えないから).

1) サーバ上の公開鍵を転送.

sky$ scp /home/sugiyama/sugiyama-id_rsa.pub hogehoge@XX.XXX.XXX.XXX:~/

sky$ exit   (サーバからログアウト)

$           (仮想マシンに移動)

2) 仮想マシンにおいて教員の公開鍵を設定する. 転送した公開鍵を手動で ~sugiyama/.ssh/authorized_keys に保存する. ファイル/ディレクトリの所有者とパーミッションを適切に設定すること.

$ sudo -s

# cd /home/sugiyama
# mkdir .ssh
# chmod 700 .ssh/  (パーミッション変更) 
# chown sugiyama.sugiyama .ssh/  (所有者・所有グループ変更)

# ls -ld .ssh/ (確認)

   drwx------ 2 sugiyama sugiyama 4096 11月  1 00:23 .ssh/

# mv /home/hogehoge/sugiyama-id_rsa.pub .ssh/authorized_keys
# chmod 600 .ssh/authorized_keys
# chown sugiyama.sugiyama .ssh/authorized_keys
# ls -l .ssh/authorized_keys

   -rw------- 1 sugiyama sugiyama 394 12月  4 10:09 .ssh/authorized_keys

メール

メールサーバの設定

MTA (Mail Transfer Agent) として postfix, sendmail, qmail が有名であるが, 今回は外部からのメール受信を行わないので高機能な MTA は必要ない. Debian のデフォルトの MTA である exim を用いることにする. mailutils パッケージをインストールすると, それが依存する exim 関連のパッケージも一緒にインストールされている.

# apt-get update

  ...(略)...

# apt-get upgrade

  ...(略)...

# apt-get install mailutils

  ...(略)...

外部へメールを送るための設定を行う. メールの送信には高専のメールサーバ (red.matsue-ct.jp) をリレーする. 外部からのメールは受信しないことにする.

# dpkg-reconfigure exim4-config         

dpkg-reconfigure コマンドを実行すると, ターミナル上にグラフィカルな設定画面が表示される. タブを押すと <了解> <取消> を選択することができる.

  • メール設定のタイプ: スマートホストでメール送信; SMTP または fetchmail で受診する
    • メールは全て高専のメールサーバ (スマートホスト) に送信するので. 仮想マシンから高専の外部のサーバへ SMTP できない.

  • システムメール名: iot-XX (各仮想マシンのホスト名)
    • デフォルトのホスト名のまま変更しなくて良い. 後ほど書き換えを有効にする.

  • 入力側 SMTP 接続をリスンする IP アドレス: 127.0.0.1
    • 外部からのメールを受信しない. 127.0.0.1 はローカルホストを意味する IP.

  • メールを受け取るその他の宛先: (空欄)
    • 外部からのメールを受信しないので, 設定する必要がない.

  • メールをリレーするマシン: (空欄)
    • ほかのホスト向けのスマートホストにする必要がない

  • スマートホスト: red.matsue-ct.jp

  • 送信するメールでローカルメール名を隠しますか? : はい

  • 表示するローカルユーザのドメイン名: epi.it.matsue-ct.jp
    • epi.it.matsue-ct.jp は情報工学科杉山研究室のサブドメイン.
    • これを有効にしないと, スマートホスト (red.matsue-ct.jp) が受信を拒否する.

  • DNS クエリの数を最小限にとどめますか? : いいえ
    • インターネットに常時接続しているので.

  • ローカルメールの配送方法: /var/mail 内の mbox 形式

  • 設定を小さなファイルに分割しますか? : いいえ

root などのシステム宛てメールの転送設定

システムが発送する root 宛てのメールの宛先を自分自身に変更しておく. 意味としては, ":" の前に書かれているユーザ宛てのメールを ":" の後ろに書かれているユーザに送る, である.

# vi /etc/aliases

  # /etc/aliases
  mailer-daemon: postmaster
  postmaster: root
  nobody: root
  hostmaster: root
  usenet: root
  news: root
  webmaster: root
  www: root
  ftp: root
  abuse: root
  noc: root
  security: root
  root: xxxx@matsue-ct.jp       (この行を書き換える. 自分自身のメールアドレスに) 

設定を有効にするには, newaliases コマンドを実行する必要がある.

# newaliases

自分宛てのメールの転送設定

自分宛てのメールを転送する場合は, ホームディレクトリに .forward ファイルを置く.

# exit

$ vi ~/.forward 

  xxxx@matsue-ct.jp       (自分自身のメールアドレスを 1 行だけ書く) 

$ chmod 600 ~/.forward

ローカルメールの送受信確認

ローカルメール配送の確認を行う. まずは mail コマンドを使って /etc/aliases の内容が反映されているか確認する. 以下のメールが自分のメールボックスに配送されることを確認すること.

$ echo "本文1" | mail -s "タイトル1" root

$ echo "本文2" | mail -s "タイトル2" webmaster

$ echo "本文3" | mail -s "タイトル3" postmaster

$ echo "本文4" | mail -s "タイトル4" hogehoge

セキュリティ対策

不要なポートを閉じる

開いているポートを確認するには, netstat コマンドや nmap コマンドを用いる. なお, nmap コマンドはクラッキングの前段階として行われることが多いので, 無用の誤解を与えないために localhost 以外のホストに対して実行しないこと.

netstat -ntl コマンドを実行する. 以下の例では, 22 番ポート (SSH) が全ての IP アドレス (0.0.0.0) に対して開いており, 25 番ポート (SMTP) が自分 (127.0.0.1) に対してのみ 開かれていることがわかる. また IPv6 で 22 番ポート (SSH) が全ての IP アドレス (0.0.0.0) に対して開かれていることがわかる.

$ netstat -ntl

  稼働中のインターネット接続 (サーバのみ)
  Proto 受信-Q 送信-Q 内部アドレス            外部アドレス            状態       
  tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
  tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN     
  tcp6       0      0 :::22                   :::*                    LISTEN     

ssh の設定の修正

ssh でパスワードによる認証を無効にし, 公開鍵認証のみをサポートする.

$ sudo -s

# vi /etc/ssh/sshd_config

  # To disable tunneled clear text passwords, change to no here!
  #PasswordAuthentication yes  (変更前)
  PasswordAuthentication no    (変更後, yes -> no にすること)

設定を変更したら ssh サーバを再起動する.

# /etc/init.d/ssh restart        

  [ ok ] Restarting ssh (via systemctl): ssh.service.

# exit
$ exit

確認を行う. サーバにログインしてから仮想マシンに対して ssh コマンドを実行する.

sky:~$ ssh -l hogehoge  XX.XX.XX.XX (仮想マシンのユーザ名と IP を使うこと)

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

   ...(略)...

$          (仮想マシンに再度ログイン) 

$ exit     (仮想マシンからサーバへ)

sky$ 

TCP Wrapper によるアクセス制限

TCP Wrapper を用いて ssh 接続を許可するホストを限定する. 設定ファイルは /etc/hosts.allow と /etc/hosts.deny の 2 つである. 動作としては /etc/hosts.allow に書かれたアクセスルールが最初に適用され, 次に /etc/hosts.deny に書かれたアクセスルールが適用される.

まず, /etc/hosts.allow において, サーバ sky.epi.it.matsue-ct.jp (10.100.100.1) のみに SSH アクセスの許可を出すことにする.

$ sudo -s

# vi /etc/hosts.allow

  sshd: 10.100.100.1   (末尾に追記)

書式としては, コロンの前にデーモン名 (SSH ならば sshd (ssh daemon)), コロンの後ろにホスト名である. ホスト名には .matsue-ct.jp のように, matsue-ct.jp のドメインを持つ全てのホスト, という書き方もできる.
[注: 書式的にはドメインで書いても良いはずだが, IP で指定しないとうまく動かなかった]

次に, /etc/hosts.deny において, 全てのホストからの接続を禁止する 設定を行う. ALL: ALL とすると, 外部の全てのホストから, 全てのデーモン (ポート) へのアクセスを拒否することとなる.

# vi /etc/hosts.deny

  ALL: ALL     (末尾に追記)

TCP wrapper は再起動は必要なく, 編集したファイルの内容は直ちに適用される.

以上の設定で, sky.epi.it.matsue-ct.jp 以外は仮想マシンのどのポートにもアクセスできなくなったはずである. 動作確認として, 友人の仮想マシンに SSH 接続してみよ. 正しく設定されていれば, 以下のように Connection がリセットされ, SSH 接続できないことがわかる.

$ ssh -l pi XX.XX.XX.XX (友人の仮想マシンの IP)

  ssh_exchange_identification: read: Connection reset by peer

さらに確認として, サーバからは仮想マシンに対して ssh 接続できることを確かめる.

sky:~$ ssh -l hogehoge  XX.XX.XX.XX (自分の仮想マシンの IP)

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

  ...(略)...
$          (仮想マシンに再度ログイン) 

$ exit     (仮想マシンからサーバへ)

sky$ 

フィルタリング : fail2ban (iptables)

本演習では iptables のフロントエンドとして実装されたソフトウェア fail2ban を用いる. iptables を直接設定するのは初心者には難しいためである.

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

まず, iptables の現在の設定を確認する. すでに fail2ban をインストールしているので, fail2ban のエントリも存在する.

$ sudo -s    

# apt-get update

  ....(略)...

# apt-get install fail2ban

  ....(略)...

# iptables -L 

  Chain INPUT (policy ACCEPT)
  target     prot opt source               destination         

  Chain FORWARD (policy ACCEPT)
  target     prot opt source               destination         

  Chain OUTPUT (policy ACCEPT)
  target     prot opt source               destination         

  Chain f2b-sshd (0 references)
  target     prot opt source               destination         
  RETURN     all  --  anywhere             anywhere           

fail2ban の設定ファイルは /etc/fail2ban/jail.conf および /etc/fail2ban/jail.d/defaults-debian.conf である. 各ポートに対して /etc/fail2ban/filter.d/ 以下にフィルタが用意されている. デフォルトの設定では ssh のみ監視が有効にされている. 本演習のラズパイでは ssh 以外に外部からアクセス可能なポートを開けていないので, ssh 以外のフィルタを有効にする必要はない.

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

# fail2ban-client status 

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

[参考] ban された時の動作

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

sky$ 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)

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

ユーザーアカウントをロックすると, そのアカウントは使用不可の状態になりログインすらできなくなる. ユーザ jxxxx はもはや必要ないので, このアカウントをロックする.

$ sudo -s 
# passwd -l jxxxx

  passwd: パスワード期限切れ情報を変更しました

# exit

$ su jxxxx         (ユーザ jxxxx にスイッチ)

  パスワード:
  su: 認証失敗

なお, パスワードロックを外す場合は, $ passwd -u jxxxx とすればよい.

Web サーバのインストール

Web サーバとして Apache2 を利用する. 以下のように apache2 パッケージをデフォルト設定で Web サーバが起動する.

$ sudo -s

# apt-get update

# apt-get install apache2

課題

  • http://10.176.0.XXX (XXX は自分の仮想マシンの IP) にブラウザでアクセスしてみよ. ブラウザで表示されるページは /var/www/html/ 以下におかれている. /var/www/html に適当な HTML ファイルを追加設置し, ブラウザからそれにアクセスしてみよ.
    • ブラウザで HTML ファイルを表示し, そのスナップショットを wbt に提出せよ.
  • 教員がチェックスクリプトを実行する. そのチェックに必ず合格すること.
    • 設定が終わり次第, 教員にチェックスクリプト実行を依頼すること.