目次
人(またはプログラム)がシステムへのアクセスの要求をした際に、認証はその正体が信頼できるものだと確認します。
![]() |
警告 |
|---|---|
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)で説明されているように、このファイルの":"で分離されたエントリーそれぞれは:
"/etc/gshadow"ファイルは"/etc/shadow"ファイルが"/etc/group"ファイルに対する機能と同様の機能がありますが、実際には使われていません。
![]() |
注意 |
|---|---|
もし" |
![]() |
注意 |
|---|---|
|
アカウント情報管理のための重要コマンド:
表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)コマンドによってアカウント作成する際に次に記すようなセットからなる6から8文字の良好なパスワードをpasswd(1)によると選択するべきです:
![]() |
警告 |
|---|---|
想像できるような単語はパスワードに選択禁止。 |
ソルトを使って暗号化されたパスワードを生成する独立のツールとして次があります:
表4.4 パスワード生成ツールのリスト。
| パッケージ | popcon | サイズ | コマンド | 機能 |
|---|---|---|---|---|
whois
|
V:11, I:89 | 344 |
mkpasswd
|
crypt(3)ライブラリーの充実しすぎたフロントエンド
|
openssl |
V:29, I:90 | 2360 |
openssl passwd
|
パスワードハッシュの計算(OpenSSL)。passwd(1ssl)
|
Debianシステムのような最新のUnix的システムはPAM(差し替え可能な認証モジュール:PluggableAuthenticationModules)とNSS(ネームサービススイッチ:NameServiceSwitch)メカニズムをローカルのシステム管理者がそのシステム管理用に提供します。それらの役割をまとめると次の様になります:
ls(1)andid(1)等のプログラムがユーザやグループの名前を得ためにC標準ライブラリー経由で頻用する柔軟なネームサービスメカニズムを提供します。
これらのPAMとNSSシステムは一貫した設定が必要です。
PAMとNSSシステムに関する注目のパッケージは:
表4.5 注目すべきPAMとNSSシステムのリスト。
| パッケージ | popcon | サイズ | 説明 |
|---|---|---|---|
libpam-modules |
V:82, I:99 | 972 | 差し替え可能な認証モジュール(基本サービス) |
libpam-ldap |
V:1.8, I:4 | 404 | LDAPインターフェースを可能にする差し替え可能な認証モジュール |
libpam-cracklib |
V:0.8, I:1.8 | 132 | cracklibのサポートを可能にする差し替え可能な認証モジュール |
libpam-doc |
I:0.8 | 1156 | 差し替え可能な認証モジュール(htmlとtextの文書) |
libc6
|
V:95, I:99 | 11496 | GNU Cライブラリー: "ネームサービススイッチ"も提供する共有ライブラリー |
glibc-doc |
I:4 | 1800 | GNU C ライブラリー: マンページ |
glibc-doc-reference |
I:1.5 | 12160 | GNU C ライブラリー: infoとpdfとhtmlフォーマットでのリファレンスマニュアル(non-free) |
libnss-mdns |
I:54 | 144 | マルチキャストDNSを使った名前解決のためのNSSモジュール |
libnss-ldap |
I:4 | 312 | LDAPをネームサービスとして使うNSSモジュール |
libnss-ldapd |
V:0.12, I:0.2 | 356 |
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コンフィギュレーションファイルを変更します。
compat"または"file")に代えて"ldap"を使うには"/etc/nsswitch.conf"ファイル中のNSS設定を変更します。
/etc/pam_ldap.conf"をlibpam-ldapの設定ファイル、"/etc/pam_ldap.secret"をrootのパスワードを保存するファイルとして使っています。
/etc/pam_ldap.conf"をlibpam-ldapの設定ファイル、"/etc/pam_ldap.secret"をrootのパスワードを保存するファイルとして使っています。
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の権限すら制限を受けます。
インターネットスーパーサーバーinetdは、"/etc/init.d/inetd"にシムリンクされた"/etc/rc2.d/S20inetd"(RUNLEVEL=2の場合)によってブート時に起動されます。基本的に、inetdは一つの実行デーモンによりいくつかの他のデーモンを起動できるようにすることで、システムのロードを下げます。
サービス要求が到達する度に、そのプロトコルとサービスが"/etc/protocols"と"/etc/services"というデータベースを照覧することで確認されます。さらにinetdは、"/etc/inetd.conf"の中にある通常のインターネットサービスか、"/etc/rpc.conf"の中にあるSun RPC準拠サービスを照覧します。
システムのセキュリティのために"/etc/inetd.conf"にある不使用のサービスは確実にディスエーブルしましょう。NFS他のRPCを使うプログラムためにはSun RPCサービスはアクティブにする必要があります。
時々、inetdが対象となるサーバーを直接起動せずに、対象となるサーバー名を"/etc/inetd.conf"中に引数とし記載したTCPデーモンラッパープログラムtcpd(8)を起動することがあります。この様な場合には、tcpdは要求を記録し"/etc/hosts.deny"や"/etc/hosts.allow"を用いた追加確認後で適切なサーバープログラムを起動します。
もし最近のDebianシステムでリモートアクセスで問題があった場合には、"/etc/hosts.deny"中に"ALL:PARANOID"という文言があるならコメントアウトしましょう。
詳しいことは、inetd(8)とinetd.conf(5)とprotocols(5)とservices(5)とtcpd(8)とhosts_access(5)とhosts_options(5)を参照下さい。
Sun
RPCに関してさらに詳しいことは、rpcinfo(8)とportmap(8)と"/usr/share/doc/portmap/portmapper.txt.gz"を参照下さい。
atd(8)とcron(8)に関しては、PAM以外のアクセスコントロールがあります。
ここに書かれている情報はあなたのセキュリティのニーズに充分ではないかもしれませんが、良いスタートです。
多くのトランスポーテーションレイヤーサービスはパスワード認証も含めて暗号化せずにメッセージを通信します。途中で傍受されかねないインターネットの荒野を経由して暗号化せずパスワードを送ることは非常によくない考えです。これらに関しては、"トランスポーテーションレイヤーセキュリティ"(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のようなインセキュアプロトコルの通信をインターネット経由でトンネルするのに使えます。
クライアントは、ホストベースド認証、公開鍵認証、チャレンジレスポンス認証、パスワード認証を使って認証をとろうとします。公開鍵認証を利用すると、リモートからのパスワード無しログインができるようになります。「The remote access server and utility (SSH)」参照下さい。
たとえ、セキュアシェル (SSH)やポイントツーポイントトンネリングプロトコル(PPTP)サーバーのようなセキュアサービスを走らせる場合でも、ブルートフォースのパスワード推測等による侵入の可能性は残っています。次のようなセキュリティのためのツールとともに、ファイアーウォールポリシー(「Netfilter」参照)を使うのはセキュリティ状況を向上させ得る。
表4.8 セキュリティ強化策のためのツール表
| パッケージ | popcon | サイズ | 説明 |
|---|---|---|---|
knockd |
V:0.14, I:0.3 | 164 |
小さなポートノックのデーモンknocked(1)とクライアントkonck
|
denyhosts |
V:1.5, I:1.9 | 432 | sshからの侵入者をシステム管理者が排除することを助けるユーティリティ |
fail2ban |
V:3, I:3 | 616 | 複数回の認証エラーを発生させるIPを使用禁止とする |
libpam-shield |
V:0.01, I:0.05 | 172 | パスワード推測によるリモートからの攻撃者を締め出す |
あなたの機器に他人が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(「Data encryption tips」参照)をつかう、ソフトウエア暗号化されたrootパーティション(もしくは"/etc"
パーティション)を使うことです。でも、パスワードがシステム起動毎に必要になってしまいます。