Linux 講座 / ファイル権限の読み方と変更方法および sudo の使い方

Linuxのファイル権限は、所有ユーザー・所有グループ・その他のユーザーに対して、読み取り(r)・書き込み(w)・実行(x)をそれぞれ許可するかどうかを決定します。sudoは、認可されたユーザーが特定のコマンドを他のユーザー(通常は管理者)の権限で実行するためのツールです。ファイルアクセスの問題では、まず所有権と権限を確認し、管理者権限は必要なコマンドだけに使用してください。

最初の参照例のnotes.txtは、後の新しい練習フォルダで作成します。ファイル準備手順を先に実行した後、最初の例に戻って所有者・グループ・モードを確認してください。アカウントとグループの意味はユーザーとグループ講座で確認できます。

権限を読む前にユーザーと所有権を確認する

権限は、ファイルにだけ付いている独立した数字ではありません。現在のプロセスのユーザーIDとグループ、対象ファイルの所有ユーザー・グループ、対象まで続くディレクトリの権限が共に作用します。idで現在のアカウントを確認した後、ls -lとstatで対象情報を確認してください。前の講座で扱ったユーザー・グループ・所有権を先に理解しておくと、権限の意味を解釈しやすくなります。

id
ls -l notes.txt
stat -c '%A %a %U %G %n' notes.txt

例えば -rw-r----- 1 learner editors ... notes.txt であれば、最初の - は通常のファイルを示し、後ろの三つの束 rw-・r--・--- はそれぞれ所有ユーザー・所有グループ・その他のユーザーの権限を表します。learner と editors は例示用の名前であり、実際の結果はシステムごとに異なります。stat の %a は 640 のような8進数の権限を示します。

ファイルとディレクトリで r, w, x はどう異なるか

同じ文字でも、ファイルとディレクトリで許可される操作は異なります。ディレクトリの権限をファイルの権限と同じように解釈すると、ファイルに読み取り権限があっても開けない状況を理解しにくくなります。

権限 通常のファイル ディレクトリ
r 内容の読み取り ディレクトリ内の名前リストの読み取り
w 内容の変更 項目の作成・削除・名前変更に必要な権限
x 実行可能なファイルを実行できる権限 知っている名前に従ってディレクトリの中を移動・探索

ディレクトリ内のファイルを開くには、パスにあるディレクトリを通過するx権限が必要です。ファイル削除は通常、そのファイル自体のwではなく、親ディレクトリのwとxに左右されます。ただし、スティッキービット、アクセス制御リスト(ACL)、ファイルシステムの特性、SELinuxなどの追加ポリシーが結果を制限することがあります。

chmodで演習ファイルの権限を変更する

次は現在のユーザーのホームディレクトリに新しい演習フォルダとファイルを作成する例です。同じ名前のフォルダがすでにある場合は別の名前を選んでください。mkdirまたはcdが失敗した場合は、後続のコマンドを実行しないでください。printfは現在のフォルダのnotes.txtを書き換えるため、既存のファイルがないかをまず確認する必要があります。

mkdir ~/linux-course-17-practice
cd ~/linux-course-17-practice
printf 'private notes\n' > notes.txt
ls -l notes.txt
chmod u=rw,g=r,o= notes.txt
stat -c '%A %a %n' notes.txt

uは所有ユーザー、gは所有グループ、oはその他のユーザーを意味します。=は該当カテゴリーの権限を指定した値に設定します。最後の出力は一般的なGNU stat環境では-rw-r----- 640 notes.txtのように表示されます。ファイルを実際に読むことができるユーザーは、アカウント・グループ所属およびパスの権限によって変わります。

数字表記ではr=4、w=2、x=1をカテゴリーごとに加えます。したがって、640はrw-・r--・---に該当します。以下のコマンドは所有ユーザーだけが読み書きできる600に変更します。コマンドが成功した場合はstatの結果の数字が600かどうか確認してください。

chmod 600 notes.txt
stat -c '%A %a %n' notes.txt

記号式chmod g+r notes.txtは現在の権限からグループの読み取りのみを追加します。逆にchmod o-rwx notes.txtは他のユーザーの3つの権限を削除します。既存の権限をすべて再指定するか(=)、一部だけを加えるかまたは減らすか(+、-)を意識して選んでください。

ディレクトリの権限を別途確認する

個人用ディレクトリを作成した場合、所有者ユーザーだけが一覧を見て通過・修正できるように700を設定できます。次は、作ったばかりの演習フォルダ内で実行してください。

mkdir private
chmod 700 private
ls -ld private
stat -c '%A %a %n' private

出力は通常drwx------ 700 privateのように表示されます。ls -ldの-dはディレクトリ内部の一覧ではなく、ディレクトリ自身の権限を示します。ディレクトリのxを誤って削除すると、所有者でもその中のファイルにアクセスするのが難しくなる場合があります。むやみにchmod -Rで全ツリーに同じ数値を適用すると、一般ファイルとディレクトリの必要なxが異なることを見落としやすいです。

sudoはいつ、どのように使うか

sudoは現在のアカウントに許可されたポリシーに従って、一つのコマンドを他のユーザー権限で実行します。すべてのアカウントに管理者権限があるわけではなく、許可範囲はシステムのsudoポリシーによります。下記のsudo -lは現在のアカウントに許可されたコマンドを確認し、認証を求める場合があります。管理者権限のない環境では、拒否メッセージが正常な結果である場合もあります。

sudo -l

必要なときにはsudo コマンドの形式で正確なコマンドにのみ権限を付与してください。例えば、他のユーザーが所有するファイルの内容を読むために無条件で権限を開放するのではなく、まずファイル・ディレクトリの権限と業務上必要なアクセス範囲を確認する必要があります。sudoはファイルの所有権を永久に変更するコマンドではありません。逆にsudoで作成されたファイルは管理者所有になる可能性があるため、現在のディレクトリにどんなファイルが作成されるかも確認してください。

シェルの出力リダイレクションはsudoより先に現在のシェルで処理されることがあります。そのため、sudo echo ... > 保護されたファイルが期待通りに動作しない場合があります。設定ファイルを修正する必要がある場合、そのコマンドを無理に組み合わせるよりもsudoeditのような適切な編集方法を検討してください。sudoのポリシーファイルは通常のエディタで直接編集せず、文法チェックを提供するvisudoを使用することでアクセスを失うリスクを減らすことができます。

権限エラーを診断する手順

  1. idで現在のセッションのユーザーとグループを確認します。アカウントのグループを変更した場合、現在のログインセッションに反映されているかも確認します。
  2. ls -lまたはstatで対象の所有権と権限を確認します。ディレクトリ自体はls -ldとして扱います。
  3. 対象ファイルだけでなく、パスにある各親ディレクトリに通過権限があるか確認します。Linuxではutil-linuxのnamei -l パスがパス構成要素を見るのに役立ちます。
  4. 基本権限で説明されない場合は、ACL、SELinux、読み取り専用マウント、スティッキービットなどの追加制限を確認します。エラーをなくそうとしてchmod 777を先に実行しないでください。
  5. 許可範囲が明確になったら、最小限の変更を適用して、元々意図したユーザーで再びアクセスできるか確認します。

実習が終わったら、まず現在の場所が実習フォルダーかpwdで確認してください。実習ファイルを引き続き使用する必要がなければ、後でフォルダーを整理しても構いません。運用データや他のユーザーのファイルをこの実習のchmod対象にしないでください。

公式ドキュメント

GNU Coreutilsの権限構造の説明と権限設定の説明で表記法や動作を確認できます。管理者権限ポリシーと安全な編集方法についてはsudoers(5) マニュアルを参照してください。