目次
人(またはプログラム)がシステムへのアクセスの要求をした際に、認証はその正体が信頼できるものだと確認します。
![]() |
警告 |
|---|---|
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) に説明されているように、このファイルの ":"
で分離されたエントリーそれぞれは次の意味です。
"/etc/passwd"の2番目のエントリーは暗号化したパスワードのエントリーとして使われていました。"/etc/shadow"が導入された後は、このエントリーはパスワード規定エントリーとして使われています。
表4.2 "/etc/passwd"の2番目のエントリーの内容
| 内容 | 意味 |
|---|---|
| (空白) | パスワード無しアカウント |
| x |
暗号化したパスワードは"/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暗号化が使われていることを示します。"*"はログイン不可を示します。)
"/etc/group"のファイル内容は次です。
group1:x:20:user1,user2
shadow(5)で説明されているように、このファイルの":"で分離されたエントリーそれぞれは次の意味です。
![]() |
注記 |
|---|---|
" |
![]() |
注記 |
|---|---|
もし" |
![]() |
注記 |
|---|---|
|
アカウント情報管理のための重要コマンドを記します。
表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が提供するalioth機器と同様なPAMとNSSの設定をされたシステム上では、ローカルの" |
passwd(1)によるとシステムインストール時やpasswd(1)コマンドによってアカウント作成する際には、次に記すようなセットからなる6から8文字の良好なパスワードを選択するべきです。
![]() |
警告 |
|---|---|
想像できるような単語はパスワードに選択禁止。 |
ソルトを使って暗号化されたパスワードを生成する独立のツールがあります。
表4.4 パスワード生成ツールのリスト
| パッケージ | ポプコン | サイズ | コマンド | 機能 |
|---|---|---|---|---|
whois
*
|
V:10, I:88 | 372 |
mkpasswd
|
crypt(3)ライブラリーの充実しすぎたフロントエンド
|
openssl *
|
V:36, I:90 | 2352 |
openssl passwd
|
パスワードハッシュの計算(OpenSSL)。passwd(1ssl)
|
Debianシステムのような最新のUnix的システムはPAM(プラグ可能な認証モジュール: Pluggable Authentication Modules)とNSS(ネームサービススイッチ: Name Service Switch)メカニズムをローカルのシステム管理者がそのシステム管理用に提供します。それらの役割をまとめると次の様になります。
ls(1)andid(1)等のプログラムがユーザーやグループの名前を得ためにC標準ライブラリー経由で頻用する柔軟なネームサービスメカニズムを提供します。
これらのPAMとNSSシステムは一貫した設定が必要です。
PAMとNSSシステムに関する注目のパッケージは次です。
表4.5 特記すべきPAMとNSSシステムのリスト
| パッケージ | ポプコン | サイズ | 説明 |
|---|---|---|---|
libpam-modules *
|
V:84, I:99 | 1080 | 差し替え可能な認証モジュール(基本サービス) |
libpam-ldap *
|
V:2, I:4 | 380 | LDAPインターフェースを可能にする差し替え可能な認証モジュール |
libpam-cracklib *
|
V:0.9, I:1.6 | 148 | cracklibのサポートを可能にする差し替え可能な認証モジュール |
libpam-doc *
|
I:0.7 | 1208 | 差し替え可能な認証モジュール(htmlとtextの文書) |
libc6
*
|
V:96, I:99 | 9932 | GNU Cライブラリー: "ネームサービススイッチ"も提供する共有ライブラリー |
glibc-doc *
|
I:3 | 1984 | GNU C ライブラリー: マンページ |
glibc-doc-reference *
|
I:1.5 | 12016 | GNU C ライブラリー: infoとpdfとhtmlフォーマットでのリファレンスマニュアル(non-free) |
libnss-mdns *
|
I:52 | 116 | マルチキャストDNSを使った名前解決のためのNSSモジュール |
libnss-ldap *
|
I:4 | 312 | LDAPをネームサービスとして使うNSSモジュール |
libnss-ldapd *
|
V:0.11, I:0.3 | 140 |
LDAPをネームサービスとして使うNSSモジュール(libnss-ldapの新たなフォーク)
|
libpam-doc中の"The Linux-PAM System Administrators'
Guide"はPAM設定を学ぶ上で必須です。
glibc-doc-referenceの中の"System Databases and Name Service
Switch"セクションはNSS設定を学ぶ上で必須です。
![]() |
注記 |
|---|---|
より大規模かつ最新のリストは" |
![]() |
注記 |
|---|---|
PAMは個別プログラムに関する環境変数をシステム全体のデフォールト値に初期化する最も基本的な手段です。 |
PAM がアクセスする注目すべき設定ファイルを次に記します。
表4.6 PAMによりアクセスされる設定ファイルのリスト
| 設定ファイル | 機能 |
|---|---|
/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)モジュールによって時間制限を設定
|
パスワード選択の制限はpam_unix(8)とpam_cracklib(8)モジュールで実装されています。それらは引数を使って設定します。
![]() |
ティップ |
|---|---|
PAMモジュールはファイル名のサフィクスとして" |
集中化された軽量ディレクトリーアクセスプロトコル(LDAP)を採用することで多くのネットワーク上のUnix的や非Unix的システムを最新の集中システム管理が実現できます。軽量ディレクトリーアクセスプロトコルのオープンソース実装はOpenLDAPソフトウエアーです。
LDAPサーバーは、libpam-ldapとlibnss-ldapパッケージで提供されるPAMとNSSを使うことでDebianシステムにアカウント情報を提供します。この実現ためにはいくつかの設定が必要です(著者は本設定を使っていないため、次の情報は完全に二次情報です。ご理解の上お読み下さい。)。
slapd(8)等のプログラムを走らせることで集中化されたLDAPサーバーを設置します。
デフォールトの"pam_unix.so"に代えて"pam_ldap.so"を使うには"/etc/pam.d/"ディレクトリー中のPAM設定ファイルを変更します。
/etc/pam_ldap.conf"をlibpam-ldapの設定ファイル、"/etc/pam_ldap.secret"をrootのパスワードを保存するファイルとして使っています。
デフォールト("compat"または"file")に代えて"ldap"を使うには"/etc/nsswitch.conf"ファイル中のNSS設定を変更します。
/etc/libnss-ldap.conf"をlibnss-ldapの設定ファイルとして使っています。
libpam-ldapがSSL(もしくはTLS)接続を使うよう設定しなければいけません。
libnss-ldapがSSL(もしくはTLS)接続を使うように設定できます。
nscd(8)をローカルで走らせるべきです。
libpam-docパッケージで提供されるpam_ldap.conf(5)や"/usr/share/doc/libpam-doc/html/"やglibc-docパッケージで提供される"infolibc'NameServiceSwitch'"といった文書を参照下さい。
同様に、これに代わる集中化されたシステムは他の方法を使っても設定できます。
これはRichard M. Stallmanが書いた昔の"info
su"の最後に書かれていた有名な文言です。ご心配は無用です。現在DebianにあるsuはPAMを使っているので"/etc/pam.d/su"の中の"pam_wheel.so"の行をエネーブルすることでsuを使えるのをrootグループに限定できます。
libpam-cracklibパッケージをインストールすると、例えば"/etc/pam.d/common-password"に次のような行があれば、パスワード規則を強化できます。
lennyの場合:
password required pam_cracklib.so retry=3 minlen=9 difok=3 password required pam_unix.so use_authtok nullok md5
squeezeの場合:
password required pam_cracklib.so retry=3 minlen=9 difok=3 password [success=1 default=ignore] pam_unix.so use_authtok nullok md5 password requisite pam_deny.so password required pam_permit.so
![]() |
注記 |
|---|---|
カーネルのセキュアーアテンションキー(SAK)機能の制限は「Alt-SysRqキー」を参照下さい。 |
sudoはシステム管理者がユーザーに制限付きのroot権限を与え、そのroot活動を記録するように設計されたプログラムです。sudoはユーザーの通常パスワードだけが必要です。sudoパッケージをインストールし、"/etc/sudoers"の中のオプションを設定することによりアクティベートして下さい。"/usr/share/doc/sudo/examples/sudoersの設定例を参照下さい。
単一ユーザーシステムにおける私のsudoの使い方(see「sudoの設定」)は自分自身の失敗からの防衛を目指しています。sudoを使うことは、常にrootアカウントからシステムを使うよりは良い方法だと個人的には考えます。例えば、次は"<some_file>"の所有者を"<my_name>"に変更します。
$ sudo chown <my_name> <some_file>
rootのパスワード(自分でシステムインストールをしたDebianユーザーなら当然知っています)を知っていれば、どのユーザーアカウントからいかなるコマンドも"su
-c"とすればrootもとで実行できます。
セキュリティー強化したLinux(SELinux)は強制アクセス制御(MAC)ポリシーのある通常のUnix的な権限モデルより厳格な枠組みです。ある条件下ではrootの権限すら制限を受けます。
システムのセキュリティーのためにできるだけ多くのサーバープログラムを無効とするのは良い考えです。このことはネットワークサーバーの場合は決定的です。直接デーモンとしてであれスーパーサーバープログラム経由であれ有効にされている使っていないサーバーがあることはセキュリティーリスクと考えられます。
sshd(8)等の多くのプログラムがPAMを使ったアクセスコントロールを使っています。サーバーサービスへのアクセスを制限するには多くの方法があります。
/etc/default/<プログラム名>"
/etc/inetd.conf"
/etc/hosts.deny"と"/etc/hosts.allow"、tcpd(8)
/etc/rpc.conf"
atd(8)に関する"/etc/at.allow"と"/etc/at.deny"
atd(8)に関する"/etc/at.allow"と"/etc/at.deny"
「ランレベル管理例」と「各initスクリプトのデフォールトのパラメーター」と「PAMとNSSによってアクセスされる設定ファイル」と「ネットワークサービスの初期化」と「Netfilterインフラ」を参照下さい。
![]() |
ティップ |
|---|---|
もし現代的なDebianシステムでリモートアクセスで問題に会った場合には、" |
ここに書かれている情報はあなたのセキュリティーのニーズに充分ではないかもしれませんが、良いスタートです。
多くのトランスポーテーションレイヤーサービスはパスワード認証も含めて暗号化せずにメッセージをプレーンテキストで通信します。途中で傍受されかねないインターネットの荒野を経由して暗号化せずパスワードを送ることは非常によくない考えです。これらに関しては、"トランスポーテーションレイヤーセキュリティー"(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.14, I:0.4 | 164 |
小さなポートノックのデーモンknockd(1)とクライアントkonck
|
denyhosts *
|
V:1.8, I:2 | 432 | sshからの侵入者をシステム管理者が排除することを助けるユーティリティー |
fail2ban *
|
V:3, I:4 | 660 | 複数回の認証エラーを発生させるIPを使用禁止にします |
libpam-shield *
|
V:0.01, I:0.06 | 104 | パスワード推測によるリモートからの攻撃者を締め出す |
あなたの機器に他人がroot権限を持ってアクセスするのを阻止するには、次のアクションが必要です。
ハードディスクへの物理的アクセスがあれば、パスワードをリセットすることは次の手順を使うと比較的簡単です。
/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"
パーティション)を使うことです。でも、パスワードがシステム起動毎に必要になってしまいます。