【Linux】ファイルパーミッションとスーパーユーザー

Linuxは一つのマシンに複数のユーザーが同時にログインすることを想定して作られています。そのため、下記の問題が生じます

・他のユーザーに見られたくない物がでてくる。

・誤って他のユーザーのファイルを上書きしてくる人がいる。

今回の記事では、このようなファイルを保護を実現する仕組みを実現するためのアクセス権限の仕組みについて解説します。

 

 

スポンサードサーチ

ファイルのオーナとグループ

Linuxで取り扱われるファイルは、テキスト(txt)からシステムが提供するライブラリ、実行コマンドのすべてに所有者(オーナー)が設定されています。ファイルのオーナーはアクセス権限に設定できます。

試しにls -l で詳細表示することで、ファイルのオーナを確認します。

user@computer$ ls -l /bin/cat
-rwxr-xr-x 1 root root 43416 Sep 5 2019 /bin/cat

今回の場合では、三列目と四列目にrootが表示されています。lsコマンドの-lでは、初めにファイルのオーナー、次にグループを表示しています。

この場合、

・オーナ: rootユーザー

・グループ:root

になります。

では

user@computer$ ls -l test.txt
-rw-r–r– 1 initial initial 0 May 13 14:08 test.txt

の場合は、

作成者:initialなので、オーナーもinitialとなっています。

グループ

ちなみにグループとは、ユーザをまとめた集まりのことです。

ex.システム管理を行うwheelというグループに複数の管理者ユーザーを所属させ、そのグループに対して許可を与えることで同じ役割を持つ複数のユーザに同一の権限を与えることができます。

また、ユーザーはいくつものグループに所属できます。

まっと

僕みたいな陰キャとは大違いですね。

また、どのユーザーも最低一つのグループに所属していないといけません。

まっと

Linuxの世界はボッチにも優しかった・・・

自分がどのユーザーに属しているかはgroupsで確認できます。

user@computer$ groups
initial adm dialout cdrom floppy sudo audio dip video plugdev netdev docker

スポンサードサーチ

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

それぞれのファイルには誰にどのような操作を許可するかという権限を規定する情報が設定されています。この情報をパーミッションと言います。

ファイルのパーミッションも先ほど同じく、-ls -lで確認できるので見てみましょう。

user@computer$ ls -l /bin/cat
-rwxr-xr-x 1 root root 43416 Sep 5 2019 /bin/cat

今回の場合であると、

  1. rwx オーナー
  2. r-x グループ
  3. r-x その他のユーザー

といった三文字ごとに一つのブロックとなっていて、それぞれがオーナー、グループ、その他のユーザーとなっています。

rやw等の記号は許可されるファイルへの操作を意味しています。操作は、読み取り、書き込み、実行の三種類があり、それぞれr,w,xの記号でパーミッションを表記しています。

記号 意味
r 読み取り(read)
w 書き込み(write)
x 実行(exection)

lsコマンドの-lオプションでは、操作が許可されているときは、これらのr,w,xという記号が表示され、されていないときは-と表示されます。

つまり先ほどの/bin/catファイルも、以下のようなパーミッションが設定されていること言うことです。

ユーザ種別 読み取り(read) 書き込み(write) 実行(execute)
オーナー 許可 許可 許可
root以外に属するユーザ 許可 禁止 許可
その他のユーザー 許可 禁止 許可

このファイルはオーナーにしか書き込み制限がないことが分かります。そのため、その他のユーザは上書きができません。また、どのユーザーにも実行権限が付いているため、誰でも実行可能です。

では違うやつも試してみましょう。例えば、下記のコマンドを実行したとき、このように表示されたとします。

user@computer$ ls -l /etc/crontab
-rw-r–r– 1 root root 1042 Feb 14 2020 /etc/crontab
ユーザ種別 読み取り(read) 書き込み(write) 実行(execute)
オーナー 許可 許可 禁止
root以外に属するユーザ 許可 禁止 禁止
その他のユーザー 許可 禁止 禁止

上の表をぜひ埋めてみましょう!ドラッグで答えが出ます!

このファイルはrootユーザーにしか書き込み権限がないですね。

そのため、その他のユーザーがエディタなどで上書きしようとしても、失敗してエラーが表示されます。

また、どのユーザーに対しても実行権限が与えられていないので、次の様にコマンドを実行することはできないです。

user@computer$ /etc/crontab
-bash: /etc/crontab: Permission denied

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

ファイル同様にディレクトリにもパーミッションが設定されています。 ls -ldコマンドで確認できるので試してみましょう。

ls -ld dir
drwxr-xr-x 2 initial initial 4096 May 13 15:29 dir

ディレクトリのパーミッション表記も、ファイルと同じくr,w,xの記号で表します。ただし、ファイルとは異なった意味を持つので注意。

 

記号 意味
r
読み取り(read):ディレクトリに含まれるファイル一覧の取得
w
書き込み(write):ディレクトリ下にあるファイル・ディレクトリの作成と削除
x
実行(exection):ディレクトリをカレントディレクトリにする

 

ディレクトリのパーミッションに読み取り(r)が設定されている場合

→そのディレクトリに含まれるファイル一覧が取得可能

ディレクトリのパーミッションに読み取り(r)が設定されていない場合、lsコマンドがエラーとなりファイル一覧を取得できない。

chmodコマンドでファイルモードを変更

ここまで進めてきて、疑問に思ったことがありますよね。

A君

モードがあることはわかったけどどうやって帰るねん。

はい、ごもっともです。Linuxでは、ファイルやディレクトリのパーミッションを設定するには、ファイルモードを変更するchmodを利用します。chmodには大まかなに

  1. シンボルモードによる指定
  2. 数値モードによる指定

の二種類があり、どちらも頻繁に応用されます。

ちなみに、ファイルのパーミッションは、そのオーナーか、この章の後半で解説するスーパーユーザの変更可能です。

A君

誰でもパーミッションを変更できると、パーミッションで操作を禁止する意味がないもんね・・・

シンボルモード

シンボルモードでは、次のような書式でchmodコマンドを実行します。

chmod [ugoa] [+-=] [rwx] <file名>

シンボルモードの指定では、誰にどのような権限を追加、禁止するのかが非常にわかりやすいです。

chmod u + w file.txt
コマンド 誰に どうする 何を ファイル名

 

[ugoa]は、どのユーザーに対するパーミッションを変更するかを指定します。それぞれの意味は下記に示します。

記号 意味
u owner
g group
o
その他のユーザー
a ugoすべて

※ユーザー指定を省略すると、aを指定したことになります。

[+-=]は権限を追加するのか禁止するかの操作を表します。

記号 意味
+ 権限を追加
権限を禁止
=
指定して権限と等しくする

最後のrwxはls -lコマンドの出力同様で、読み取り、書き取り、実行を表します。

では実際にコマンド使用してみましょう

下記のコマンドは+を利用して、file.txtにオーナーの書き込み権限を追加します。

chmod u+w file.txt

オーナー グループ
その他のユーザー
変更前 r– r– r–
chmod u+w file.txt rw- r– r–

では、下記の空欄を埋めることはできますか?

オーナー グループ
その他のユーザー
変更前 r– r– r–
chmod u+w file.txt rw- r– r–
chmod g+w file.txt rw- rw- r–
chmod g-w file.txt rw- r– r–

ドラッグで答えが出るのでチャレンジしてみましょう!

 

次に複数ユーザをまとめて指定します。次のコマンド=グループおよび、その他のユーザに対するパーミッションを読み取りだけにしてみます。

chmod go=R file.txt

オーナー グループ
その他のユーザー
変更前 rxw rwx rwx
chod go=r file.txt rwx r– r–

シンボルモードはオーナの権限のみなど、パーミッションの一部だけを指定したいときに便利です。

数値モード

ここでは数値モードについて紹介します。下記のコマンドを見ましょう

chmod <8進数の数値> <file名>

シンボルモード:相対的指定

数値モード:元のパーミッションにかかわらず新しいパーミッションの値を変更する、すなわち絶対指定の方法です。

パーミッションを数値で表現するにはrwxの内許可する操作を下記の数字に置き換えて、それを足し算します。

意味 数字
読み取り(read) 4
書き込み(write) 2
実行(exection) 1

足した値を”オーナ”,”グループ”,”その他のユーザー”の順の三つに並べて指定します。

この三桁の数字がパーミッションを指定するための値です。例えば、”rwxr-xr-x”というパーミッションは変換すると次のように755となります

オーナー グループ
その他のユーザー
rwx r-x r-x
足し算する→ 421 4-1 4-1
合計 7 5 5

chmodコマンドにこの755を指定することで、元のパーミッションがなんであれ、rwxr-xr-xというパーミッションに変更できます。

user@computer$ ls -l file.txt
-rwxr-xr-x 1 initial initial 0 May 13 16:15 file.txt

 

では 下記の記号から数字を出すことはできますか?

オーナー グループ
その他のユーザー
rw- r– r–
足し算する→ 42 4 4
合計 6 4 4

 

スポンサードサーチ

スーパーユーザー

Linuxにはスーパーユーザーと呼ばれる管理者権限を持つ特別なユーザーが存在します。スーパーユーザは、ユーザ名がrootであることからrootユーザとも呼ばれます。一方で、ここまで使用してきたinitialユーザーは通常の作業に利用するユーザであり、一般ユーザーと呼ばれます。スーパーユーザーは下記の特徴を持ちます。

  1. あらゆる操作が許可された強い権限を持つユーザである。システムの設定ファイルを変更したり、新しいアプリケーションをインストール可能である。
  2. スーパーユーザはファイルのパーミッションの影響を受けずにファイルの読み込み、書き込み、削除が可能である。

しかし、スーパーユーザにもデメリットはあります。

・スーパーユーザ

Linuxを動作させるうえで必須のファイルを削除することもできてしまいます。操作を誤るとLinuxシステム自体を破壊してしまう。

・一般ユーザー

操作を誤ったとしても、重要なシステムはファイルなどは削除できません。そのため、最悪でもそのユーザが作成したファイルが壊れるだけで済みます。

そのため、通常は一般ユーザーでログインして操作し、必要な時だけスーパーユーザをとして作業するようにしましょう。

suコマンドでスーパユーザに代わる

suコマンドを使うことで、一時的に任意のユーザーになりますが、一般的にはスーパーユーザに代わるために使います。Linuxはセキュリティ上の利用からスーパーユーザで直接ログインすることが出来ないように設定されています。そのため、一般一般ユーザでログインしてからsuコマンドでスーパーユーザになるという形で利用します。

user@computer$ su
Password: root@DESKTOP-QH475PH:/home/initial#

※suして下記のエラーが出た場合はこちらを見てみてください

user@computer$ su
Password: su: Authentication failure

見てもらうとわかるように、$からシャープに変わっていますね。これは一般ユーザーからスーパーユーザになったことを示しています。

スーパーユーザとして作業を終えたら、exitコマンドで一般ユーザーに戻れます。

root@DESKTOP-QH475PH:
/home/initial# exit
initial@DESKTOP-QH475PH:~user@computer$

なお、オプションを付けないsuコマンドでユーザを切り替えると、環境変数やカレントディレクトリなど現在の環境を維持したままユーザが切り替わります。一方で、下記の様に - を付けて実行するとスーパーユーザの環境に初期化されてユーザーが変わります。

 su –

環境変数などを引き継いだままスーパーユーザになると、

アプリケーションによっては動作しないものもあります。そのため、基本的には – を付けてsuコマンドを実行しましょう。

sudoコマンド-コマンドを別のユーザとして実行する

sudoコマンド : 別ユーザとしてコマンドを実行するために利用されます。基本的には、一般ユーザーでログインしている時に、スーパーユーザでないと実行できないコマンドを実行するために利用する。

sudoコマンドの利用例をみてみます。

user@computer$ cat /etc/shadow
cat: /etc/shadow: Permission denied

許可がないと表示されてしまい、実行できません。ここでsudoの出番です。

sudo <実行したいコマンド>

user@computer$ sudo cat /etc/shadow
[sudo] password for initial:

まずパスワードを尋ねられるので、現在のユーザーのパスワードを入力しましょう。することで、その後、catが実行されます。

sudoとsuの違い

sudoはsuと非常に似ていますが、一つのコマンドだけでスーパーユーザ権限で実行できます。

suの場合、スーパーユーザで切り替わったときに、exitと明示的にコマンドを入力する必要がありました。

一方で、sudoはコマンド実行後元の一般ユーザに変更します。

また、

sudoのパスワードはログインしているユーザーのパスワード

suのパスワードはスーパーユーザのパスワード

です。この点を大きく異なります。

sudoコマンドの設定

sudoコマンドは一般ユーザにスーパーユーザの権限を与えるコマンドですが、全てのユーザにsudoコマンドが使えてしまうと区別している意味がないですよね。

そこで、sudoコマンドは、どのユーザにどこのコマンドを実行する権限をあたえるのか、という設定ができます。

Linuxをインストールした直後の状態でsudoが許可されているかどうかはDistributionによって異なります。ユーザにsudoを許可するかどうかは/etc/sudoersファイルで管理されています。(Ubuntu系は基本設定しなくて平気な気もしますが…)

ともあれ、自分で設定できるように、suコマンドを使ってみていきましょう。

root@DESKTOP-QH475PH:~# cat /etc/sudoers
# # This file MUST be edited with the ‘visudo’ command as root. # # Please consider adding local content in /etc/sudoers.d/ instead of # directly modifying this file.
# # See the man page for details on how to write a sudoers file. #

sudoersファイルは <ユーザー><machine名>=(<権限>)<コマンド>の形式で記述します。例えば、sudoが許可されている私のディストリビューション(ubuntu20.02)では下記の様に設定されています。

# User privilege specification
root ALL=(ALL:ALL) ALL
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL

私のマシンでは全てのユーザーにてsudoが与えられていますね。

まとめ

今回の記事ではファイルパーミッションとスーパーユーザーについてまとめました。

sudoばっかり使ってマシンを壊さないでね!

 

 

 

 

コメントを残す

メールアドレスが公開されることはありません。