目次
人 (またはプログラム) がシステムへのアクセスの要求をした際に、認証はその正体が信頼できるものだと確認します。
|
警告 |
|---|---|
|
PAM の設定のエラーはあなたをあなた自身のシステムから締め出すかも知れません。レスキュー CD を手元に置くか代替ブートパーティション設定を必ずします。復元するには、それらを使ってシステムをブートしそこから修正します。 |
普通の Unix 認証は PAM
(プラグ可能な認証モジュール) のもとで pam_unix.so(8)
モジュールによって提供される。":" で分離されたエントリーを持つその3つの重要な設定ファイルは次です。
表4.1 3つの pam_unix(8) に関する重要な設定ファイル
| ファイル | パーミッション (許可) | ユーザー | グループ | 説明 |
|---|---|---|---|---|
/etc/passwd |
-rw-r--r-- |
root |
root |
(浄化された) ユーザーアカウント情報 |
/etc/shadow |
-rw-r----- |
root |
shadow |
保護されたユーザーアカウント情報 |
/etc/group |
-rw-r--r-- |
root |
root |
グループ情報 |
"/etc/passwd" ファイルは以下の内容です。
... user1:x:1000:1000:User1 Name,,,:/home/user1:/bin/bash user2:x:1001:1001:User2 Name,,,:/home/user2:/bin/bash ...
passwd(5) に説明されているように、このファイルの ":"
で分離されたエントリーそれぞれは以下の意味です。
ログイン名
パスワード規定エントリー
数値のユーザー ID
数値のグループ ID
ユーザー名またはコメント領域
ユーザーのホームディレクトリー
ユーザーのコマンドインタープリター (無いこともある)
"/etc/passwd"
の2番目のエントリーは暗号化したパスワードのエントリーとして使われていました。"/etc/shadow"
が導入された後は、このエントリーはパスワード規定エントリーとして使われています。
"/etc/shadow" の内容は次です。
... user1:$1$Xop0FYH9$IfxyQwBe9b8tiyIkt2P4F/:13262:0:99999:7::: user2:$1$vXGZLVbS$ElyErNf/agUDsm1DehJMS/:13261:0:99999:7::: ...
shadow(5) で説明されているように、このファイルの ":"
で分離されたエントリーそれぞれは以下の意味です。
ログイン名
暗号化されたパスワード (最初が "$1$" で始まっているのは MD5
暗号化が使われていることを示します。"*" はログイン不可を示します。)
1970 年 1 月 1 日から、最後にパスワードが変更された日までの日数
パスワードが変更可能となるまでの日数
パスワードを変更しなくてはならなくなる日までの日数
パスワード有効期限が来る前に、ユーザが警告を受ける日数
パスワード有効期限が過ぎてからアカウントが使用不能になるまでの日数
1970 年 1 月 1 日からアカウントが使用不能になる日までの日数
…
"/etc/group" のファイル内容は次です。
group1:x:20:user1,user2
group(5) に説明されているように、このファイルの ":"
で分離されたエントリーそれぞれは以下の意味です。
グループ名
暗号化されたパスワード (実際は使われていない)
数値のグループ ID
"," で分離されたユーザー名のリスト
|
注記 |
|---|---|
|
" |
|
注記 |
|---|---|
|
もし " |
|
注記 |
|---|---|
|
|
アカウント情報管理のための重要コマンドを記します。
表4.3 アカウント情報を管理するコマンドのリスト
| コマンド | 機能 |
|---|---|
getent passwd user_name |
"user_name" のアカウント情報の閲覧 |
getent shadow user_name |
"user_name" のシャドーされたアカウント情報の閲覧 |
getent group group_name |
"group_name" のグループ情報の閲覧 |
passwd |
アカウントのパスワード管理 |
passwd -e |
アカウントのアクティベーションのために一回だけ使えるパスワードの設定 |
chage |
パスワードのエージング情報管理 |
一部機能が機能するには root 権限が必要な場合があります。パスワードとデーターの暗号化は crypt(3)
を参照下さい。
|
注記 |
|---|---|
|
Debian が提供する salsa 機器と同様な PAM と NSS
の設定をされたシステム上では、ローカルの " |
passwd(1) によるとシステムインストール時や passwd(1)
コマンドによってアカウント作成する際には、次に記すようなセットからなる少なくとも6から8文字の良好なパスワードを選択するべきです。
小文字のアルファベット
数字の0から9
句読点
|
警告 |
|---|---|
|
容易に推測できるパスワードを選んではいけません。アカウント名、社会保険番号、電話番号、住所、誕生日、家族員やペットの名前、辞書にある単語、"12345" や "qwerty" のような単純な文字列…、これらすべてパスワードに選んではいけません。 |
ソルトを使って暗号化されたパスワードを生成する独立のツールがあります。
表4.4 パスワード生成ツールのリスト
| パッケージ | ポプコン | サイズ | コマンド | 機能 |
|---|---|---|---|---|
whois
|
V:25, I:251 | 387 | mkpasswd |
crypt(3) ライブラリーの充実しすぎたフロントエンド |
openssl
|
V:841, I:995 | 2111 | openssl passwd |
パスワードハッシュの計算 (OpenSSL)。passwd(1ssl) |
Debian システムのような現代的な Unix 的システムは PAM (プラグ可能な認証モジュール: Pluggable Authentication Modules) と NSS (ネームサービススイッチ: Name Service Switch) メカニズムをローカルのシステム管理者がそのシステム管理用に提供します。それらの役割をまとめると以下のようになります。
PAM は、アプリケーションソフトウェアーが使う柔軟な認証メカニズムを提供し、パスワードデーターの交換に関与します。
NSS は、ls(1)andid(1)
等のプログラムがユーザーやグループの名前を得ために C
標準ライブラリー経由で頻用する柔軟なネームサービスメカニズムを提供します。
これらの PAM と NSS システムは一貫した設定が必要です。
PAM と NSS システムに関する注目のパッケージは次です。
表4.5 特記すべき PAM と NSS システムのリスト
| パッケージ | ポプコン | サイズ | 説明 |
|---|---|---|---|
libpam-modules
|
V:889, I:999 | 984 | 差し替え可能な認証モジュール (基本サービス) |
libpam-ldap
|
V:0, I:6 | 249 | LDAP インターフェースを可能にする差し替え可能な認証モジュール |
libpam-cracklib
|
V:0, I:8 | 117 | cracklib のサポートを可能にする差し替え可能な認証モジュール |
libpam-systemd
|
V:571, I:936 | 627 | logind のために登録ユーザーセッションを登録するプラガブルオーセンティケーション (PAM) |
libpam-doc
|
I:0 | 152 | 差し替え可能な認証モジュール (html と text の文書) |
libc6
|
V:917, I:999 | 12988 | GNU C ライブラリー: "ネームサービススイッチ" も提供する共有ライブラリー |
glibc-doc
|
I:8 | 3503 | GNU C ライブラリー: マンページ |
glibc-doc-reference
|
I:4 | 13841 | GNU C ライブラリー: info と pdf と html フォーマットでのリファレンスマニュアル (non-free) |
libnss-mdns
|
I:510 | 141 | マルチキャスト DNS を使った名前解決のための NSS モジュール |
libnss-ldap
|
I:5 | 265 | LDAP をネームサービスとして使う NSS モジュール |
libnss-ldapd
|
I:15 | 129 | LDAP をネームサービスとして使う NSS モジュール (libnss-ldap の新たなフォーク) |
libpam-doc 中の "The Linux-PAM System Administrators'
Guide" は PAM 設定を学ぶ上で必須です。
glibc-doc-reference の中の "System Databases and Name
Service Switch" セクションは NSS 設定を学ぶ上で必須です。
|
注記 |
|---|---|
|
より大規模かつ最新のリストは " |
|
注記 |
|---|---|
|
PAM は個別プログラムに関する環境変数をシステム全体のデフォールト値に初期化する最も基本的な手段です。 |
systemd の下では、logind のために systemd
のコントロールグループ階層中にユーザーセッションを登録することでユーザーのログインを管理すべくlibpam-systemd
パッケージがインストールされている。systemd-logind(8) や
logind.conf(5) や pam_systemd(8)
を参照下さい。
PAM と NSS がアクセスする注目すべき設定ファイルを次に記します。
表4.6 PAM NSS によりアクセスされる設定ファイルのリスト
| 設定ファイル | 機能 |
|---|---|
/etc/pam.d/プログラム名 |
"program_name" に関する PAM 設定の設定;
pam(7) と pam.d(5) 参照下さい |
/etc/nsswitch.conf |
各サービスに関するエントリーによる NSS 設定の設定; nsswitch.conf(5) 参照下さい |
/etc/nologin |
ユーザーのログイン制限のために pam_nologin(8) モジュールがアクセス |
/etc/securetty |
pam_securetty(8) モジュールにより root アクセスに使う tty を制限 |
/etc/security/access.conf |
pam_access(8) モジュールによりアクセス制限を設定 |
/etc/security/group.conf |
pam_group(8) モジュールによりグループに基づく制約を設定 |
/etc/security/pam_env.conf |
pam_env(8) モジュールにより環境変数を設定 |
/etc/environment |
"readenv=1" 引数を付きの pam_env(8)
モジュールによって追加での環境変数を設定 |
/etc/default/locale |
"readenv=1envfile=/etc/default/locale" 引数を付きの
pam_env(8) モジュールによって追加でロケールを設定します (Debian) |
/etc/security/limits.conf |
pam_linits(8) モジュールによってリソース制限 (ulimit, core, …) を設定 |
/etc/security/time.conf |
pam_time(8) モジュールによって時間制限を設定 |
/etc/systemd/logind.conf |
systemd ログイン管理設定の設定(logind.conf(5) と
systemd-logind.service(8) を参照) |
パスワード選択の制限は pam_unix(8) と
pam_cracklib(8) モジュールで実装されています。それらは引数を使って設定します。
|
ヒント |
|---|---|
|
PAM モジュールはファイル名のサフィクスとして " |
集中化された軽量ディレクトリーアクセスプロトコル (LDAP) を採用することで多くのネットワーク上の Unix 的や非 Unix 的システムを運営する、現代的な集中システム管理が実現できます。軽量ディレクトリーアクセスプロトコルのオープンソース実装は OpenLDAP ソフトウェアーです。
LDAP サーバーは、libpam-ldap と libnss-ldap
パッケージで提供される PAM と NSS を使うことで Debian システムにアカウント情報を提供します。この実現ためにはいくつかの設定が必要です
(著者は本設定を使っていないため、以下の情報は完全に二次情報です。ご理解の上お読み下さい。)。
スタンドアローンの LDAP デーモンである slapd(8) 等のプログラムを実行することで集中化された
LDAP サーバーを設置します。
デフォールトの "pam_unix.so" に代えて
"pam_ldap.so" を使うには "/etc/pam.d/"
ディレクトリー中の PAM 設定ファイルを変更します。
Debian では、"/etc/pam_ldap.conf"
をlibpam-ldap
の設定ファイル、"/etc/pam_ldap.secret" を root
のパスワードを保存するファイルとして使っています。
デフォールト ("compat" または "file") に代えて
"ldap" を使うには "/etc/nsswitch.conf"
ファイル中の NSS 設定を変更します。
Debian では、"/etc/libnss-ldap.conf"
をlibnss-ldap の設定ファイルとして使っています。
パスワードのセキュリティー確保のために libpam-ldap が SSL (もしくは TLS) 接続を使うよう設定しなければいけません。
LDAP のネットワークオーバーヘッドのコストは掛かりますが、データの整合性確保のために libnss-ldap
が SSL (もしくは TLS) 接続を使うように設定できます。
LDAP のネットワークトラフィックを減少させるために LDAP サーチ結果を一時保持するための nscd(8)
をローカルで走らせるべきです。
libpam-doc パッケージで提供される
pam_ldap.conf(5) や
"/usr/share/doc/libpam-doc/html/" や
glibc-doc パッケージで提供される "info libc
'NameServiceSwitch'" といった文書を参照下さい。
同様に、これに代わる集中化されたシステムは他の方法を使っても設定できます。
Windows システムとのユーザーとグループの統合
winbind と libpam_winbind パッケージを使って
Windows ドメインサービスにアクセスします。
winbind(8) と SAMBA による MS Windows Networks
への統合 を参照下さい。
旧来の Unix 的なシステムとのユーザーとグループの統合
nis パッケージにより NIS (当初
YP と呼ばれた) または NIS+ にアクセス
これは Richard M. Stallman が書いた昔の "info su"
の最後に書かれていた有名な文言です。ご心配は無用です。現在 Debian にある su は PAM
を使っているので "/etc/pam.d/su" の中の
"pam_wheel.so" の行をエネーブルすることで su を使えるのを
root グループに限定できます。
libpam-cracklib パッケージをインストールすると、より厳格なパスワード規則を強制できます。
自動的に libpam-gnome-keyring をインストールする典型的な GNOME
システム上では、"/etc/pam.d/common-password" は以下です:
# here are the per-package modules (the "Primary" block) password requisite pam_cracklib.so retry=3 minlen=8 difok=3 password [success=1 default=ignore] pam_unix.so obscure use_authtok try_first_pass yescrypt # here's the fallback if no module succeeds password requisite pam_deny.so # prime the stack with a positive return value if there isn't one already; # this avoids us returning an error just because nothing sets a success code # since the modules above will each just jump around password required pam_permit.so # and here are more per-package modules (the "Additional" block) password optional pam_gnome_keyring.so # end of pam-auth-update config
|
注記 |
|---|---|
|
ここに書かれている情報はあなたのセキュリティーのニーズに充分ではないかもしれませんが、良いスタートです。 |
多くのトランスポーテーションレイヤーサービスはパスワード認証も含めて暗号化せずにメッセージをプレーンテキストで通信します。途中で傍受されかねないインターネットの荒野を経由して暗号化せずパスワードを送ることは非常によくない考えです。これらに関しては、"トランスポーテーションレイヤーセキュリティー"(TLS) もしくはその前身の "セキュアーソケットレイヤー" (SSL) で暗号化することでパスワードを含むすべての通信をセキュアーにしてサービスができます。
表4.7 インセキュアーとセキュアーのサービスとポートのリスト
| インセキュアーなサービス名 | ポート | セキュアーなサービス名 | ポート |
|---|---|---|---|
| www (http) | 80 | https | 443 |
| smtp (mail) | 25 | ssmtp (smtps) | 465 |
| ftp-data | 20 | ftps-data | 989 |
| ftp | 21 | ftps | 990 |
| telnet | 23 | telnets | 992 |
| imap2 | 143 | imaps | 993 |
| pop3 | 110 | pop3s | 995 |
| ldap | 389 | ldaps | 636 |
暗号化には CPU タイムがかかります。CPU に友好的な代替方法として、POP には "パスワードを認証されたポストオフィスプロトコル "(APOP) や SMTP や IMAP には "チャレンジレスポンス認証メカニズム MD5" (CRAM-MD5) といったセキュアーな認証プロトコルでパスワードのみを保護しつつ通信はプレーンテキストですることもできます。(最近メールクライアントからメールサーバーにインターネット経由でメールメッセージを送る際には、CRAM-MD5 で認証をしたのちネットワークプロバイダーによるポート25 ブロッキングを避けて従来の SMTP ポート25 の代わりにメッセージ サブミッションポート587 を使うことがよく行われます。)
セキュアーシェル (SSH)
プログラムはセキュアーな認証とともにインセキュアーなネットワークを通過したお互いに信頼し合っていないホスト間のセキュアーで暗号化された通信を可能にします。OpenSSH クライアント ssh(1) と OpenSSH デーモン sshd(8)
から成り立っています。SSH はポートフォーワーディング機能を使い POP や X
のようなインセキュアープロトコルの通信をインターネット経由でトンネルするのに使えます。
クライアントは、ホストベースド認証、公開鍵認証、チャレンジレスポンス認証、パスワード認証を使って認証をとろうとします。公開鍵認証を利用すると、リモートからのパスワード無しログインができるようになります。「リーモートアクセスサーバーとユーティリティー (SSH)」を参照下さい。
たとえ、セキュアーシェル (SSH) やポイントツーポイントトンネリングプロトコル (PPTP) サーバーのようなセキュアーサービスを走らせる場合でも、ブルートフォースのパスワード推測等による侵入の可能性は残っています。以下のようなセキュリティーのためのツールとともに、ファイアーウォールポリシー (「Netfilter インフラ」を参照下さい) を使うのはセキュリティー状況を向上させることが期待できます。
表4.8 追加セキュリティー策を提供するツールのリスト
| パッケージ | ポプコン | サイズ | 説明 |
|---|---|---|---|
knockd
|
V:0, I:2 | 110 | 小さなポートノックのデーモン knockd(1) とクライアント
konck(1) |
fail2ban
|
V:98, I:111 | 2126 | 複数回の認証エラーを発生させる IP を使用禁止にします |
libpam-shield
|
V:0, I:0 | 115 | パスワード推測によるリモートからの攻撃者を締め出す |
あなたの機器に第三者が root 権限を持ってアクセスするのを阻止するには、以下のアクションが必要です。
ハードディスクへの物理的アクセスを阻止
UEFI/BIOS をロックして、リムーバブルメディアからのブートを阻止
GRUB のインタラクティブセッションのパスワードを設定
GRUB のメニュー項目編集に施錠
ハードディスクへの物理的アクセスがあれば、パスワードをリセットすることは以下の手順を使うと比較的簡単です。
ハードディスクを CD からブート可能な UEFI/BIOS のついた PC に移動します。
レスキューメディア (Debian ブートディスク、Knoppix CD、GRUB CD、…) でシステムをブートします。
ルートパーティションを読出し / 書込みアクセスでマウントします。
ルートパーティションの "/etc/passwd" を編集し、root
アカウントの2番目の項目を空にします。
grub-rescue-pc のブート時に GRUB のメニュー項目を編集可能 (「2段目: ブートローダー」を参照下さい) なら、以下の手順を使えてさらに簡単です。
カーネルパラメーターを "root=/dev/hda6 rw init=/bin/sh"
のような感じに変更してシステムをブートします。
"/etc/passwd" を編集し、root
アカウントの2番目の項目を空にします。
システムをリブートします。
これで、システムの root シェルにパスワード無しに入れるようになりました。
|
注記 |
|---|---|
|
root
シェルにアクセスさえできれば、システム上の全てにアクセスできシステム上のどのパスワードでもリセットできます。さらに。 |
この様な懸念を回避できる唯一の合理的なソフトウェアー的解決法は、dm-crypt と
initramfs (「データー暗号化ティップ」 参照下さい)
をつかう、ソフトウェアー暗号化されたルートパーティション (もしくは "/etc" パーティション)
を使うことです。でも、パスワードがシステムのブート毎に必要になってしまいます。
パスワードによる認証システムやファイルパーミッション以外のシステムへのアクセスコントロールがあります。
|
注記 |
|---|---|
|
カーネルのセキュアーアテンションキー (SAK) 機能の制限は「Alt-SysRq キー」を参照下さい。 |
ACL は、「ファイルシステムのパーミッション」 で説明された通常のパーミッションの上位集合です。
現代的なデスクトップ環境では ACL が作動していることに出くわします。フォーマットされた USB ストレージデバイスが例えば
"/media/penguin/USBSTICK" として自動マウントされた場合、通常ユーザーの
penguin は以下を実行できます:
$ cd /media/penguin $ ls -la total 16 drwxr-x---+ 1 root root 16 Jan 17 22:55 . drwxr-xr-x 1 root root 28 Sep 17 19:03 .. drwxr-xr-x 1 penguin penguin 18 Jan 6 07:05 USBSTICK
11 列目にある "+" は ACL 作動を表示しています。ACL 無しだと、通常ユーザーの
penguin は、penguin が
root グループに属さないためこのようにリストできません。ACL は以下のようにして確認できます:
$ getfacl . # file: . # owner: root # group: root user::rwx user:penguin:r-x group::--- mask::r-x other::---
ここで:
"user::rwx" や "group::---" や
"other::---" は、通常の所有者や、グループや、第三者のパーミッションに対応します。
"user:penguin:r-x" という ACL は通常ユーザーの
penguin が "r-x" パーミッションを保有することを可能にします。
これにより、"ls -la" でディレクトリー内容をリストできるようになります。
"mask::r-x" という ACL はパーミッションの上限を設定します。
詳細は "POSIX Access Control
Lists on Linux" や acl(5) や
getfacl(1) や setfacl(1) を参照下さい。
sudo はシステム管理者がユーザーに制限付きの root 権限を与え、その root
活動を記録するように設計されたプログラムです。sudo
は通常のユーザーのパスワードだけが必要です。sudo
パッケージをインストールし、"/etc/sudoers"
の中のオプションを設定することによりアクティベートして下さい。"/usr/share/doc/sudo/examples/sudoers"
や 「sudo の設定」 の設定例を参照下さい。
単一ユーザーシステムにおける私の sudo の使い方 (「sudo の設定」を参照下さい)
は自分自身の失敗からの防衛を目指しています。sudo を使うことは、常に root
アカウントからシステムを使うよりは良い方法だと個人的には考えます。例えば、次は
"some_file" の所有者を
"my_name" に変更します。
$ sudo chown my_name some_file
root のパスワード (自分でシステムインストールをした Debian ユーザーなら当然知っています)
を知っていれば、どのユーザーアカウントからいかなるコマンドも "su -c" とすれば root
もとで実行できます。
PolicyKit は Unix系オペレーティングシステムにおけるシステム全体の特権を制御するオペレーティングシステム構成要素です。
新しいGUIアプリケーションは、特権プロセスとして実行するように設計されていません。それらは、PolicyKitを経由し管理操作を実行する特権プロセスに話しかけます。
PolicyKitは、このような操作をDebianシステム上のsudoグループ所属のユーザーアカウントに限定します。
polkit(8)を参照下さい。
システムのセキュリティーのためにできるだけ多くのサーバープログラムを無効とするのは良い考えです。このことはネットワークサーバーの場合は決定的です。直接デーモンとしてであれスーパーサーバープログラム経由であれアクティベートされている使っていないサーバーがあることはセキュリティーリスクと考えられます。
sshd(8) 等の多くのプログラムが PAM
を使ったアクセスコントロールを使っています。サーバーサービスへのアクセスを制限するには多くの方法があります。
設定ファイル: "/etc/default/プログラム名"
デーモンに関する systemd サービス unit 設定
スーパーサーバーに関する
"/etc/inetd.conf"
TCP ラッパーに関する
"/etc/hosts.deny" と
"/etc/hosts.allow"、tcpd(8)
Sun RPC に関する
"/etc/rpc.conf"
atd(8) に関する "/etc/at.allow" と
"/etc/at.deny"
atd(8) に関する "/etc/at.allow" と
"/etc/at.deny"
netfilter インフラのネットワークファイアーウォール
「システム管理」 と「PAM と NSS によってアクセスされる設定ファイル」と「Netfilter インフラ」 を参照下さい。
|
ヒント |
|---|---|
|
もし現代的な Debian システムでリモートアクセスで問題に会った場合には、" |
Linux カーネルは進化していて、伝統的な UNIX 実装には見当たらないセキュリティー機能をサポートします。
Linux は、伝統的な UNIX アトリビュートを拡張する拡張アトリビュートをサポートします
(xattr(7) を参照下さい)。
Linux は、伝統的にスーパーユーザーに紐付けられた特権を capabilities(7)
として知られた、独立に有効化や無効化できる、別個の単位に分割します。
Linux セキュリティーモジュール (LSM) フレームワークは、新規のカーネル拡張により接続される各種セキュリティーチェックのためのメカニズムを提供します。例えば:
このような拡張は特権モデルを通常の Unix ライクのセキュリティー モデル ポリシーより厳しく引き締められるので、ルートの力も制約されるかもしれません。kernel.org にある Linux セキュリティー モデル (LSM) フレームワーク文書を読むことをおすすめします。
Linux namespaces は、namespace
内のプロセスから見たらプロセスがグローバルリソースの中でそれ自身のインスタンスがあるようにグローバルステムリソースを抽象化し包み込んでいます。グローバルリソースの変更は
namespace のメンバーである他のプロセスからは見えますが、それ以外のプロセスからは見えません。カーネルバージョン 5.6 以降、8 種の
namespace があります(namespaces(7) と
unshare(1) と nsenter(1) を参照下さい)。
Debian 11 Bullseye (2021年) の時点では、Debian は統一 cgroup ヒエラルキー (cgroups-v2と呼ばれています)。
プロセスを隔離しリソースコントロールを可能にする cgroups を使う namespaces の使用例は以下です:
Systemd。 「Systemd init」を参照下さい。
Docker や LXC 等のLinux コンテナ. 「仮想化システム」を参照下さい。
このような機能は「普通の Unix 認証」では実現できません。このような高度のトピックスは当該入門書のほぼ対象外です。