Linuxコマンドを勉強~chmod、umask、chown~

chmod

ファイルやディレクトリのパーミッションを変更するには、chmodコマンドを使用します。
chmodコマンドの書式は以下の通り

ファイルやディレクトリは複数指定できます。
オプションで重要なのは-Rオプションぐらいでしょう。指定したディレクトリ内のファイルやサブディレクトリ以下まですべて再帰的にパーミッションを変更できます。
この上なく便利ですが、使うときには細心の注意が必要です。権限を変えるべきではないファイルやディレクトリが指定したディレクトリ以下に含まれていることがあるかもしれません。

chmodは名前の通り、CHanges the file MODeです。ファイルモード(アクセス権)を変更します。
chmodはファイルモードを変えるためのモードが2つあります。ややこしいですね。
コマンド書式のモードには、次の2つのモードで、変更したいファイルモードを指定します。当然必須です。
「mkdir -m アクセス権 ディレクトリ名」で指定するアクセス権も同じ書式で記述します。

ファイルモードは次の2つのモードで記述します。

  • シンボリックモード … 文字や記号で表すモード
  • オクタルモード … 8進数(オクタル)で表すモード

シンボリックモード

シンボリックモードはこんな風に書きます。

カンマ区切りで見慣れたxやらwやらが並んでいます。

実際に試した結果、こうなります。

ご覧のように、シンボリックモードではlsコマンドで表示されたパーミッション表記を、直感的に足し引きできます。
シンボリックモードのカンマで区切られた1つのモードは、こういう書式となります。

 u + rwx

  • 1桁目 … パーミッション対象。”u”が所有者、”g”が所有グループ、”o”が所有者以外のユーザです。”a”とすると、3タイプすべて一括に操作できます。
  • 2桁目 … パーミッションの操作。”+”は設定、”-“は解除。”=”は更新となります。
  • 3桁目以降 … “r”は読み取り権限、”w”は書き込み権限、”x”は実行権限です。

※2桁目が”=”の場合、3桁目以降を省略すると、rwxすべての権限が解除されます。

シンボリックモードは、カンマ区切りの並んだ順に実行されます。

上の例では、全てのユーザに全権限を与えたあと、所有者の実行権限解除、その他ユーザの実行権限解除を行っています。

このように順番を入れ替えると、所有者の実行権限解除、その他ユーザの実行権限解除を行った後に全てのユーザに全権限を与えているので、全権限が付いた状態になります。

オクタルモード

オクタルモードは、パーミッションを8進数(オクタル)で表して指定します。8進数は0~7の数字で表記した数値のことです。
こうなります。

パーミッションにはそれぞれ以下の数値が割り当てられています。

パーミッション 数値
r 4
w 2
x 1
0

所有者、所有グループ、所有者以外のユーザそれぞれに対し、設定したいパーミッションを数値にしたものを合計します。

 6 4 4

  • 1桁目 … 所有者のパーミッション。4+2+0+0で6となり、読み取り権限と書き込み権限を設定したことになります。
  • 2桁目 … 所有グループのパーミッション。4+0+0+0で4となり、読み取り権限のみを設定したことになります。
  • 3桁目 … 所有者以外のユーザのパーミッション。4+0+0+0で4となり、読み取り権限のみを設定したことになります。

つまり、644のパーミッションは、rw-r–r–と同じ意味になります。

こうすることで、0~7の数値を見るだけで与えられた権限の組み合わせが分かるようになっています。
ざっと数値と権限の組み合わせを書くと、7 = rwx、6 = rw-、5 = r-x、4 = r–、3 = -wx、2 = -w-、1 = –x、0 = —、という感じです。4~7をよく見ると思うので、そのあたりは数値→権限を瞬間で変換できるようになるといいと思います。

SUID

chmodでは、SUIDの設定ができます。

問題集などでコマンドの勉強をしてると、「実はこのコマンドにはこんな使い方もあります」なんて後出し解説がたくさんあります。
このSUIDもそう、実は今まで紹介したパーミッションのほかにも、特殊な権限の設定ができるらしいのです。

SUIDとは何でしょう、SUIDとは、セットユーザIDのことです。
セットユーザIDを設定されたファイルは、どのユーザでもファイルの所有者として実行できるようになります。
(正確に言うと、ファイルの実行プロセスに、実行ユーザでなくファイルの所有者のuidをセットする、ということです。プロセスについてはもっとずっと後で・・・)

例えば、ユーザのパスワードを管理する/etc/shadowというファイルがあります。
このファイルは、

というように、rootユーザにしか変更できません。

このファイルを更新するには、/usr/bin/passwdコマンドを実行します。
このコマンドの権限を見てみます。

所有者の実行権限が”s”となっています。これがSUIDが設定されたことを表しています。

passwdコマンドは、root以外のユーザが実行でき、所有者rootとして実行されます。
そのため、所有者root以外に編集できないはずの/etc/shadowファイルを誰でも更新することができるのです。

このSUIDを設定するには、chmodコマンドを利用します。

オクタルモードの場合、パーミッションの数値に8進数の「4000」を加えることでSUIDの設定が出来ます。

というように、3桁の8進数の前に4がつきます。

※脱線
実行権限のないファイルにSUID設定すると、ls表記が大文字の”S”になります。
この状態でも他のユーザは実行できるんでしょうか・・・気になったのでやってみました。
/tmp/workの下に、takaユーザで”Hello!”という文字列を出力するa.shというシェルを作りました。これを別のユーザで実行してみます。

その他のユーザに実行権限がなくてもファイル実行できました。

SGID

SGIDとは、セットグループIDのことです。
SUIDと同様、グループIDを所有グループとして実行することができます。

SGIDを設定するには、やはりchmodコマンドを利用します。

オクタルモードの場合、パーミッションの数値に8進数の「2000」を加えることでSGIDの設定が出来ます。

というように、3桁の8進数の前に2がつきます。

ディレクトリにSGIDを設定したとき、そのディレクトリ内でファイルやディレクトリを作成すると、
実行ユーザではなく、ディレクトリの所有グループとなります。

試してみます。
/tmpディレクトリにwork1、work2ディレクトリを作ります。work2には、SGIDを設定します。

このように、所有グループの実行権限が”s”となっています。これがSGIDが設定されたことを表しています。

この下に別のユーザでファイルを作成してみます。

ファイル作成したtaka1グループでなく、work2ディレクトリの所有グループであるtakaグループになっていることが分かります。

スティッキービット

スティッキービットは、ファイルやディレクトリにアクセス権は与えるが、rootユーザ以外には削除できないよう保護するために使用します。

スティッキービットを設定するには、やはりchmodコマンドを利用します。

オクタルモードの場合、パーミッションの数値に8進数の「1000」を加えることでスティッキービットの設定が出来ます。

というように、3桁の8進数の前に1がつきます。

スティッキービットの例としては/tmpディレクトリが挙げられます。

このように、その他ユーザの実行権限が”t”となっています。これがスティッキービットが設定されたことを表しています。
/tmpディレクトリの中ではどのユーザも自由に操作できますが(権限がすべて与えられているので)、/tmpディレクトリを削除することはrootユーザ以外できません。

umask

ところで、さきほどの例で新規作成したkkkファイルのパーミッションがrw-rw-r–(664)になっていたことにお気づきでしょうか。
linuxでは、新規作成したファイルやディレクトリには決まったパーミッションが設定されるのですが、umask値を変更することでそのパーミッションを変更することができます。

umask値は、umaskコマンドを実行することで確認できます。

4桁ありますが、実際使用しているのは下3桁です。umaskの考え方は以下となります。

ファイル ディレクトリ
アプリケーションのデフォルトパーミッション rw-rw-rw-(666) rwxrwxrwx(777)
umask値 ——-w-(002) ——-w-(002)
新規作成時のパーミッション rw-rw-r–(664) rwxrwxr-x(775)

デフォルトのパーミッションからumask値を引いた値が新規作成時のパーミッションになります。
umask値はrootユーザが0022、一般ユーザが0002となります。
rootユーザがファイルを作成すると、パーミッションが644となります。

umask値を変える場合は、

とします。

chown

ファイルやディレクトリの所有者を変えるには、chownコマンドを使います。(所有グループを変えることもできます)

ファイルやディレクトリは複数指定できます。
オプションで重要なのはやはり-Rオプションぐらいでしょう。指定したディレクトリ内のファイルやサブディレクトリ以下まですべて再帰的に所有者を変更できます。

このコマンドを実行できるのはrootユーザだけです。

rootユーザ以外がグループを変更するコマンドにchgrpコマンドがありますが、
その場合、root以外の一般ユーザは、自分が所有者であるファイルのグループを、自分が所属している他のグループに変更することだけ行うことができます。

パーミッション関連はこのぐらいで終了します。

広告
  • LINEで送る