UNIXやLinuxのシステム管理(システム・コマンド・設定)に関する世界観5(ユーザーとパーミッション)です。
UNIXでは、複数のユーザーを作ることができる。ユーザーの個人ファイルはほかのユーザーから見えない形にすることができ、複数のユーザーが同時に同じシステムを使うことができる。これを「マルチユーザー」と呼ぶ。
また、一般ユーザーのほかに、システムにひとつだけ「rootユーザー」が存在する。rootユーザーは管理者権限のあるユーザーのことで、簡単に言えば「どんなことでもできる特権ユーザー」のこと。
rootユーザーはシステムの破壊や変更ができ危険であるため、通常の利用では一般ユーザーを使い、必要になった時だけsuコマンド(ユーザーの切り替えコマンド)などを使ってroot権限を使えるようにして、システムの破壊行為(たとえばパッケージ管理システムによる新しいアプリケーションのインストールやアップデート)などを行えるようにする。これがUNIXにおける基本である。
また、別のユーザーやグループ(ユーザーが束になったもの)に自分のファイルを見ることのできる権限を与えるには、ファイルの属性であるパーミッション(読み書き実行の権限)と、ファイルの所有ユーザー・所有グループを設定する。
2024.02.24
UNIXにはユーザーとグループがある。すなわち、自分の所有するファイルについて、他のユーザーから見ることができないように権限の許可(パーミッション)を設定できる。
ただし、実際のところ、他のユーザーとも共有したいファイルがあるかもしれない。そういう時に、グループという機能を利用できる。
ユーザーの所有するファイルについて、所属ユーザーには読み書き実行を許可し、所属グループには読み込みだけ許可したりすることができる。このために、ファイルにはパーミッションと呼ばれる権限が定められている。
こうしたユーザーの仕組みに対して、ひとつ特権的なユーザーがUNIXには必ずあり、それを「rootユーザー」という。
rootユーザーは、全てのユーザーのデータにアクセスでき、全てのユーザーのプロセスに干渉できる。
(「詳解 Linuxカーネル 第2版」を読みながら自分で考えて書きました。)
UNIXでは、そのユーザーが実行したコマンドプロセスはそのユーザーの権限において実行される、という「ユーザーの権限」がある。
ファイルやディレクトリには、所有者や所属グループやその他のユーザーに対して、どのような許可を与えるか、という「パーミッション」が決められている。
UNIXでは、ユーザーのプロセス権限とファイルのパーミッションにおいて、それぞれのユーザーとプログラムの「出来ること」が決まっている。これが、UNIXにおけるマルチユーザーシステムである。
ある意味、「旧世代的だ」と感じられるかもしれない。昔の、UNIXが開発された頃の、「たくさんの端末に1つの共有コンピュータが使われている」という状態の再来のように感じられるかもしれない。だが、本当は今でも、そうした「1つのコンピュータとたくさんのユーザーが繋がる」という場面は多くて、たとえばHTTPサーバーなどはそうした利用の形態に当たるだろう。完全にマルチユーザーシステムと合致するわけではないが、本来そのような用途を想定し、たとえばユーザーがログインするコンピュータとデータコンピュータを分けて管理する、といったコンピュータの「柔軟な構成」が可能である。こうした点が、UNIXが「ネットワークとの親和性が高い」と言われる点かもしれない。
ただ、本当のことを言うと、今のWindows PCのように「全てのパソコンにOSを入れる」というモデルが正しいわけではない。
たとえば、Windowsにはサポート期限というのがある。もう少しすると、Windows 7もサポートが切れてしまう。今の、全てのPCにWindowsを導入するモデルだと、全てのPCの分だけライセンスを購入しなければならない。10台あれば、ライセンスの価格は10倍になる。これは大きな出費だ。
それに対して、ひとつの中央コンピュータにのみLinuxのワークステーションを使い、それぞれ個別のPCではX端末を使うようにすれば、(X端末を導入するクライアントPCのOSはどうするのかという問題はあるが)OSの管理はひとつのワークステーション分だけで済む。
ただし、そもそもOSのバージョンアップが必要なのか、という問題もあるし、端末にも何らかのシステムを導入して使うことを考えると、これも考え物である。
僕としては、家庭内のLANに繋がったサポートの切れたコンピュータを、ひとつの(たとえばルータのファイアーウォールのように)経路を中心にし、何らかの形で「家庭内LANの全てのコンピュータを守る」ような、新しいセキュリティとアンチウイルス技術が必要になってくるのではないかと思う。全てのOSでWindows Updateをかけなくても、ひとつの中央コンピュータだけをきちんと管理していれば、他のコンピュータはその中央システムが守ってくれるような、そういうシステムが必要ではないかと思う。
rootユーザーになってシェルを実行する。
$ su - Password: (root のパスワードを入力) # (rootのシェルになった)
終了する時はexitを実行する。
# exit $ (ユーザーに戻る)
UNIXコマンド(基本)も参照のこと。
そのコマンドだけをroot権限で実行出来る。僕はあまり好きではないが、使いやすさを考えてUbuntuでは標準である。
後日注記:sudoを使うことのできるユーザーは、/etc/sudoersで設定します。管理者権限を与えるのと同じことなので、注意して行いましょう。
UNIXはマルチユーザー・マルチタスクのOSであるため、簡単にユーザーを追加することが出来る。
ユーザーを追加するには、useraddコマンドをrootで実行する。
たとえば、wheel(suを使うことができる)のグループに所属するhogeというユーザを作成する。
# useradd -m -G wheel -s /bin/bash hoge # passwd hoge
詳しくは以下のページが参考になります。
コマンド | 説明 |
---|---|
useradd userdel usermod | ユーザの追加と削除と設定。 |
groupadd groupdel groupmod | グループの追加と削除と設定。 |
passwd | パスワードの変更。 |
id | ユーザーID・グループIDが表示できる。 |
su | ユーザー権限を変えてログインできる。 |
who | ログイン中のユーザを表示できる。 |
2023.01.17
2024.10.06編集
UNIXでは、ホームディレクトリ(/home/username)がそれぞれのユーザに与えられ、このディレクトリが基本的にユーザのデータや作業の場所になる。ホームディレクトリ以外は、一部の例外を除いてrootユーザにならなければ、どんなアプリケーションでも変更することは出来ない(読み取りや実行は出来る場合が多い)。そのため、セキュリティが高い。
逆に言えば、注意すべきなのはホームディレクトリの中のデータだ。重要なデータはバックアップを取って、スパイウェアに知られないように、パスワードなどの重要なデータはネットワークに繋がった場所に置かないようにしよう。
ホームディレクトリは、最近ではデスクトップやドキュメントのような便利なディレクトリが自動的に作られる。それから、ユーザそれぞれの設定ファイルとして、「.」から始まる「ドットファイル」というファイルがアプリケーションの使用時などに作られる。自動的に作られる場合もあれば、自分で設定する場合(.emacsなど)もある。ドットファイルは、ファイルマネージャなどからは隠しファイルとして扱われる。lsコマンドでドットファイルまでを一覧したい場合は、ls -aオプションを使う。
$ ls -a
ドットファイルは、.bashrcなど、アプリケーションにとってはとても重要なファイルであることが多いため、良く注意して管理しよう。
UNIXシステム管理(6.システム情報と設定)も参照のこと。
ホームディレクトリを指す別の表現として、UNIXでは昔から~(チルダ)を用います。
たとえば、ホームディレクトリの中の.bashrcをviで編集するためには、
$ vi ~/.bashrc
とします。この中の~/の部分がホームディレクトリへのパスに変換されてコマンドが実行されます。
あるいは、cdでカレントディレクトリをホームディレクトリに移動してからviで編集することもできます。
$ cd ~ $ vi .bashrc
この場合、カレントディレクトリが変わることに注意しましょう。
また、cdコマンドはディレクトリ名を指定せずに実行するとホームディレクトリに移動するため、この場合はcd ~の「~」を省略できます。
また、環境変数HOMEも、~と同様に、ユーザーのホームディレクトリを指し示す環境変数です。これは$HOMEから参照できます。
2024.03.26-27
UNIXにおけるグループは、ユーザの権限を決めるために使うことが多い。
特に、wheelグループは多くのLinuxやUNIXで用いられるグループで、rootユーザーに昇格するためのsuコマンドを使うことができるようになる。rootのパスワードを知っているユーザーにroot権限を与えるのと似たような意味合いがあるので覚えておこう。また、apacheなどrootになってはならないユーザーにはできるだけ与えないようにしよう。
後日注記:UNIXではグループはユーザーの権限の制限に使う、ということを覚えておきましょう。また、Webサーバーなどを管理する際、セキュリティに気を使うなら、rootでも普段使いの一般ユーザーでもない、Webの特別ユーザーを作ってもいいかもしれません。その上で/var/wwwの所有権をそのユーザーにすれば、一般ユーザーから/var/wwwは書き換えできなくなります。
設定ファイル | 説明 |
---|---|
/etc/passwd | ユーザーごとのさまざまな設定が書かれている設定ファイル。 |
/etc/shadow | 暗号化されたパスワードが記述されている設定ファイル。 |
項目 | 説明 |
---|---|
一番左 | 所有者 |
真ん中 | 所有グループ |
一番右 | その他のユーザー |
そして、rあるいは4が読み込み、wあるいは2が書き込み、xあるいは1が実行の権限を表す。
許可 | 説明 |
---|---|
r, 4 | 読み込み |
w, 2 | 書き込み |
x, 1 | 実行 |
記号表記では、rw-のようにアルファベットを並べる。八進表記ではこの数字をビット演算のように足す。4 + 2 = 6は読み込み・書き込み許可を表す。
この結果、パーミッション644は「所有者に読み書き、所有グループとその他のユーザーに読み込みの許可を与える」ことを表す。
また、「-rw-r--r--」や「drwxr-xr-x」のように一番左にもうひとつ表示された場合、ファイル種別を表す。「-」はファイル、「d」はディレクトリ、「l」はシンボリックリンク。
種別 | 説明 |
---|---|
- | ファイル |
d | ディレクトリ |
l | シンボリックリンク |
ディレクトリの場合、rは中身を一覧で表示できるかどうか、wはそのディレクトリの中に新しくファイルを作成・削除できるかどうか、xは作業ディレクトリとしてそのディレクトリにcdできるかどうか、を表す。
ディレクトリ | 説明 |
---|---|
r | ファイル一覧の表示 |
w | ファイル作成・削除 |
x | カレントディレクトリとしてcd可能 |
Windowsのように.exeなら実行できる、というわけではなく、実行ファイルやスクリプトを実行させたい時は基本的にパーミッションの許可が必要(厳密に言えば、スクリプトの場合、rubyなどに引数を与えて実行させることはできる)。
パーミッションの確認はls -lで見ることが出来る。
$ ls -l -rw-r--r-- 1 user group 9 1月 1 00:00 hoge.txt drwxr-xr-x 6 user group 20480 1月 1 00:00 foo_dir
Perl/CGIも参照のこと。
2023.01.17編集
以下のようなコマンドで変えるか:
chmod 644 hoge.html
あるいは、このように変えるかです。
所有ユーザに読み書きの権限を与える:
chmod u+rw hoge.html
グループに実行の権限を与える:
chmod g+x hoge.html
その他のユーザからすべての権限を消す:
chmod o-rwx hoge.html
すべてのユーザに読み込みの権限を与える:
chmod a+r hoge.html
以上はUNIXの基礎知識 - パーミッション編 - With RAELIANとLinuxの権限確認と変更(超初心者向け) - Qiitaを参考に執筆しました。
2023.01.17編集
パーミッション、オーナー、グループを変える三種の神器。
コマンド | 説明 |
---|---|
chmod | パーミッションを変更する。 |
chown | 所有者を変更する。 |
chgrp | 所属グループを変更する。 |
詳しくは以下のページが参考になります。
以下はman-pages。
UNIXにはユーザーとパーミッションの概念があるとして、どこでこれを使うか。
これは、ファイルシステムの役割を柔軟にしたい時に使います。
たとえば、Apacheのhtmlデータの入るディレクトリは、多くの場合/var/www/htmlですが、ユーザーassyが居たとして、Webサーバのデータをassyしか変更しないのであれば、/var/www/htmlの所有者やグループをassyに属させる、などといったことができます。ただし、実際はユーザーとグループをapache:apacheとした上で、apacheグループにユーザーassyを所属させるのが良いでしょう。
また、/mnt/usbhddをassyしか使わないのであれば、これもassyに所有権を与えることができます。
あるいは、/usr/local/assyのようなディレクトリを作って、このディレクトリをassyの所有とし、assyにこのディレクトリを変更する権限を与えることで、/usr/local/assy以下のprefixはassyの自由に変えられます。
僕も無知のため色々と問題はあるかもしれませんが、このようにすることで、システムの一部だけをユーザーやグループに開放したりすることができます。
Apacheも参照のこと。
Linuxではファイルシステムを暗号化することができますが、ホームディレクトリだけの暗号化も可能です。
この場合、ログインパスワードを暗号化のパスワードと紐づけて、ログインした時点で暗号化が解けるようにし、もしマシンが盗まれてもハードディスクからホームディレクトリの機密情報(個人情報や仕事に使うデータなど)を守ることができます。
詳しくは以下を参照のこと。
しかしながら、別にSSHの設定が必要だったり(ssh接続から~/.ssh/authorized_keysが読めなくなることがある)、スワップや/tmpが暗号化されないなどの問題があるようです。
僕は、本当に「仕事用のマシンは暗号化しなさい」と上司から言われたとか、あるいは機密情報が入ったサーバーなどで使うのでなければ、ホームディレクトリの暗号化はおすすめしません。個人で使うパスワードなどを保護したいなら、データを圧縮解凍ツールで圧縮する時に暗号化を行うなどで代用することができます。LVM暗号化を使うという手もあります。
暗号も参照のこと。
クレデンシャルとは、ログインの時に使われるユーザー認証情報(ユーザーID・パスワード)のこと。
Linuxでは、異なるユーザーIDでプロセスを実行したい時などに使用する。
プログラムを別のユーザー・グループで実行したい時は、setuidとsetgidを使う。実行ユーザーの権限ではなく、所有者の権限(たとえばroot)でプログラムを実行できる。root権限を持たない一般ユーザーであっても、setuidビットがファイルパーミッションに設定されていて、所有者がrootである場合、root権限でそのプログラムを実行できる。
passwdやmailのように、一時的にrootなどの権限が必要なプログラムはこの仕組みを用いて実現されている。
詳しくは以下のページが参考になります。
Linuxでは、ログインのためにPAMと呼ばれるAPIを使う。
昔のloginコマンドでは、認証情報の管理のために/etc/login.defsという設定ファイルを記述していた。
だが、この方法では、loginコマンドと同様、ログイン処理を行う必要のあるプログラム(telnetやsshやftpなど)で、同じ設定を繰り返し記述しなければならない。
これは、リモートログインを多用するUNIXの世界では非効率的で無駄が多い。そのため、Linuxでは、ライブラリを用いたログインの仕組みであるPAMを使う。
(ふつうのLinuxプログラミング Linuxの仕組みから学べるgccプログラミングの王道を参考に執筆しました。)
ユーザーやグループなどの情報(クレデンシャル)が欲しい時に、/etc/passwdや/etc/groupを自前で解析するような必要はありません。専用のAPIがあります。このAPIには、
API | 説明 |
---|---|
getuid(), geteuid(), getgid(), getegid() | ユーザーID・グループIDを得る |
setuid(), setgid() | ユーザーID・グループIDを変更する |
getgroups(), initgroups() | 補足グループを取得・設定する |
getpwuid(), getpwnam() | ユーザ情報(パスワードを含む)を得る |
getgruid(), getgrnam() | グループ情報を得る |
などがあります。ユーザー情報は必ずしも/etc/passwdや/etc/groupだけにあるとは限らないので(NISやLDAPなど)、これらのAPIを使うようにする必要があります。
(ふつうのLinuxプログラミング Linuxの仕組みから学べるgccプログラミングの王道を参考に執筆しました。)
2023.01.21
セキュリティも参照のこと。