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

自分自身と教員のユーザアカウントを作成し, 両名を 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 コマンドを初めて実行するときは, 管理者権限を使う心得が表示されるので, 心に刻むこと.

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

  pi     

$ su hogehoge  (ユーザの変更)

  パスワード:

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

  hogehoge

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

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

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

    [sudo] hogehoge のパスワード:

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

hogehoge$ exit   (hogehoge から pi へ移行)

$ 

なお, これまで使っていた pi ユーザでは sudo を行う際に一々パスワードを入力する必要がなかった. これは, pi ユーザはパスワードを入力をしなくて良いという設定がなされているためである. 具体的には, 以下のファイルに設定 ("NOPASSWD") が書かれている.

$ 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) でログインせよ.

# reboot

ログの確認

ユーザのログインの履歴は last コマンドや lastlog コマンドで確認することができる. last コマンドは時系列で, lastlog コマンドはユーザ毎にログイン履歴を表示する.

$ 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)
  ...(後略)...
$ 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 以下に表示する行数を与える).

$ 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 から得ること. コマンドライン上で得られたハッシュと /etc/shadow に保存 されたハッシュが一致することを確認せよ. (実行する前に passwd コマンドで仮のパスワードに変更するか, もしくは確認した後に必ず history を編集すること. パスワードが history に残らないように!)

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

課題

  • 以下のファイルの書式を wbt のオンラインテキストにまとめよ.
    • /etc/passwd
    • /etc/group
    • /etc/shadow
  • 以下のコマンドを実行し, スクリーンショットを提出せよ. 但し, 作成した自分のアカウントでログインしてから以下を実行すること.

    $ whoami 
    
    $ last
    
    $ lastlog
    
    $ sudo -s
    # tail -n 10 /var/log/auth.log
    
    # cat /etc/sudoers.d/*
    
    
    # grep sugiyama /etc/passwd
    
    # grep sugiyama /etc/shadow