Lesson 6

アクセス制御

Lesson 6 Chapter 1
パーミッションに基づいたアクセス制御

これまでのLessonでは、ファイルに対する様々なテキスト処理について学んできました。 これらを実施する中で、「自分の大切なファイルを意図せず、又は不正に上書きされてしまったら大変ではないか?」と疑問に思われた方もいらっしゃるのではないでしょうか? Linuxは複数のユーザーが同時にログインして操作することが想定されているため、そのような心配は十分考えうることです。 Lesson6では、ファイルへの誤った又は不正な上書きを防止するため、ファイルやディレクトリへのアクセス制限に焦点を充てて解説をしていきます。

Linuxでは、ファイルやディレクトリに対して誰にどのような操作を許可するのかといったような権限情報が設定されています。 この情報のことをパーミッションといいます。 そしてパーミッションは、「ファイルへのパーミッション」と、「ディレクトリへのパーミッション」に分けられます。

ファイルへのパーミッション

まずはファイルへのパーミッションを説明します。 ファイルへのパーミッションは、以下の三つの段階ごとに設定されます。

  1. ファイルを読み取ることが出来るか
  2. ファイルへ書き込み、削除、移動をすることが出来るか
  3. ファイルを実行することが出来るか
上記はそれぞれ、「read(読取)」、「write(書込)」、「execute(実行)」という単語から、以下のように英字一文字で表されます。
記号 意味
r ファイルの読取可。「-」の場合は権限なし。
w ファイルへの書込、削除、移動可。「-」の場合は権限なし。
x ファイルの実行可。「-」の場合は権限なし。

ファイルへのパーミッションを確認する

パーミッションはlsコマンドの-lオプションで確認することができます。では「sample.txt」のパーミッションを見てみましょう。

 $ ls -l sample.txt
-rw-rw-r--. 1 user group 0 Jan 19 18:24 sample.txt

上記コマンドの実行結果を拡大します。 まずは図中の赤色矢印個所をご覧ください。丁度「-rw-rw-r--」となっているところの、一番左の横線部分です。 ここには「-」「d」「l」のいずれかの値が入ります。「-」となっている場合は「ファイル」、「d」となっている場合は「ディレクトリ」、「l」となっている場合は「リンク」を表します。 この場合は「-」なので、sample.txtはファイルだということが分かります。

Permission.png

次に、①~③の部分がファイルへのパーミッション情報となります。詳細は以下です。
①は「ユーザー」のファイルへの権限です。これは緑色線部分のuserに対応します。
②は「グループに所属するユーザー」のファイルへの権限です。これは青色線箇所のgroupに対応します。
③は「その他のユーザ」のファイルへの権限です。これは、上記二つに属さない全てのユーザーを意味します。

今回の例では、このファイルのパーミッションは以下のように設定されています。

ユーザー種別 本例でのユーザー R(読取) W(書込) X(実行)
①ユーザー user ×
②グループに所属するユーザ group ×
③その他のユーザ 上記以外の全て × ×

このようにしてファイルのパーミッションを確認することができます。

グループとは

グループに所属するユーザの「グループ」とはどのようなものでしょうか? このグループとは、後にご紹介するルートユーザーが好きな名前で作成し、ユーザーに割り振ることが出来るものです。 作成方法は以下のとおりです。keiri(経理)グループを作成し、tarouユーザーをグループに追加します。

$ su -  //ルートユーザーでログインする

この時パスワードの入力を求められるので、VirtualBoxでCentOSを立ち上げた際に設定したパスワードを入力してください。

# useradd tarou  //tarouユーザを作成する
# groupadd keiri  //keiriグループを作成する
# usermod -aG keiri tarou  //tarouをkeiriグループに追加する

ここで例えば、新たに「corp」ユーザーと「jinji」ユーザーを、また「jinji_info.txt」と「keiri_info.txt」という二つのファイルを作成し、以下のように権限設定をしたとします。 (「chown」コマンドはChapter3で紹介しますが、指定したファイルの、ユーザーとグループを設定するコマンドです。)

 # useradd corp  //corpユーザを作成する
# groupadd jinji //jinjiグループを作成する
# touch jinji_info.txt keiri_info.txt
# chown corp.jinji jinji_info.txt //jinji_info.txtのユーザをcorpに、グループをjinjiにする
# chown corp.keiri keiri_info.txt // keiri_info.txtのユーザをcorpに、グループをkeiriにする
 # ls -l . 
-rw-rw----. 1 corp jinji 120 Jan 18 14:10 jinji_info.txt
-rw-rw----. 1 corp keiri 191 Jan 8 10:48 keiri_info.txt

「jinji_info.txt」は「corpユーザー」と「jinjiグループ」に、「keiri_info.txt」は「corpユーザー」と「keiriグループ」に読取と書込の権限が与えられています。 「その他のユーザー」に対しては何も権限が与えられていません。

この場合上述のtarouさんは「keiriグループ」に属するため、「keiri_info.txt」の読取や書込を行えます。 一方tarouさんは「corpユーザー」でも「jinjiグループ」でもなく、「jinji_info.txt」に対しては「その他のユーザー」にあたるため、「jinji_info.txt」に対しては何も行うことが出来ません。

ディレクトリへのパーミッション

続いて、ディレクトリへのパーミッションについて説明していきます。 ディレクトリへのパーミッションは、以下の三つの段階ごとに設定されています。

  1. ディレクトリの内容を表示することが出来るか
  2. ディレクトリ内のファイルやディレクトリを作成、削除することが出来るか
  3. ディレクトリ内へ移動することが出来るか

ファイルの場合と同様に、上記はそれぞれ「read(読取)」、「write(書込)」、「execute(実行)」という単語から、以下のように英字一文字で表されます。

記号 意味
r 指定ディレクトリ内にあるファイル一覧の表示可。「-」の場合は権限なし。
w 指定ディレクトリ内でのファイルの作成・削除可。「-」の場合は権限なし。
x 指定ディレクトリ内への移動可。「-」の場合は権限なし。

ディレクトリへのパーミッションを確認する

ファイルへのパーミッションと同様に、ディレクトリへのパーミッションもlsコマンドで確認します。 以下のようにmkdirコマンドでnew_dirディレクトリを作成し、lsコマンドを実行してください。

 $ mkdir ./new_dir/ 
$ ls -l
drwxrwxr-x. 2 user group 6 Jan 18 14:23 new_dir

この見方は、ファイルへのパーミッションを確認したときと同様となります。 「drwxrwxr-x」部分で、一番左の部分がファイルを表す「-」ではなく、ディレクトリを表す「d」となっています。

今回の例では、このディレクトリのパーミッションは以下のように設定されています。

ユーザー種別 本例でのユーザー R(読取) W(書込) X(実行)
①ユーザー user
②グループに所属するユーザ group
③その他のユーザ 上記以外の全て ×

このようにしてディレクトリへのパーミッションを確認することが出来ます。

Lesson 6 Chapter 2
ルートユーザー

Chapter1では、ファイルとディレクトリへのパーミッションについて概要を説明し、実際のファイルやディレクトリに設定されたパーミッションを確認しました。 Linuxではこれらパーミッションに基づいて、様々なユーザーからのアクセスを制御することが出来ます。 アクセス制御においては、Chapter1でご紹介したグループの設定のように、ルートユーザーではないと操作出来ないものがあります。 Chapter2では、ルートユーザーとしてのログインやコマンド実行方法を取得していきましょう。

ルートユーザーとしてコマンドを実行したい時、以下の二つの方法があります。

  1. ルートユーザーとして、ログインし直して、コマンドを実行する。
  2. 通常のユーザーのままで、一時的にルートユーザーとしてコマンドを実行する。
それぞれ順番に方法をご説明していきます。

ルートユーザーとして、ログインしなおして、コマンドを実行する

ルートユーザーとしてログインするには、「su」コマンドを使います。 以下のようにsu -とすることで、ルートユーザーへログインできます。 この時、ルートユーザのパスワード入力を求められるので、VirtualBoxでCentOSを立ち上げた時にご自身で設定したパスワードを入力してください。

「root@localhost」と表示され、ルートユーザーに切り替わったことが確認できます。 また同時に、ルートユーザーに切り替わったことの目印として、「$」マークが「#」に変わっている点にも注目してください。

 [vboxuser@localhost ~]$ su - 
 [root@localhost ~]# _

これで、ルートユーザーとしてコマンドを実行できるようになりました。 ルートユーザーから、通常のユーザーにログインし直す際は、以下のようにsuコマンドのあとにログインしたいユーザー名を指定します。 この時もログインし直すユーザーのパスワードを求められるので、入力してください。以下の例ではvboxuserというユーザーにログインし直しています。

 [root@localhost ~]# su vboxuser 
 [vboxuser@localhost ~]$ _ 

通常のユーザーのままで、一時的にルートユーザーとしてコマンドを実行する

通常のユーザーとしてログインしている場合においても、「sudo」コマンドを使うことで、ルートユーザーとしてコマンドを実行することが出来ます。 CentOS等のほとんどのLinuxでは事前に設定をしなければsudoコマンドを実行できませんが、ubuntuではログイン時に既に「sudo」コマンドを実行できます。 基本書式は以下のとおりです。

 sudo <コマンド>

以下では、「sudo」コマンドを使い、ルートユーザーで「/root/」ディレクトリに移動しています。 この際現在ログインしているユーザーのパスワードを求められるので、入力してください。

 $ sudo cd /root/

「sudo」コマンドは、通常のユーザーのまま「一度だけ」ルートユーザーとしてコマンドを実行するものです。 従って、その後「sudo」を付けずに別のコマンドを実行する場合は、通常のユーザーとして実行されます。

sudoの設定

CentOSを使用している場合で、sudoを使いコマンドを実行すると、以下のようにエラーとなってしまいます。 is not in the sudoers file. This incident will be reported. この場合、「/etc」直下の「sudoers」というファイルに、「〇〇ユーザがsudoコマンドを使える」ように設定を記載することで、解消されます。 以下で設定の仕方を紹介します。

まずは設定するファイルを見てみます。 「su」コマンドでルートユーザーとしてログインし、以下を実行してください。

 # visudo

すると、「/etc」ディレクトリ直下の「sudoers」ファイルを編集できるようになりました。 この時、デフォルトではvimが起動されるので、vimの場合と同じように操作してください。 vimが編集可能なモードになっていないことを確認し、「G」と大文字でキー入力して最終行までジャンプしてください。 そこで「o」(オー)ボタンを押してファイル文末に書き込めるようになります。 以下のように書き込んでください。

<sudoを使いたいユーザー名>  ALL=(ALL) ALL
例えばvboxuserにsudoを使わせたい場合は、「vboxuser ALL=(ALL) ALL」と記載します。 書き込みが終了したら、「ctrl」+「c」ボタンを押し、vimの編集可能なモードを解除して、「:wq」で終了してください。

これでsudoを使えるようになっているはずです。 su ユーザー名でsudoを使えるように設定した通常のユーザーとしてログインし直してください。 試しに以下を実行して「sudo」が使えることを確認してください。

 $ sudo cd /root/

sudoersファイルは直接テキストエディタで編集しない

上記ではsudoersファイルを「visudo」コマンドを使ってvimを起動し、編集しました。 visudoコマンドを用いた場合、ファイルの上書き時に文法チェックが行われるため、直接vim等を開いて編集するよりも安全に編集できます。 sudoersファイルを誤って記載すると、sudoコマンドが使えなくなってしまう場合があります。 sudoersファイルは慎重に編集しましょう。

Lesson 6 Chapter 3
アクセス制御

Chapter1ではパーミッションについて概要を説明し、Chapter2ではルートユーザーでのコマンドの実行方法について紹介しました。 これでアクセス権を制御するための様々な操作をするのに必要な準備が整いました。 Chapter3では、ファイルやディレクトリへのアクセス権の設定方法について解説していきます。

これから以下のコマンドについて、順番に解説していきます。

コマンド 分類 内容
chmod パーミッション管理 ファイルやディレクトリに設定されているパーミッションを変更する。
chown ユーザーやグループ設定 指定されたファイルのユーザーとグループを変更する。
chgrp グループ設定 指定されたファイルのグループを変更する。

chmod

「chmod」コマンドはファイルやディレクトリのパーミッションを変更したい場合に使用します。以下が基本書式です。

chmod [パーミッション] <ファイル名>

chmodコマンドには「シンボルモード」と「数値モード」の2パターンでの設定方法があります。順にご説明します。

シンボルモード

シンボルモードでは、パーミッションを以下の順で記載します。 ユーザー、演算子、権限それぞれ下表から設定できます。

chmod [ユーザ + 演算子 + 権限] <ファイル名>

ユーザー

    設定 内容
    u ユーザー
    g グループ
    o その他のユーザ
    a すべてのユーザ

    記号が何も指定されない場合は、「a」が指定されたとみなされます。

演算子

    設定 内容
    + 指定したパーミッションの追加
    - 指定したパーミッションの削除
    = 指定したパーミッションを設定

権限

    設定 内容
    r 読取権限
    w 書込権限
    x 実行権限
    rw 読取・書込権限
    rx 読取・実行権限
    wx 書込・実行権限
    rwx 読取・書込・実行権限

現在sample.txtというファイルへのユーザーの権限は「rw-」となっていることが、以下のようにlsコマンドで確認できると思います。これを使って使用方法をご説明します。

 $ ls -l sample.txt
-rw-rw-r--. 1 user group 0 Jan 19 18:24 sample.txt

まず、ユーザー(「u」)に対して実行権限(「x」)を追加(「+」)します。

 $ chmod u+x sample.txt
$ ls -l sample.txt
-rwxrw-r--. 1 user group 0 Jan 19 18:24 sample.txt

次に、ユーザー(「u」)から読取・書込・実行権限(「rwx」)を削除(「-」)します。

 $ ls -l sample.txt
-rwxrw-r--. 1 user group 0 Jan 19 18:24 sample.txt
$ chmod u-rwx sample.txt
$ ls -l sample.txt
----rw-r--. 1 user group 0 Jan 19 18:24 sample.txt

最後に権限を当初と同じに戻します。 ユーザー(「u」)に対して読取・書込権限(「rw」)を設定(「=」)します。

 $ ls -l sample.txt
----rw-r--. 1 user group 0 Jan 19 18:24 sample.txt
$ chmod u=rw sample.txt
$ ls -l sample.txt
-rw-rw-r--. 1 user group 0 Jan 19 18:24 sample.txt

これでシンボルモードの説明を終わります。

数値モード

続いて、chmodコマンドの数値モードでのパーミッション変更の方法を説明していきます。 シンボルモードでは、ユーザーを「指定」したうえで「r・w・x・rw・rx・wx・rwx」の権限を追加・削除・設定していましたが、 数値モードでは、ユーザー「それぞれ」に対して「数値」で権限を付与します。

ひとつのユーザーに対して付与できる数値は下表のとおりです。

記号 権限
0 ---
1 --x
2 -w-
3 -wx
4 r--
5 r-x
6 rw-
7 rwx

これら数値を、ユーザー、グループ、その他のユーザーの順で順番に指定していくのです。 例えばユーザーに「読取と書込(rw-)権限を付与」、グループに「読取(r--)権限を付与」その他ユーザーに「何も付与しない(---)」場合は、表中「6」「4」「0」の数値を用いて「640」と設定することになります。

以上を踏まえて、数値モードでのchmodの使い方は以下となります。

chmod [三つの数値] <ファイル名>

以下ではsample.txtファイルについて、「所有者」には読取・書込、「グループ所属のユーザ」には読取のみ、「その他ユーザ」には何も権限を与えないようにします。

 $ ls -l sample.txt
-rw-rw-r--. 1 user group 0 Jan 19 18:24 sample.txt
$ chmod 640 sample.txt
$ ls -l sample.txt
-rw-r-----. 1 user group 0 Jan 19 18:24 sample.txt

期待した結果がしっかりと得られていることが確認できました。

chown

ここからはファイルに対して、ユーザーやグループを設定する方法をご紹介します。 「$ su -」でルートユーザーとしてログインしたうえで、事前準備として以下を実行してください。 新規のユーザーとして「cat」と「tarou」、新規のグループとして「animal」、「person」を作成しています。

 # useradd cat
# useradd tarou
# groupadd animal
# groupadd person

また、同じく事前準備としてfood.txtファイルを作成します。同時に、そのファイルへ設定されているユーザーとグループを確認しておきます。 ルートユーザーで作成したため、ユーザーとグループ名共にrootと記載されています。

 # touch food.txt
# ls -l food.txt
-rw-rw-r--. 1 root root 0 Jan 10:30 food.txt

以上で準備は終了です。

準備が長くなりましたが、「chown」コマンドの使い方を解説します。 「chown」は指定されたファイルのユーザーとグループを変更する際に使用します。基本書式は以下のとおりです。 ユーザー名のみを指定した場合は、ユーザー名のみが変更されます。 ユーザー名の後ろに「.」の文字を付けて、そのあとにグループ名を指定すると、ユーザー名とグループ名を同時に変更できます。

 chown [オプション] <ユーザー名.グループ名> <ファイル又はディレクトリ名>

また、「chown」コマンドはルートユーザーからでなければ実行できません。 丁度現在、皆様はルートユーザーとしてログインしていますので、以下を実行してください。 以下ではfood.txtのユーザーを「cat」に変更しています。

 # ls -l food.txt
-rw-rw-r--. 1 root root 0 Jan 10:30 food.txt
# chown cat food.txt
# ls -l food.txt
-rw-rw-r--. 1 cat root 0 Jan 10:30 food.txt

以下ではfood.txtのユーザーを「tarou」に、グループを「person」に変更しています。

 # ls -l food.txt
-rw-rw-r--. 1 cat root 0 Jan 10:30 food.txt
# chown tarou.person food.txt
# ls -l food.txt
-rw-rw-r--. 1 tarou person 0 Jan 10:30 food.txt

chgrp

「chgrp」コマンドは、ファイルのグループを変更する際に使用します。「chgrp」コマンドも、「chown」と同様にルートユーザーでないと実行できません。 基本書式は以下のとおりです。

 chgrp [オプション] <グループ名> <ファイル又はディレクトリ名>

以下のように、food.txtのグループを「animal」に変更することが出来ました。

 # ls -l food.txt
-rw-rw-r--. 1 tarou person 0 Jan 10:30 food.txt
# chgrp animal food.txt
# ls -l food.txt
-rw-rw-r--. 1 tarou animal 0 Jan 10:30 food.txt

終わりに

以上で本レッスンは終了です。 ファイルやディレクトリに対して、様々なアクセス権の設定をすることが出来るようになりました。 次回はファイルやディレクトリへのアクセスに関する、異なった観点からのセキュリティー強化について解説します。