2018 年度 OSS リテラシー 3 : 第 2 回 ユーザ管理

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

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

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

設定ファイルの作成

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

個人のパスワードを平文で設定ファイルに書き込むのはセキュリティ的に問題がある. 暗号化したパスワードを設定ファイルに保存することにする. パスワードの ntpassword hash を作るためには freeradius-utils パッケージをインストールしておく必要がある (第 1 回でインストール済み).

以下のコマンドで ntpassword hash を作成できる. 出力のうち, NT Hash と書かれた方の文字列 (以下の例では YYYYYYYYYYYYYYYYYYYYYYYY) だけをコピーしておく. かならず一般ユーザ権限 (ターミナルのプロンプトが $) で行うこと.

$ smbencrypt XXXXX (自分のパスワード)

    LM Hash                     NT Hash
    -----------------------     -------------------------
    XXXXXXXXXXXXXXXXXXXXXX      YYYYYYYYYYYYYYYYYYYYYYYY

上記の ntpassword hash を使って無線 LAN 関係の設定ファイルを書き換える. この機会に 5 棟 2 階と 4 階の無線 LAN アクセスポイントも追加しておくと良いだろう.

$ sudo -s
# vi /etc/wpa_supplicant/wpa_supplicant.conf

  (以下をコメントアウト)
  #network={
  #      ssid="SugiyamaLab-01"  
  #      psk="ZZZZZZZZZZ"
  #      key_mgmt=WPA-PSK
  #}     

  (ファイルの末尾に以下を追加)
  network={
        ssid="H530W_pub"  
        key_mgmt=WPA-EAP
        eap=PEAP
        identity="jXXXX" (学生番号. ダブルクォーテーションで囲む)
        password=hash:YYYYYYYYYYYYYYYYYYYYYYYY (ntpassword hash のコピペ. hash: という文字列を付けるのを忘れずに. ダブルクォーテーションで囲まないこと)
  }
  network={
        ssid="H520W_pub"  
        key_mgmt=WPA-EAP
        eap=PEAP
        identity="jXXXX"
        password=hash:YYYYYYYYYYYYYYYYYYYYYYYY
  }
  network={
        ssid="H540W_pub"  
        key_mgmt=WPA-EAP
        eap=PEAP
        identity="jXXXX"
        password=hash:YYYYYYYYYYYYYYYYYYYYYYYY
  }

注意すべきは, ターミナルで実行したコマンドの履歴が残ることである. パスワードを打った履歴が残るのはまずいので, smbencrypt のコマンド履歴を削除することにする. history コマンドを実行すると今までに打ったコマンドが通し番号付きで表示される. history コマンドに -d オプションで通し番号を与えると, 履歴を消すことができる. なお, コマンド履歴は ~/.bash_history ファイルに記録されているので, 直接ファイルを編集して該当行を削除しても良い.

# exit   (管理者権限から一般ユーザ権限に戻る)
$ history
  ...(中略)...
  NN smbencrypt XXXXX (NN は通し番号, XXXXX はパスワード)
  ...(攻略)...

$ history -d NN (NN は smbencrypt の通し番号)

$ histoty  
  ...(略)....   (smbencrypt のコマンド履歴が消去されたことを確認)

再起動

$ sudo reboot

正しく設定できれば, 再起動することで校内の無線 LAN ネットワーク (H520W_pub, H530W_pub, H540W_pub) のいずれかに接続できる. もしも無線 LAN に接続できない場合は, 設定ファイルが間違っている可能性が高い. 間違いを探すときは, 手動で以下のコマンドを実行すると良い. エラーの原因となる行番号が表示される.

$ sudo -s
# wpa_supplicant -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf 

ユーザ管理

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

以下の例では自分自信のアカウント名は hogehoge としているが, 適宜希望アカウント名で置き換えること. 後日行うリモートアクセスの演習のために, ユーザ名には「学籍番号を使わない」こと.

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

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

現在のアカウント名を確認してみよう. raspbian のデフォルトは pi ユーザであることが確認できる.

$ whoami

   pi

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

$ sudo -s

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

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

# exit 

$

登録されたユーザ情報は, /etc/passwd と /etc/shadow に登録される. /etc/shadow に暗号化されたパスワードが, それ以外の情報は /etc/passwd に書かれる. Debian 系 Linux では自動的にアカウント名と同じグループが作成される. /etc/group にグループ情報が書かれる. まずはこれらのファイルを確認してみよう. grep コマンドを使うことで, 第一引数に与えた文字列が含まれている行だけを抜き出すことができる.

$ sudo -s 

# less /etc/passwd

  ...(略)...

# grep hogehoge /etc/passwd

  hogehoge:x:1001:1001:SUGIYAMA Ko-ichiro,,,:/home/hogehoge:/bin/bash

# less /etc/shadow

  ...(略)...

# grep hogehoge /etc/shadow

  hogehoge:$6$AAAAAA$XXXXXXXXXXXXXXXXXXXXXXXXX:17439:0:99999:7:::

# less /etc/group

  ...(略)...

# grep hogehoge /etc/group

  hogehoge:x:1001:

/etc/shadow はパスワード情報が含まれているので, 一般ユーザには読めないファイルパーミッションになっている. /etc/passwd や /etc/group は一般ユーザでも読める.

# ls -l /etc/passwd /etc/group /etc/shadow

  -rw-r--r-- 1 root root    814 10月 19 09:33 /etc/group
  -rw-r--r-- 1 root root   1718 10月 19 09:34 /etc/passwd
  -rw-r----- 1 root shadow 1097 10月 19 09:33 /etc/shadow

# exit
$

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

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

$ sudo -s
# adduser --disabled-password sugiyama

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

同様にユーザ情報やグループ情報が /etc/passwd, /etc/shadow, /etc/group に登録されていることを確認する. 上記で adduser のオプションに --disabled-password を与えたために, /etc/shadow のパスワードフィールドが "*" になっていることを確認せよ. この状態だとラズパイにパスワード認証でログインすることはできない.

# grep sugiyama /etc/passwd

  sugiyama:x:1002:1002:SUGIYAMA Ko-ichiro,,,:/home/sugiyama:/bin/bash

# grep sugiyama /etc/shadow 

  sugiyama:*:17439:0:99999:7:::

# grep sugiyama /etc/group

  sugiyama:x:1002:

# exit
$

グループの設定

新規作成したユーザ hogehoge と sugiyama をユーザ pi と同じグループに登録する (十分調査していないが, 同じグループに入れておかないとラズパイの動作がおかしくなることがあった).

まず, ユーザ pi の所属するグループを一覧する. /etc/group を直接見ても良いが, groups コマンドを使う方が簡単である.

$ groups

  pi adm dialout cdrom sudo audio video plugdev games users input netdev gpio i2c spi

このうち, 最初の pi グループはシステムの作るユーザ名と同じ名前のグループである. pi グループ以外のグループに hogehoge と sugiyama を追加する. usermod コマンドを使う場合は, -G オプションでカンマ区切りでグループ名を並べるので, 上記の groups コマンドの出力をコピペして使うと良い. 最後に追加するユーザ名を与える. なお, gpasswd -a コマンドでもグループの追加を行うことができる.

$ sudo -s

# usermod -G adm,dialout,cdrom,sudo,audio,video,plugdev,games,users,input,netdev,gpio,i2c,spi hogehoge

# usermod -G adm,dialout,cdrom,sudo,audio,video,plugdev,games,users,input,netdev,gpio,i2c,spi sugiyama

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

# grep hogehoge /etc/group

  adm:x:4:pi,hogehoge,sugiyama
  dialout:x:20:pi,hogehoge,sugiyama
  cdrom:x:24:pi,hogehoge,sugiyama
  sudo:x:27:pi,hogehoge,sugiyama
  audio:x:29:pi,hogehoge,sugiyama
  video:x:44:pi,hogehoge,sugiyama
  plugdev:x:46:pi,hogehoge,sugiyama
  games:x:60:pi,hogehoge,sugiyama
  users:x:100:pi,hogehoge,sugiyama
  input:x:101:pi,hogehoge,sugiyama
  netdev:x:108:pi,hogehoge,sugiyama
  spi:x:999:pi,hogehoge,sugiyama
  i2c:x:998:pi,hogehoge,sugiyama
  gpio:x:997:pi,hogehoge,sugiyama
  hogehoge:x:1001:

また, 含まれているグループの数を数えて, それが一致しているかも見てみるとよい. wc の出力は, 行数・単語数・バイト数, を意味する. 以下の例では hogehoge, sugiyama, pi を含む行が全て同じ 15 行であることを示す.

# grep hogehoge /etc/group |wc

   15      15     467

# grep sugiyama /etc/group |wc

   15      15     467

# grep pi /etc/group |wc

   15      15     461

# exit
$

管理者権限の設定

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 と sugiyama を 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 ユーザはパスワードを入力をしなくて良いという設定がなされているためである. 具体的には, 以下のファイルに設定 ("NOPASSWD") が書かれている.

パスワードを入力せずに済ませるのはセキュリティ的にはよろしくないが, pi ユーザと同様に設定しておかないと動作がおかしくなることがあるため, 仕方なく行うことにする.

pi$ sudo -s

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

  pi ALL=(ALL) NOPASSWD: ALL

ユーザ hogehoge と sugiyama も同様に毎回パスワードを入力をしないでも済むように設定する. 以下のように sudo の NOPASSWD の設定を追加する.

# cd /etc/sudoers.d

# vi 011_hogehoge-nopasswd

  (以下の 1 行を記入)
  hogehoge ALL=(ALL) NOPASSWD: ALL

# vi 012_sugiyama-nopasswd

  (以下の 1 行を記入)
  sugiyama ALL=(ALL) NOPASSWD: ALL

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

ログの確認

ユーザのログインの履歴は 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
  sugiyama                                   **一度もログインしていません**

また, 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)

発展: パスワードの暗号化に対する理解を深める

/etc/shadow に保存されている暗号化されたパスワードに対する理解を深めよう. /etc/shadow の 1 行 1 行は : (コロン) 区切りのフィールドに分けられているが, この第 2 フィールドにパスワードのハッシュとソルトが保管されている.

# grep hogehoge /etc/shadow

  hogehoge:$6$AAAAAA$XXXXXXXXXXXXXXXXXXXXXXXXX:17439:0:99999:7:::

第 2 フィールドだけ取り出すと

$6$AAAAAA$XXXXXXXXXXXXXXXXXXXXXXXXX

であるが, このフィールドはさらに $ 区切りのフィールドに分かれていることが分かる. $ 区切りのフィールドにはそれぞれ意味があり,

6 : ハッシュを求めるのに SHA-512 (一方向ハッシュ関数) を使用していることを示す
AAAAAA: ソルト (ランダムに決められた文字列)
XXXXXXXXXXXXXXXX : パスワードのハッシュ

である. 文字列を SHA-512 (一方向ハッシュ関数) でハッシュ化することはターミナル上で簡単に行える. 例えば "hogehoge" という文字列を AAAAAA というソルトを使って SHA-512 でハッシュ化するには以下のように実行すれば良い. 引数として, "$6$AAAAAA" というように「$6$ + ソルト」を与えることに注意せよ.

$ ruby -e 'p "herohero".crypt("$6$AAAAAA")'

  "$6$AAAAAA$WN3XG2F1dWl1l5rnj5WVge2NEh3MW7e2YeX.kzSDLcNW9krIckh7UyAamSdbyHEDCDr7QGiN00/35Kz882Abn0"

ハッシュ化のアルゴリズムとソルトが同じなら, 同じハッシュ値が得られる. そのため, /etc/shadow が外部に流出するとクラッカーの餌食となってしまう.

課題

  • 校内の無線 LAN ネットワーク (H520W_pub, H530W_pub, H540W_pub) に接続せよ. 第 1 回と同様に, ifconfig コマンド, netstat コマンド, iwconfig コマンドの出力結果を wbt のオンラインテキストにコピペせよ. さらに, 自分のラズパイの IP アドレス, netmask, broadcast, ゲートウェイ, 接続している無線アクセスポイントを wbt のオンラインテキストに報告せよ.
    • もしも学内無線 LAN にうまく接続できない場合は, /etc/wpa/wpa_supplicant.conf の中身をコピペして提出せよ.
  • 無線 LAN に関する以下の用語の意味を調べて wbt のオンラインテキストにまとめよ.
    • WEP, WPA, WPA2
    • WPA-PSK
    • WPA-EAP
    • 802.1X 認証, RADIUS
  • 以下のファイルの書式を wbt のオンラインテキストにまとめよ.
    • /etc/passwd
    • /etc/group
    • /etc/shadow
    • /etc/sudoers
      • "%sudo ALL=(ALL:ALL) ALL" という記述があるが, 各 ALL の意味を調べなさい.
  • ファイルパーミッション read, write, execute, user, group, other, の意味を調べて調べてオンラインテキストにまとめよ. さらに, 以下のファイルに対して ls -l コマンドを実行し, 「誰」が「何 (read, write, execute)」をできるかまとめよ.
    • /etc/passwd
    • /etc/shadow
    • /home/hogehoge/.bashrc
    • /bin/ls
    • /usr/bin/sudo (注意: setuid が使われている. setuid の意味も合わせて調べよ)
  • 以下のコマンドを実行し, wbt のオンラインテキストにコピペして提出せよ.

    $ whoami 
    
    $ last
    
    $ lastlog
    
    $ sudo -s
    # tail -n 10 /var/log/auth.log
    
    # cat /etc/sudoers.d/*
    
    # grep sugiyama /etc/passwd
    
    # grep sugiyama /etc/shadow
  • 自分のパスワードを前述の方法でハッシュ化してみよ. その際, ソルトは自分のラズパイの /etc/shadow から得ること. コマンドライン上で得られたハッシュと /etc/shadow に保存 されたハッシュが一致することを確認せよ. 作業後, 必ず history コマンドで履歴を消去すること. なお, パスワードがからむので wbt には何も提出しなくて良い.