Gentooの創設者によるLinuxの基本。 パート3(2/4):権限モデル

Linux初心者向けチュートリアルシリーズの第3回からの第2回の抜粋。 Linuxの主要なセキュリティ機能の1つについて学ぶことができます。 つまり、アクセス権とファイル所有権モデル。


Gentooの創設者によるLinuxの基本ナビゲーション:

パートI:
  1. BASH、ナビゲーションの基本
  2. ファイルとディレクトリを管理する
  3. リンクおよびファイルとディレクトリの削除
  4. グローブルックアップ
パートII:
  1. 正規表現
  2. フォルダーの割り当て、ファイル検索
  3. プロセス管理
  4. テキスト処理とリダイレクト
  5. カーネルモジュール
パートIII
  1. ドキュメント
  2. アクセスモデル
  3. アカウント管理
  4. 環境のセットアップ(合計とリンク)

Linux許可モデル


1人のユーザー、1つのグループ


このセクションでは、Linuxの許可と所有権モデルについて説明します。 各ファイルが1人のユーザーと1つのグループに属することは既に確認しました。 これは、Linux権限モデルの本質です。 ls -lコマンドの出力で、ファイルが属しているユーザーとグループを確認できます。

$ ls -l /bin/bash
-rwxr-xr-x 1 root wheel 430540 Dec 23 18:27 /bin/bash

この例では、 / bin / bash実行可能ファイルはrootユーザーとwheelグループに属します。 アクセス権モデルを使用すると、所有者、グループ、および他のすべてのユーザーに対して、各ファイルシステムオブジェクトに対して3つの独立したレベルの権限を設定できます。

「ls -l」を理解する


ls -lコマンドの出力を見てみましょう。 リストの最初の列を見てください。

$ ls -l /bin/bash
-rwxr-xr-x 1 root wheel 430540 Dec 23 18:27 /bin/bash

最初のフィールド-rwxr-xr-xには、このファイルに対する権利のシンボリック表現が含まれています。 このフィールドの最初の文字(-)は、ファイルのタイプを決定します。この場合、通常のファイルです。 その他の可能な値:

'd'
'l'
'c' -
'b' -
'p' FIFO
's'

3つのトリプル


$ ls -l /bin/bash
-rwxr-xr-x 1 root wheel 430540 Dec 23 18:27 /bin/bash

フィールドの残りは、3つの文字のトリプルで構成されます。 最初の3つはファイルの所有者の権利を表し、2番目はファイルのグループの権利を表し、3番目は他のすべてのユーザーの権利を表します。

"rwx"
"rx"
"rx"

上記のrは読み取り(ファイルに含まれるデータの表示)が許可され、wは書き込み(データの変更と削除)が許可され、xは実行(プログラムの実行が許可)を意味します。 すべてを収集すると、誰でも内容を読み取ってこのファイルを実行できますが、このファイルを変更できるのは所有者(ルート)だけです。 したがって、通常のユーザーがこのファイルの内容のコピーを許可されている場合、rootのみがファイルを変更または削除できます。

私は誰


ファイルが属する所有者またはグループを変更する方法を学ぶ前に、まず現在のユーザーと所属するグループを見つける方法を見てみましょう。 最近suコマンドを使用していない場合、現在のユーザーはログインしているユーザーです。 suを頻繁に使用する場合、現在作業しているユーザーを覚えていない可能性があります。 作業中のユーザーを確認するには、 whoamiと入力します。

# whoami
root
# su drobbins
$ whoami
drobbins

私はどのグループに属しますか?


所属するグループを確認するには、 groupsコマンドを使用します

$ groups
drobbins wheel audio

この例は、私がdrobbins、wheel、およびaudioグループのメンバーであることを示しています。 他のユーザーがどのグループに属しているかを確認したい場合は、名前を引数として渡します。

$ groups root daemon
root : root bin daemon sys adm disk wheel floppy dialout tape video
daemon : daemon bin adm

ユーザーと所有者グループを変更する


ファイル(または他のオブジェクト)の所有者またはグループを変更するには、それぞれchownまたはchgrpコマンドを使用します。 最初にグループまたは所有者の名前を渡し、次にファイルのリストを渡す必要があります。

# chown root /etc/passwd
# chgrp wheel /etc/passwd

別の形式でchownコマンドを使用して、ユーザーとグループを同時に変更することもできます。

# chown root:wheel /etc/passwd

スーパーユーザー特権なしでchownコマンドを使用することはできませんが、 chgrpを使用して、ファイルを所有するグループを所属するグループに変更できます。

権利の再帰的変更


chownコマンドとchgrpコマンドは-Rオプションとともに使用できます。これにより、このディレクトリ以下のすべてのオブジェクトの所有者またはグループを再帰的に変更できます。 例:

# chown -R drobbins /home/drobbins

chmodの紹介


chownchgrpは、ファイルシステムオブジェクトの所有者とグループを変更するために使用されますが、それらに加えて、 ls -lコマンドの出力に表示される読み取り、書き込み、および実行権限を変更するために使用されるchmodと呼ばれる別のプログラムがあります chmodは2つ以上の引数を使用します。これらの変更を適用する必要がある後続のファイル名またはファイルのリストでアクセス権を変更する必要がある方法を説明するメソッド:

$ chmod +x scriptfile.sh

上記の例では、+ xがメソッドとして指定されています。 ご想像のとおり、+ xメソッドは、ファイルをユーザー、グループ、その他すべてのユーザーに対して実行可能にする必要があることをchmodに伝えます。 ファイルを実行するすべての権利を奪うことにした場合、次のようにします。

$ chmod -x scriptfile.sh

ユーザー、グループ、その他すべてのユーザーの分離


これまで、 chmodコマンドの例は、3組すべてのアクセス権(ユーザー、グループ、その他すべてのユーザー)のアクセス権に影響を与えてきました 。 多くの場合、一度に1つまたは2つのセットのみを変更すると便利です。 これを行うには、特殊文字を使用して、変更する必要があるアクセス許可のセットを示し、その前に+または-記号を付けます。 ユーザーにはu、グループにはg、他のユーザーにはoを使用します。

$ chmod go-w scriptfile.sh

グループと他のすべてのユーザーの書き込み権限を削除しましたが、所有者の権利はそのまま残しました。

権限をリセット


アクセス権の原因となるビットをオン/オフ状態に切り替えることに加えて、特定の値を一度にすべて設定できます。 等号演算子を使用して、指定したアクセス権のみを設定することをchmodに伝えることができます。

$ chmod =rx scriptfile.sh

このコマンドを使用して、すべての読み取りおよび実行ビットを設定し、すべての書き込みビットをリセットします。 特定のトリプルのビットの値を設定したい場合、等号演算子の前にそのシンボリック名を指定することでこれを行うことができます。

$ chmod u=rx scriptfile.sh

数値モード


これまでのところ、 chmodコマンドの許可を指定するための、いわゆるシンボリックな方法を使用しました。 ただし、権利を指定する別のかなり一般的な方法があります。4桁の8進数を使用します。 この構文は、パーミッションの数値構文と呼ばれ、各桁はトリプルのパーミッションを表します。 たとえば、1777年、777はこのセクションで説明するフラグを所有者、グループ、および他のユーザーに設定します。 1は特別な許可ビットを示すために使用されます。これについては後で説明します(セクションの最後にある「わかりにくい最初の数字」を参照)。 この表は、数値へのアクセス権がどのように変換されるかを示しています。

  番号モード 
 rwx 7
 rw- 6
 rx 5
 r-- 4
 -wx 3
 -w- 2
 --x 1
 --- 0

数値アクセス構文


パーミッションの数値構文は、次の例に示すように、ファイルのすべてのパーミッションを指定する場合に特に役立ちます。

$ chmod 0755 scriptfile.sh
$ ls -l scriptfile.sh
-rwxr-xr-x 1 drobbins drobbins 0 Jan 9 17:44 scriptfile.sh


この例では、0755パーミッションを割り当てました。これは、パーミッション-rwxr-xr-xの組み合わせに相当します。

仮面


プロセスが新しいファイルを作成するとき、このファイルに設定する権限を示します。 多くの場合、0666の権利が要求され(全員による読み取りと書き込み)、ほとんどの場合に必要な権限よりも多くの権限が付与されます。 幸いなことに、Linuxで新しいファイルが作成されるたびに、システムはumaskというパラメーターにアクセスします。 システムはumask値を使用して、より適切で安全な初期アクセス許可を下げます。 現在のumask設定を表示するには、コマンドラインでumaskと入力します。

$ umask
0022


Linuxシステムでは、umaskのデフォルト値は0022です。これにより、他のユーザーは新しいファイルを読み取ることができます(ファイルにアクセスできる場合)が、ファイルは変更できません。 生成されたファイルにより高いレベルのセキュリティを自動的に提供するために、umask設定を変更できます。

$ umask 0077

このumask値により、グループおよびその他のユーザーは、新しく作成されたすべてのファイルに対して絶対にアクセス権を持たなくなります。 それでは、umaskはどのように機能しますか? 「通常の」ファイル許可の割り当てとは異なり、umaskはどの許可を無効にするかを決定します。 繰り返しますが、数値とメソッドの値の対応表を見てください。

  番号モード 
 rwx 7
 rw- 6
 rx 5
 r-- 4
 -wx 3
 -w- 2
 --x 1
 --- 0

この表を使用すると、0077の最後の3文字が--- rwxrwxを示していることがわかります。 ここで、 umaskが無効にするアクセス許可をシステムに表示することに注意してください。 1つ目と2つ目を組み合わせると、グループと他のユーザーのすべての権限が無効になり、所有者の権限は変更されないことが明らかになります。

suidとsgidの紹介


ログインすると、新しいシェルプロセスが開始されます。 これについては既に知っていますが、この新しいシェルプロセス(通常はbash)がユーザーに代わって実行されていることを知らない場合があります。 そのため、bashは所有するすべてのファイルとディレクトリにアクセスできます。 実際、ユーザーとして、私たちは私たちに代わって操作を実行するプログラムに完全に依存しています。 また、実行するプログラムはユーザーIDを継承するため、アクセスが許可されていないファイルシステムオブジェクトにアクセスできません。 たとえば、rootを除くすべてのユーザーに対して書き込みフラグが無効になっているため、一般ユーザーはpasswdファイルの内容を直接変更できません。

$ ls -l /etc/passwd
-rw-r--r-- 1 root wheel 1355 Nov 1 21:16 /etc/passwd


ただし、一般ユーザーは、パスワードを変更する必要がある場合、少なくとも/ etc / passwdの内容を少なくとも間接的に変更できる必要もあります。 しかし、ユーザーがこのファイルを変更できない場合、どうすればよいですか?

ズイッド


幸いなことに、Linux許可モデルには、 suidsgidという2つの特別なビットがあります 。 実行中のプログラムにsuidビットが設定されている場合、実行可能ファイルの所有者の代わりに機能し、プログラムを起動した人の代わりには機能しません。 これで、/ etc / passwdで質問に戻ることができます。 passwd実行可能ファイルを見ると、その所有者がrootユーザーであることがわかります。

$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root wheel 17588 Sep 24 00:53 /usr/bin/passwd


所有者のトリプルパーミッションのxではなくsであることに注意してください。 これは、この特定のプログラムに対して、suidビットと実行権限が設定されることを意味します。 このため、passwdプログラムを起動すると、起動したユーザーではなく、root(すべてのスーパーユーザー権限を持つ)として機能します。 また、passwdはスーパーユーザー特権で動作するため、/ etc / passwdを問題なく編集できます。

Suid / sgidの警告


suidの仕組み、sgidの仕組みも同様です。 これにより、プログラムは現在のユーザーではなく、グループのアクセス権を継承できます。
 !  ,          suid  sgid. -,  suid  sgid        ls -l.   x  ,      s (  ). ,   x        S (  ). 
 !    : suid  sgid     ,            .        suid .  passwd —   ,    suid. 

suidとsgidを変更する


suidビットとsgidビットを設定および削除する方法は非常に簡単です。 これは、suidビットを設定する方法です。

# chmod u+s /usr/bin/myapp

また、次の例では、ディレクトリからsgidフラグを削除します。 少し下のディレクトリでsgidビットがどのように機能するかがわかります。

# chmod gs /home/drobbins

権利とディレクトリ


これまで、通常のファイルの観点からアクセス権を検討してきました。 ディレクトリに関しては、いくつかの違いが現れます。 ディレクトリは同じ許可フラグを使用しますが、それらを解釈することはわずかに異なる意味を持ちます。

ディレクトリに読み取りフラグが設定されている場合、ディレクトリのコンテンツのリストを表示できます。 書き込みフラグは、ディレクトリにファイルを作成できることを意味します。 実行フラグは、ディレクトリに入り、内部のすべてのサブディレクトリにアクセスできることを意味します。 実行フラグがないと、ディレクトリ内のファイルシステムオブジェクトにアクセスできません。 読み取りフラグがないと、ディレクトリ内のファイルシステムオブジェクトは表示できませんが、ディスク上のオブジェクトへのフルパスがわかっていれば、ディレクトリ内のオブジェクトにアクセスできます。

ディレクトリとsgidフラグ


ディレクトリにsgidビットが設定されている場合、内部で作成されたすべてのファイルシステムオブジェクトはディレクトリグループを継承します。 この機能は、ディレクトリツリーを作成する必要があり、それらすべてが1つのグループに属している必要がある場合に便利です。 これは次のように実行できます。

# mkdir /home/groupspace
# chgrp mygroup /home/groupspace
# chmod g+s /home/groupspace


これで、mygroupグループのユーザーは、/ home / groupspace内にファイルとディレクトリを作成でき、グループmygroupにも自動的に割り当てられます。 このユーザーのumask設定に応じて、新しいファイルシステムオブジェクトは、mygroupグループの他のユーザーが読み取り可能、変更可能、または実行できる場合とできない場合があります。

ディレクトリと削除


デフォルトでは、Linuxのディレクトリは多くの状況で最も便利な方法で動作しません。 通常、ディレクトリへの書き込み権限がある場合、誰でもディレクトリ内のファイルの名前を変更または削除できます。 個々のユーザーが所有するディレクトリの場合、この動作は通常問題を引き起こしません。

ただし、多数のユーザーが使用するディレクトリ、特に/ tmpおよび/ var / tmpの場合、これにより多くの問題が発生する可能性があります。 これは、誰でもこれらのディレクトリに書き込むことができ、誰でもファイルを削除して名前を変更できるためです-それらがそれらに属していなくても! 明らかに、ユーザーがrm -rf / tmp / *をいつでも印刷して他のユーザーのファイルを破棄できる場合、/ tmpを一時的なストレージとして使用することは非常に困難です。

幸いなことに、Linuxにはいわゆるスティッキービットがあります。 / tmpにスティッキービットが設定されている場合(chmod + tコマンドを使用)、/ tmp内のファイルを削除または名前変更できるのは、これらのファイルの所有者またはスーパーユーザーのみです。

とらえどころのない最初の兆候


このセクションを締めくくるために、最後に数値構文で使用される最初の文字に注目します。 スティッキー、suid、およびsgidビットを設定するために使用されます。

  suid sgidスティッキーモード 
 on on on 7
オンオンオフ6
オンオフオン5
オンオフオフ4
オフオンオン3
オフオンオフ2
オフオフオン1
オフオフオフ0

以下は、4桁モードを使用して、ワーキンググループが使用するディレクトリへのアクセス権を設定する方法の例です。

# chmod 1775 /home/groupfiles

宿題として、許可設定で1755が何を意味するかを調べます。 :)

翻訳は、 notabenoid.comを使用して集合的な心によって実行されました。 次のbenoidユーザー(アルファベット順)に感謝します: kindacutenekjineRich Alexei Blazhko(blazhkoa@gmail.com)、および一連の翻訳全体のイニシエーターであるVBartに感謝します。

継続するには...


著者について


ダニエル・ロビンス


Daniel Robbinsは、Gentooコミュニティの創設者であり、Gentoo Linuxオペレーティングシステムの作成者です。 ダニエルは妻のメアリーと元気な娘2人とニューメキシコに住んでいます。 彼はFuntooの創設者兼代表でもあり、 IBM developerWorks 、Intel Developer Services、およびC / C ++ Users Journalの技術記事を数多く執筆しています。

クリス・ハウザー


クリスハウザーは、1994年にテイラー大学(米国インディアナ州)の管理者チームに参加し、コンピューターサイエンスと数学の学士号を取得して以来、UNIXの支持者でした。 その後、Webアプリケーション、ビデオ編集、UNIXドライバー、暗号化保護など、さまざまな分野で働きました。 現在、Sentry Data Systemsで働いています。 Chrisは、Gentoo LinuxやClojureなどの多くの無料プロジェクトにも貢献し、 The Joy of Clojureの共同執筆者でもあります。

アロン・グリフィス


Iron Griffisはボストンに住んでおり、過去10年間、Hewlett-PackardでTru64、Linux、Xen、およびKVM仮想化セキュリティ認証用のUNIXネットワークドライバー、そして最近ではHP ePrintプラットフォームなどのプロジェクトに従事しました。 プログラミングからの余暇には、自転車に乗ったり、ビットをジャグリングしたり、ボストンレッドソックスのプロ野球チームを応援したりしながら、プログラミングの問題を一掃することを好みます。

Source: https://habr.com/ru/post/J109392/


All Articles