😘

ファイルパーミッションスーパユーザ

2021/01/01に公開1

はじめに

くーばねてすをやっつけるためにLinuxさんと仲良くしはじめた。どうやらLinuxさんにはたくさんの人と繋がる仕組みがあって、さらに色んなグループや権限があったらしい。私だけじゃなかったってこと?くーばねてす倒す。

概要

■ファイルごとのオーナー
■ファイルの権限(パーミッション)
■ディレクトリの権限(パーミッション)
■パーミッションを変更する
■スーパーユーザー
についてまとめた。

ファイルごとのオーナー

じつはLinuxさんで扱われるファイルにはすべて所有者が定められていた。
オーナーはファイルのアクセス権限を自由に設定できる。lsコマンドで確認できる。

$ ls -l /bin/cat
-rwxr-xr-x 1 root(ファイル所有者) root(所属するグループ) 49888 Jan 23 2020 /bin/cat

catコマンドのファイル所有者はrootでrootっていうグループに所属していることが分かった!
ちなみに最初ファイルを作成したユーザーがファイルのオーナーになる。

グループ

Linuxさんには複数の人達で管理する仕組みがあって、色んなグループがあったらしい
↓グループ一覧表示

$ cat /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:suidou
tty:x:5:
disk:x:6:
lp:x:7:
mem:x:8:
kmem:x:9:
wheel:x:10:suidou
cdrom:x:11:
mail:x:12:postfix
man:x:15:
dialout:x:18:
floppy:x:19:
games:x:20:
tape:x:33:
略

こんなにたくさんいたの...
・一番左はグループ名
・xはパスワード(パスワードの実態はセキュリティ上表示しない)
・数字はグループ番号(GID)
・右の文字は所属メンバーの一覧
↓自分が所属しているグループを確認

$ groups
root

ファイルの権限(パーミッション)

ひとつひとつのファイルには誰がどのような操作を許可するかという権限が定められている。
この情報をパーミッションという。
↓ファイルのパーミッションの確認

$ ls -l /bin/cat
(↓一番左の文字がファイルタイプ)
-rwxr-xr-- 1 root root 49888 Jan 23 2020 /bin/cat
(↑このrwxが権限を表す〈ファイルモード〉)

■一番左の一文字(ここでは-)がファイルタイプを表す。
ファイルタイプは
-...通常ファイル
d...ディレクトリ
l...シンボリックリンク
を表す。
■次がファイルモードを表す。
ファイルモードの表示はrwxr-xr-xのように3文1ブロックになっていて3ブロック並んでいる。
左からオーナー、グループ、その他のユーザーに対する権限を表す。
分解するとrwx(オーナー)r-x(グループ)r--(その他のユーザー)といった配置になる。
アルファベットの意味は
r...read(読み取り)
w...white(書き込み)
x...execute(実行)
となる。
rwxのうち許可されていないところは-と表示される。
rwx(オーナー)は読み込み、書き込み、実行全て許可。
r-x(グループ)は読み込み、実行
r--(その他のユーザー)は読み込みのみ許可
というようになる。

ディレクトリの権限(パーミッション)

↓指定したディレクトリの権限を表示する

$ ls -ld ディレクトリ名

↓ディレクトリのパーミッションを表示

$ ls -ld test
drwxr-xr-x 2 root root 6 Dec 31 12:26 test

ディレクトリのrwxはファイルと違った意味になる。
r...(読み取り)このディレクトリのなかのファイル一覧を取得
w...(書き込み)このディレクトリの下でファイル、ディレクトリの作成、削除
x...(実行)このディレクトリをカレントディレクトリにする(cdで移動できない)
ディレクトリの権限は中の既存のファイルの権限とは関係ないので、ファイル一覧が確認できたり新ファイル、ディレクトリの作成、削除ができても既存のファイルを編集削除できるとは限らない。

パーミッションを変更する

パーミッションを変更するにはファイルモードを変更するchmodコマンドを実行する。
ファイルのパーミッションはファイルのオーナーかスーパーユーザー(↓でやるよ!)しか変更できない。chmodコマンドの設定はシンボルモード、数値モード、2つの設定方法がある。

■シンボルモードでの設定

↓シンボルモードでの設定(ちょっと難しい)

$ chmod [ugoa] [+-=][rwx] ファイル名

うごあって誰?+-=ってなに('_')
ugoaはユーザーに対するパーミッションを表す。
u...オーナー
g...グループ
o...その他のユーザー
a...↑ugo全て
ユーザー指定を省くとugo全てが指定される。
+-=は権限を追加するのか禁止するのかを設定する。
+...権限を追加
-...権限を禁止
=...指定した権限と等しくする
↓test.txtファイルにオーナーの実行権限を追加する。

$ ls -l test.txt
-rw-r--r-- 1 root root 0 Dec 31 13:14 test.txt
$ chmod u+x tst.txt
$ ls -l test.txt
-rwxr--r-- 1 root root 0 Dec 31 13:14 test.txt

権限を追加できた!
↓test.txtファイルのグループの読み込み権限を禁止

$ ls -l test.txt
-rwxr--r-- 1 root root 0 Dec 31 13:14 test.txt
$ chmod g-r test.txt
$ ls -l test.txt
-rwx---r-- 1 root root 0 Dec 31 13:14 test.txt

読み込み権限が禁止された!
↓複数のユーザーの権限をまとめて指定

$ ls -l test.txt
-rwx---r-- 1 root root 0 Dec 31 13:14 test.txt
$ chmod go=w test.txt
$ ls -l test.txt
-rwx-w--w- 1 root root 0 Dec 31 13:14 test.txt

あっ!その他のユーザーが読み込み権限が消えて書き込み権限だけになってしまった!
どうやら=は一括で権限を設定するやつらしい。

$ ls -l test.txt
-rwx-w--w- 1 root root 0 Dec 31 13:14 test.txt
$ chmod go=rw test.txt
$ ls -l test.txt
-rwxrw-rw- 1 root root 0 Dec 31 13:14 test.txt

やっぱり!

数値モード

シンボルモードがもともとあったものに付け足したり外したのに対して、数値モードは元のパーミッションに関わらず新しいパーミッションに変更する。簡単だからこっちのほうが私は好き(>_<)!
数値モードでパーミッションを設定するにはrwxを次の数値に置き換えて足し算したものを権限として表す。
r...4
w...2
x...1
なので
読み込みだけOK...4
書きだけok...2
読み書きだけok...6
実行だけok...1
ぜんぶok...7
って感じ。4,2,1!!!4,2,1!!!4,2,1!!!って覚えた!
↓各権限者ごとに上の権限を足した数を割り当てパーミッションを設定する。

$ ls -l test.txt
-rwxrw-rw- 1 root root 0 Dec 31 13:14 test.txt
$ chmod 755 test.txt
$ ls -l test.txt
-rwxr-xr-x 1 root root 0 Dec 31 13:14 test.txt

オーナー(7)...rwx全て許可
グループ(5)...r(4)とx(1)を許可
その他のユーザー(5)...r(4)とx(1)を許可
だから755

スーパーユーザー

Linuxにはスーパーユーザーという管理者権限をもつ特別なユーザー、スーパーユーザーが存在する。
スーパーユーザーはrootユーザーともいう。
スーパーユーザーはあらゆる操作が許可された強い権限を持ったユーザーで、Linuxが動作する上で必須のファイルも編集削除できてしまうので、通常は一般ユーザーでログインして操作し、必要な時だけスーパーユーザーで操作するというように利用は最低限にするべきだ(らしい!)。
一般ユーザーからスーパーユーザーに代わる方法はふたつ。
suコマンドsudoコマンド

■suコマンド

suコマンドは一時的にスーパーユーザーになる為のコマンドだ。
流れとしては

一般ユーザーでログイン
↓
suコマンド実行
↓
スーパーユーザで作業
↓exit
一般ユーザーに戻る

って感じ。
↓suコマンド実行

$ su
Password:(←パスワードを入力)
#(←プロンプトが変わってスーパーユーザになる)

↓ぬけるときは

# exit(←exitコマンド実行)
exit
$(←一般ユーザーに戻る)

suコマンドだけの入力だと環境変数やカレントディレクトリなど現在の環境を維持したままユーザが切り替わる。-をつけるとスーパーユーザの環境に初期化して切り替わる。環境を維持したままスーパーユーザになるとうまく動作しないことがあるので通常は-をつける(らしい)。
↓スーパーユーザの環境に初期化して切り替えるときは

$ su -

■sudoコマンド

sudoコマンドは一般ユーザーでログイン中にスーパーユーザでないと実行できないコマンドを実行するために使う。
suコマンドと同様、sudoコマンドを実行するときはパスワードを入力する。
パスワードは一般ユーザーのパスワードを入力する。

$ sudo cat /etc/shadow
[sudo]password for suidou:(パスワードを入力する)

sudoコマンドは一つのコマンドに対して一時的にスーパーユーザになるコマンドなので、sudoコマンドを実行するたびにパスワードを入力する。
sudoコマンドはみんなが実行できてしまうとsudoの意味がなくなってしまうので、どのユーザがどのコマンドを実行できるのか設定することができる。一般ユーザーに対するsudoコマンドの設定は/etc/sudoersで管理されている。内容の確認はスーパーユーザとしてcatコマンドで確認する

$ su -
パスワード:
# cat /etc/sudoers

sodoersファイルは次のような形式で記述する。

ユーザ(%グループ名) マシン名=(権限)コマンド

初期設定は次のようになっている。

%wheel  ALL=(ALL)       ALL

wheelグループはすべてのマシンですべてのコマンドをすべてのユーザーとして実行できる。
...らしい('_')
個人で設定するときは

suidou ALL=(ALL)       ALL

って感じ。
/etc/sudoersファイルを設定したいときは失敗は許されない。間違えてみんながsudoコマンドが実行できないように書き間違えてしまうと、もう一度 /etc/sudoersファイルを修正したくてもファイルすら開けなくなってしまう( /etc/sudoersファイルはスーパーユーザでないと編集できない)。
なので間違えがないか文法チェックをしてくれるvisudoコマンドを使う。
visudoコマンドを使うときはスーパーユーザになる。
↓visudoをスーパーユーザで実行

$ su - 
パスワード:
# visudo

visudoを使うと文法エラーがあると警告し、どう処理するのか尋ねてくれるので直接エディタで編集するより安全に作業できる。
e...ファイルを再度編集
x...ファイルの変更を保存せず終了
Q...ファイルを保存して終了
で対応する。
一般ユーザーでsudoコマンドを使えるようにするには一番最後の行に

ユーザー名 ALL=(ALL) ALL

を書き足す。

まとめ

水道屋さんは太字と、グレーにするのを覚えた!
こんなことだってできるぞ!
グレーにすると若干文字が小さくなったり細くなる?
インフラの先輩に記事一覧を見せたらここまで知らなくても仕事できてるって言われて、どこまで勉強すればいいのかわからなくなって一瞬涙目になったけど、わからないと困るのでがんばる
!!!

Discussion

くらげくらげ

ユーザー指定を省くとugo全てが指定される

uだけです。

touch hoge
chmod a= hoge
chmod +r hoge
ls -la hoge

↑してみたらわかるかと。

例として出してるだけなら不要なコメントかもしれませんが、一般ユーザーにALLなsudo権限を付与するにはsudoもしくはwheelグループに追加するのが一般的です。
sudoersの%~はグループを表し、%wheelがALLで設定されてる為です。
ユーザーをグループに追加するには↓

# usermod -aG wheel user_name