アクセス権に関わる様々なことについて理解を深める
【連載コラム:Linuxを学ぼう(16)】
サーバーを扱う上で必須と言える技術が「Linux」。今回は前回のパーミッションに引き続き、アクセス権について掘り下げて解説していきます。
OSがインストールしたファイルなどのアクセス権は適切に設定されていることがほとんどですが、データの置き場所など管理者自身が作成するファイルやディレクトリは適切にアクセス権が設定されている必要があります。
OSの内部的な動作についてきちんと理解することで、さらにアクセス権について理解を深めましょう。
実ユーザーと実効ユーザー
ユーザーやグループは、ファイルに対してアクセスするプログラムを実行したユーザーと、そのユーザーが所属しているグループです。これを「実ユーザー」と呼びます。
一方、sudoコマンドなどのように、実行したユーザーと異なる権限で動作する仕組みもあります。この時のユーザーを「実効ユーザー」と呼びます。たとえばユーザーlinucがsudoコマンドで管理者権限が必要となるプログラムを実行すると、実効ユーザーは「ユーザーroot」となります。
サーバープロセスと実効ユーザー
サーバープロセスはユーザーrootが起動することがほとんどですが、セキュリティ等の関係で実効ユーザーをrootではなく、そのサーバー用に作成したユーザーに変更したりすることがあります。その場合、サーバープロセスがファイルにアクセスするには、その実効ユーザーによるアクセス権が必要となります。
設定をユーザーrootで作業することによって、ファイルやディレクトリがユーザーrootの所有権に設定されている場合があります。このような場合にはサーバープロセスがアクセスできませんので、chownコマンドなどを使って適切な所有権を設定するようにしましょう。
実効ユーザーの確認
実効ユーザーは、psコマンドでプロセスの状態を観ることで、そのプロセスがどのユーザーが実行しているかを確認できます。psコマンドにuオプションを付けて実行すると確認できます。
$ ps u
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
linuc 34847 0.0 0.3 226468 5588 pts/1 S 02:16 0:00 -bash
linuc 34988 0.0 0.2 257436 3964 pts/1 R+ 02:22 0:00 ps u
一番左のUSERの項目が、各プロセスの実効ユーザーを表しています。多くの場合、プロセスを起動(プログラムを実行)したユーザーと、psコマンドで確認できる実効ユーザーは同じになっていますが、サーバープロセスなどでは実効ユーザーが変わっていることがあるので、何か問題が起きた時には確認するようにするとよいでしょう。
Webサーバーに見る面白い例
1つ身近で面白い例を紹介します。それはApache Webサーバーです。起動している状態で確認すると、以下のようになります。
# ps aufx
root 2946 0.2 0.6 258132 10848 ? Ss 00:57 0:00 /usr/sbin/httpd -DFOREGROUND
apache 2947 0.0 0.4 262816 8164 ? S 00:57 0:00 \_ /usr/sbin/httpd -DFOREGROUND
apache 2948 0.0 0.7 1910496 13800 ? Sl 00:57 0:00 \_ /usr/sbin/httpd -DFOREGROUND
apache 2949 0.0 0.6 1779368 11792 ? Sl 00:57 0:00 \_ /usr/sbin/httpd -DFOREGROUND
apache 2950 0.0 0.6 1779368 11792 ? Sl 00:57 0:00 \_ /usr/sbin/httpd -DFOREGROUND
この例だと、まずrootで実行されているプロセスID 2946が起動しています。これはポート番号80番を使うためにはroot権限が必要だからです。そこからさらに子プロセスが起動していますが、これらはユーザーapacheが実行していることになります。
これらのプロセスが実際にWebサーバーとして動作するプロセスですが、これらのプロセスはroot権限を持たないので、許可されたアクセス権のあるファイルやディレクトリにしかアクセスできません。
デフォルトのアクセス権
デフォルトのアクセス権はumaskと呼ばれる値で決まります。umaskコマンドを実行すると、現在のumaskの値が分かります。
$ umask
0002
すべてのアクセス権を与える値からumask値を引くことでデフォルトのアクセス権が決まります。ファイルなら0666、ディレクトリなら0777がすべてのアクセス権を表すので、それぞれ0664(rw-rw-r--)、0775(rwxrwxr-x)がデフォルトのアクセス権になります。
Umaskの値を変更したい場合には、引数として値を与えます。
$ umask 0022
$ umask
0022
常に変えておきたい場合には、シェル起動時のシェルスクリプトなどで実行するとよいでしょう。
POSIX ACL
伝統的なUNIXのアクセス権の設定はユーザーとグループ、その他という大まかなアクセス主体でしかアクセスを制御できません。そのため、より細かなアクセス制御を行うためにPOSIX ACLと呼ばれるアクセス権設定をLinuxはサポートしています。
ただし、基本的なLinuxの操作などでPOSIX ACLが使われることはありません。SambaのようなWindows向けファイルサーバー機能の内部で使われるケースなどがあります。
SELinuxとの関係
SELinuxはLinux上でより強力なアクセス制御を行う仕組みです。SELinuxが有効になっていると、アクセス権があるように見えても実際にはアクセスができないというようなことが起こります。
SELinuxについては、また回をあらためてアクセス権の確認方法等を解説する予定です。
アクセス権はOSの根幹であるファイルへのアクセスを制御する仕組みのため、しっかりと理解しておかないとトラブルシューティングなどに支障を来します。何かあった時には対象となるファイルのアクセス権やプロセスの実効ユーザーを確認する習慣をつけましょう。
- 筆者紹介
宮原 徹 氏
Linux標準教科書、Linuxサーバー構築標準教科書などの監修者。LinuCレベル1/レベル2 Version10.0の改訂作業にも協力。また、幅広いOSSに関する情報提供の場として「オープンソースカンファレンス(OSC)」の企画運営も。
バックナンバー
第21回:外部からWebサーバーにアクセスする
第20回:Webサーバーを動かす
第19回:Webサーバーをインストールする
第17回:ネットワークの状態確認を理解する
第15回:ファイルのアクセス権を理解する
第14回:パッケージをアップデートする dnf編
第13回:PAMを理解する
第12回:グループとは何かを理解する
第11回:sudoコマンドについて理解する
第10回:suコマンドで特権ユーザーになる
第9回:ユーザー権限を理解する
第8回:SSHによるリモートログイン
第6回:Linuxイストールの実際
第5回:Linuxインストールの準備
第3回:学習環境を用意する
第2回:Linuxをどう学ぶのか
第1回:Linuxを学ぼう