お金をかけずにサーバーの勉強をしよう

Linuxでディレクトリ/ファイルのパーミッション変更

2022年7月22日

メニューへ戻る

Linuxのディレクトリとファイルのパーミッション でお勉強して、rwxrwxrwx が何者かは分かっていただけたと思います。

しばらく Linuxをやって、黒い画面にも慣れて、コマンドをいくつか覚えてくると、シェルスクリプトを作ったりしますよね。

その際に、テキストファイルであるシェルスクリプトを実行するにはファイルに実行権限がないと実行できないので、ここでは ディレクトリとファイルのパーミッション変更について書きます。

対象がディレクトリでもファイルでも方法は同じなので、以下ファイルを例に書いていきます。

環境は Ubuntu Desktop 22.04を使っています。


ではシェルスクリプトを作ってみます。
こんな内容のやつです。単に idコマンド(print real and effective user and group IDs)の結果を縦に出すだけ。

#!/bin/bash

id | sed 's/,/ \t/g' | sed 's/ /\n/g'

ls -l でパーミッションを見てみます。

subro@Ubuntu2204:~$ ls -l virtical_id.sh
-rw-rw-r-- 1 subro subro 52  7月 22 09:40 virtical_id.sh

パーミッションはこういう意味ですので
パーミッション説明 1
rw-rw-r-- だと

読み込み書き込み 実行 
オーナー
グループ
グループ外

このようになっていて、ファイルのオーナーの自分でさえも実行ができません。

なお、このファイル作成時のデフォルトの rw-rw-r-- はどこかで決まっているのかですが、bashの内部コマンド umaskを実行してみると分かります。

subro@Ubuntu2204:~$ umask
0002

0002って何かというと、file mode creation maskというものです。
以下のような仕組みになっていて、最も許可された状態からマスクの分の許可を外して実際のパーミッションにしています。
二進数にして引き算していると考えて下さい。

マスク値が 0002 というのは、ディレクトリに対しては rwxrwxrwx から -------w- を引いたことになります。
パーミッション説明 2

ファイルに対しては rw-rw-rw- から -------w- を引いたことになります。
パーミッション説明 3

この結果、新規作成したファイルのパーミッションはデフォルトで、rw-rw-r-- になったのです。

umaskコマンドで出る設定値はシステムデフォルトで 0002になっていますが、umaskコマンドで一時的に自分の環境での設定を変えることもできます。
これを ~/.bashrc などに書いておけば、bashを使う時は常にその値が使われるようになります。

subro@Ubuntu2204:~$ umask 0006

subro@Ubuntu2204:~$ touch aaa

subro@Ubuntu2204:~$ ls -l aaa
-rw-rw----  1 subro subro      0  7月 22 11:06  aaa

これまで、rwxrwxrwx と書いてきましたが、現場では「アーダブエクスアーダブ…」とか言ってません。
舌を噛んでしまいます。
現場では、rwxrwxr-x は 775 で「ナナナナゴ」って言ってます。
rw-rw-r-- なら 664 で「ロクロクヨン」です。

「あぁ何だよこれ、ナナナナナナになってるよ。」(≒セキュリティガバガバ)
というように使います。
現場の先輩が訳の分からない3桁数字を言ったら、これのことだと思って下さい。

「二進数への変換とかすぐできない!」と嘆くことなかれ。慣れます


横道に逸れてしまいましたが、シェルスクリプトにオーナーの実行権限を付与しましょう。

つまり 664 から 764 にするのです。
「ロクロクヨンからナナロクヨンに変えます。」と先輩に言えば通じます。
「グループはイイの?」とか聞かれるかも知れませんね。

パーミッションの変更には chmodコマンド(change file mode bits)を使います。
コマンドの説明にも bits とあり、二進数の話になっています。

第1引数に u+x を与えるとオーナーに実行権限を付与します。
g+x ならグループへ、o+xならグループ外へ、となります。
カンマ区切りで複数指定できます。

subro@Ubuntu2204:~$ chmod u+x virtical_id.sh

subro@Ubuntu2204:~$ ls -l virtical_id.sh
-rwxrw-r-- 1 subro subro 52  7月 22 09:40 virtical_id.sh

ここで慣れてくるとこんなことをします。

subro@Ubuntu2204:~$ chmod 764 virtical_id.sh

上手く行ってこうなりました。

読み込み書き込み 実行 
オーナー
グループ
グループ外

シェルスクリプトを実行します。

subro@Ubuntu2204:~$ ./virtical_id.sh
uid=1000(subro)
gid=1000(subro)
groups=1000(subro)
        4(adm)
        24(cdrom)
        27(sudo)
        30(dip)
        46(plugdev)
        120(lpadmin)
        999(sambashare)

ちゃんと実行できました。


以上になりますが、いかがだったでしょうか。

umask と chmod コマンドを駆使して、ファイルシステム上のセキュリティを強化していただければと思います。