Linux入門「はじめてのコマンドライン」- Part.5

※この記事は専門学校の講義用に作成されたものです

今回はLinuxを利用する上で避けては通れない「パーミション」について取り上げます。

今後Linux上でプログラミングを行ったり、サーバ運用をする場合には必ずこのパーミションを意識して行う必要が出てくるためです。もしいい加減なパーミションの設定をしていると、コマンドを間違えて実行した際の被害の拡大を招くだけではなく、悪意のある第三者に攻撃の糸口を与えてしまいかねません。

パッと見は地味ですが非常に重要な項目と言えます。

これまでのお話

前回からの続きになります。各ページの内容を理解した上でご覧ください。

  1. Linux入門「はじめてのコマンドライン」- Part.1
  2. Linux入門「はじめてのコマンドライン」- Part.2
  3. Linux入門「はじめてのコマンドライン」- Part.3
  4. Linux入門「はじめてのコマンドライン」- Part.4

ファイルには所有者がいる

所有者を確認する

lsコマンドに-lオプションを付けて実行してみましょう。以下のようにファイルやディレクトリにはそれぞれ所有者が設定されていることが確認できます。

では前回作成したアカウント「bob」に切り替え、同様にls -lコマンドを実行してみます。まずはユーザーの切り替えを行います。

[neec@localhost ~]$ su - bob
パスワード:
最終ログイン: 2020/11/02 () 10:06:50 JST日時 pts/1

bobは生まれたてのほやほやだったのでまだファイルがありません。第3回で取り上げたリダイレクトを使って適当なファイルを作成します。

[bob@localhost ~]$ date > now.txt
[bob@localhost ~]$ ls
now.txt

catコマンドで中をのぞくと現在の時間が保存されているのがわかります。

[bob@localhost ~]$ cat now.txt 
2020117日 土曜日 20:55:14 JST

ではls -lしてみましょう。ご覧の通りbobが作ったファイルは所有者がbobになっていますね。

[bob@localhost ~]$ ls -l
合計 4
-rw-rw-r-- 1 bob bob 43 117 20:55 now.txt

所有者が違うと編集できない?

所有者が異なる場合、そのままでは編集や削除などができないことを試してみます。

先ほどbobが作成したファイルを、一時的に利用するファイルを保存しておく/tmpディレクトリへコピーします。

[bob@localhost ~]$ cp now.txt /tmp

コピーされましたね。これを他のユーザー(neec)から触ってみます。

では元のユーザー(neec)で/tmpディレクトリへ移動し、先ほどのファイルをrmコマンドで削除しようとすると…見事に断られてしまいました。

[neec@localhost ~]$ cd /tmp
[neec@localhost tmp]$ rm now.txt 
rm: 書き込み保護されたファイル 通常ファイル `now.txt' を削除しますか?yes
rm: `now.txt' を削除できません: 許可されていない操作です

リダイレクトを使って上書きしようとしてももちろんダメ。

[neec@localhost tmp]$ date > now.txt 
bash: now.txt: 許可がありません

ところが中身を開いて確認することはできました。

[neec@localhost tmp]$ cat now.txt 
2020117日 土曜日 20:55:14 JST

デフォルトの動作は大抵の場合はこのようになっており、操作を誤って他のユーザーのファイルを削除したり上書きして情報を失うことがありません。1台のサーバの中で複数の作業を同時に行う場合などは、それぞれ用途に合わせてユーザーを作成して置くと万が一の自体に備えることができると言えます。

パーミション

デフォルトの挙動を確認しましたが、これは「パーミション(実行権)」を設定することにより変更が可能です。

パーミションを確認する

「パーミション」はls -lをすることで確認することができ、一番左側の項目がそれにあたります。一見難しそうに見えますが考え方は非常にシンプルです。

パーミションの読み方

4つのパート

このパーミションの部分は大きく4つのパートに別れています。

ファイルの種類
「ハイフン(-)」であれば通常のファイル、「d」ならディレクトリを意味しています。これはパーミションとは直接関係ありませんが合わせて覚えて置いてください。
オーナー
ファイルの所有者(オーナー)自身に対するパーミションです。例えば所有者であっても万が一のために編集や削除が出来ないよう安全装置をかけることができます。
グループ
ファイルの所有グループに対するパーミションです。例えば所有者か同じグループのユーザーであれば書き込みなどが可能なように設定を行うことができます。
その他
ファイルの所有者でもなく、同じグループにも所属していないその他のユーザーに対する設定です

rwx-とは

これも非常にシンプルで、それぞれ以下のような意味を持っています。

r
read」の略。ファイルを読み取ることができる権限が与えられていることを示します。
w
write」の略。ファイルに書き込むことができる権限が与えられていることを示します。
x
「execute」の略。ファイルを実行することができる権限が与えられていることを示します。
-
権限が与えられていないことを意味します。

パーミションの具体例

ではいくつかのパターンを見てみましょう。

例)- r w - - - - - - -

所有者だけが読み込みと書き込みを行えます。それ以外のユーザーは書き込みはもちろん、読み込みもさせないちょっと厳し目のパーミションです。

ユーザー 読み込み 書き込み 実行
オーナー ×
同じグループ × × ×
その他 × × ×

例)- r w - r w - - - -

所有者か同じグループのユーザーが読み込みと書き込み行えるパーミションです。プログラムから読み書きするデータファイルなどで見かけます。

ユーザー 読み込み 書き込み 実行
オーナー ×
同じグループ ×
その他 × × ×

例)- r w x r - x r - x

コマンドやアプリケーションなど実行可能なファイルに設定します。

ユーザー 読み込み 書き込み 実行
オーナー
同じグループ ×
その他 ×

パーミションを変更する

パーミションを変更するにはchmodコマンドを利用します。ユーザーbobで先ほどのファイルのパーミションを変更してみます。

現在は以下の通りです。

[bob@localhost ~]$ cd /tmp
[bob@localhost tmp]$ ls -l now.txt
-rw-rw-r-- 1 bob bob 43 117 21:11 now.txt

「その他のユーザー」へ書き込む権限を付与します。chmod実行後にls -lしてみると先ほどと表示が変わりましたね。

[bob@localhost tmp]$ chmod o+w now.txt
[bob@localhost tmp]$ ls -l now.txt
-rw-rw-rw- 1 bob bob 43 117 21:11 now.txt

では元のユーザー(neec)から書き込みが行えるか確認します。現状のファイルの状態は以下の通り。

[neec@localhost tmp]$ cat now.txt 
2020117日 土曜日 20:55:14 JST

今度はdateコマンドの実行結果をリダイレクトで書き込むことができました。中身も書き換わっていますね。

[neec@localhost tmp]$ date > now.txt
[neec@localhost tmp]$ cat now.txt 
2020118日 日曜日 19:42:41 JST

chmodの使い方

chmodの書式は次の通りです。オプションには操作したい内容と対象のファイルを指定します。

画像にある通りですが、パーミションの指定はそれぞれ以下のように行います。

u, g, o
最初の1文字目に対象とするユーザーを指定します。所有者(u)、グループ(g)、その他(o)
+, -
2文字目には権限を追加(+)するのか削除(-)するのかを指定します。
r, w, x
最後に具体的な権限を読み込み(r), 書き込み(w), 実行(x)のいずれかで指定します。

具体例で見てみましょう。

例)「その他」ユーザーから「書き込み」権限を奪う

[bob@localhost tmp]$ chmod o-w now.txt

例)「同じグループ」のユーザーに「実行」権限を追加する

[bob@localhost tmp]$ chmod g+x now.txt

応用)「オーナーと同じグループ」に「読み込みと書き込み」権限を追加する

これは応用です。複数の指定を同時に行うこともできます。慣れてきたら利用しましょう。

[bob@localhost tmp]$ chmod ug+rw now.txt