ユーザーとグループ

INPUT · スライド

名簿を読む

01 / 08

ユーザーはファイルに書かれている

root になれたね。では、この Linux にはあなたと root しかいないのだろうか

確かめる方法があるよ。ユーザーの一覧は、どこかの見えない場所にあるのではなく、ただのテキストファイルに書いてあるんだ。

~ $ wc -l < /etc/passwd10

10人いるよ。あなたが知っているのは manabiyaroot の2人だけなのに、残り8人は誰なんだろう。

この回は新しいコマンドを1つも覚えないよ。使うのは grep(章3)と cut sort awk(章5)だけ。すでに持っている道具を名簿に向けるだけで、サーバーの点検ができると分かる回なんだ。

02 / 08

/etc/passwd の7つの区切り

前の章で自分の行を見たね。もう一度、区切りを数えながら読んでみよう。

manabiya:x:100:101:learner:/home/manabiya:/bin/sh

: で7つに分かれているよ。

位置中身この行では
1名前manabiya
2パスワードx
3ユーザー番号100
4グループ番号101
5説明learner
6ホーム/home/manabiya
7最初に動くシェル/bin/sh

: で区切られた表——これは章5でやった cut -d: がぴったり効く形だよね。

/etc/passwd は、コマンドラインの道具で読むために作られた表なんだ。だから区切り文字がひとつに決まっていて、1人が1行に収まっている。

03 / 08

2列目の x は「あっちにある」

2列目に注目してほしいな。名前は passwd(パスワード)なのに、入っているのは x の1文字だよ。

全員が x なんだ。確かめてみよう。

~ $ cut -d: -f2 /etc/passwd | sort -ux

sort -u で重複を消したら1行だけ。つまり本当のパスワードはここに無いんだ。

昔はここに暗号化したパスワードが入っていたよ。でも /etc/passwd誰でも読めるファイルだから(-rw-r--r-- だったね)、それを持ち帰って総当たりで解かれてしまった。

だから中身は /etc/shadow に移して、ここには「別のところにあるよ」という印だけ残したんだ。前のレッスンで root になって読んだ、あのファイルだよ。

見せてよいものと隠すものを、ファイルごと分けて権限で守る。章6の知識がここで効いているね。

04 / 08

人ではないユーザーがいる

残りの8人を見てみよう。

~ $ cut -d: -f1 /etc/passwdrootdaemonbinsyssyncmailwww-dataoperatornobodymanabiya

www-datamaildaemon——人の名前ではないよね。これらはプログラムのためのユーザーなんだ。

なぜプログラムに名前が要るんだろう。権限を絞るためだよ。

Web サーバーは外からの通信を受けるので、乗っ取られる危険がいちばん大きい。もしそれが root として動いていたら、乗っ取った人は何でもできてしまう。

だから www-data というほとんど何もできないユーザーを作って、その資格で動かすんだ。乗っ取られても被害がそこで止まるようにね。

章6でやった「持ち主」が、ここで守りの仕組みとして使われているんだ。

05 / 08

ログインさせないための /bin/false

プログラム用のユーザーには、もうひとつ仕掛けがあるよ。7列目のシェルを見てみよう。

~ $ cut -d: -f7 /etc/passwd | sort -u/bin/false/bin/sh/bin/sync

/bin/false という変なものがあるね。これは何もせずに失敗して終わるだけのコマンドだよ。

7列目は「ログインしたときに動かすシェル」だったよね。そこに /bin/false が書いてあると、ログインしようとしてもすぐ終わってしまう。つまり入れないんだ。

manabiya → /bin/sh    ログインできるwww-data → /bin/false  入れない

プログラムとして動くのに人間としては入れない。よくできた仕掛けだよね。

数えてみると /bin/false は7人。10人のうち7人は入れないユーザーなんだ。あなたと root、それに sync を除いた全員だよ。

06 / 08

番号には縄張りがある

3列目の番号を並べてみよう。

~ $ cut -d: -f3 /etc/passwd | sort -n012348333710065534

小さい番号に固まっていて、10065534 だけが離れているね。縄張りが決まっているんだ。

番号誰のもの
0root だけ
199システム(プログラム用)
100 以上人間
65534nobody(権限を持たない役)

いちばん大事なのが 0 だよ。root であることは、名前ではなく番号 0 で決まるんだ。

だから「root という名前を消せば安全」ではないし、逆に別の名前で番号 0 のユーザーを作ったら、それも rootなんだ。

これは点検に使えるよ。番号 0 の行が2つ以上あったら、誰かが裏口を作った可能性がある。次の問題で数えてみよう。

07 / 08

グループの名簿は /etc/group

グループにも名簿があるよ。こちらは4つに区切られているんだ。

~ $ grep manabiya /etc/groupmanabiya:x:101:
位置中身この行では
1グループ名manabiya
2パスワードx(使わない)
3グループ番号101
4入っている人(空)

4列目が空なのが気になるよね。あなたは manabiya グループに入っているのに、名前が書かれていないんだ。

これには理由があるよ。主なグループは /etc/passwd の4列目に書いてあるからだよ。manabiya:x:100:101:...101 がそれだね。

/etc/group の4列目に並ぶのは、あとから足された人だけなんだ。次のレッスンでグループに人を足すと、ここに名前が現れるよ。

ちなみに /etc/group は27行もあるよ。diskaudio のように、装置ごとのグループが用意されているんだ。

08 / 08

さあ、打ってみよう

今日の問題は、名簿に対してすでに覚えた道具を向けるだけだよ。

やりたいこと使う道具覚えた章
行を探すgrep章3
列を抜くcut -d:章5
並べて重複を消すsort -u章5
条件で行を選ぶawk -F:章5
数えるwc -l章2

新しく覚えることはゼロ。それでも点検ができるようになるよ。

最後のほうで「番号 0 のユーザーを数える」という問題が出てくる。あれは本物のサーバーで実際にやる点検そのものだよ。あなたはもう、それができる道具を全部持っているんだ。