システム奮闘記:その47

LinuxのPAM認証の設定入門



Tweet
(2006年3月13日に掲載)

PAMを勉強するキッカケ

今まで「PAM」という文字は、sambaの話などでも、見かけたのだが、 何のプログラムか、わからなかったため うちには関係ないもーん (^^) と思って、PAMについて何も調べる事なく、2006年を迎えたのだった。 さて2006年1月のある日、2002年1月号の「日経Linux」を取り出した。 特に、理由はなかったのだが、ふと取り出して、パラパラとめくったのだ。 2002年の時点では「情報収集」と称して買ったが、内容が理解できずに 「積ん読」になっていたのだ (^^;; さて、購入して4年を経て、本に書かれている内容が読めるだけの力が ついたので、読んでいくと、セキュリティーの所に「PAMの設定」があった。 記事の中身を読むと、次の文字が載っていた。 アプリケーションごとの認証方式の一括管理 つまり図にすると、次のようになる。
PAMによるアプリケーションごとの認証方式の一括管理
ユーザー認証を行う方式は色々あるのだが、PAMが一括管理しているお陰で
認証方式の変更があっても、個々のアプリケーションの再コンパイルをせずに
PAMの設定だけ変更すれば良いという形をとっている。

  この時、私は「これは近いうちにネタに使える」と思ったが、いつもの如く
お得意の「忍法・先送りの術」をした。すぐに調べる必要がないからだった。

  だが、しばらくしてPAMを知らねばならない事態になった。
  それは・・・

  別のネタを書いていたら、PAMの壁にブチ当たったのらー (--;;

  ftpサーバー構築の話を書いていたら、PAM認証の話が出てきたのだ。
  RPMを使ってインストールする場合は、自動的に設定してくれるのだが、
ソースコンパイルの場合、自分で設定しないといけない。
  認証が必要なプログラムだと、避けては通れない問題なのだ (--;;


  だが、困った。
  書店に行ってもPAMについて詳しく書かれた本が見つからない。
  手元にある日経Linux(2002年1月号)と、ネットの情報を頼りに
調べていく事にした。

  さて、まずは日経Linuxの記事を頼りに進めて行く。
  RedHatでは、/etc/pam.dにアプリケーションごとの設定ファイルがあるという。

設定ファイルについて
大抵のLinuxのディストリビューターでは、/etc/pam.dのディレクトリに
個々の認証が必要なアプリケーションの設定ファイルが入っている。

しかし、PlamoLinux4.0などでは、/etc/pam.conf ファイルの中に
認証に関する全てのアプリケーションの設定ファイルが入っている。

PAMをインストールした時に、どっちにするか選択ができるらしいですが、
ここでは、/etc/pam.dのディレクトリの場合について話をする事にします。

  早速、RedHat7.3のデフォルトの状態でのディレクトリーを見てみる事にした。

RedHat7.3の/etc/pam.dの様子
[suga@xxx pam.d]$ ls
authconfig      halt            printconf-gui                redhat-config-services  su
authconfig-gtk  hwbrowser       printconf-tui                redhat-config-time      sudo
bindconf        internet-druid  printtool                    redhat-config-users     system-auth
chfn            kbdrate         reboot                       rexec                   timetool
chsh            locale_config   redhat-config-bind           rhn_register            up2date
cups            login           redhat-config-date           rlogin                  up2date-config
dateconfig      neat            redhat-config-network        rsh                     up2date-nox
gdm             other           redhat-config-network-cmd    screen                  xdm
gdmconfig       passwd          redhat-config-network-druid  serviceconf             xscreensaver
gnome-lokkit    poweroff        redhat-config-printer-gui    smtp                    xserver
gnorpm-auth     ppp             redhat-config-printer-tui    sshd
[suga@xxx pam.d]$

  多くのアプリケーションの認証ファイルがあるなぁと関心してしまった。
  設定ファイル名は、それぞれのアプリケーションの名前に対応している。

  まずは、設定ファイルのうち、rloginというリモートログインの
ファイルの中身を見てみる事にした。

rloginファイルの中身
[suga@xxx pam.d]$ more  rlogin  
#%PAM-1.0
# For root login to succeed here with pam_securetty, "rlogin" must be
# listed in /etc/securetty.
auth       required     /lib/security/pam_nologin.so
auth       required     /lib/security/pam_securetty.so
auth       required     /lib/security/pam_env.so
auth       sufficient   /lib/security/pam_rhosts_auth.so
auth       required     /lib/security/pam_stack.so service=system-auth
account    required     /lib/security/pam_stack.so service=system-auth
password   required     /lib/security/pam_stack.so service=system-auth
session    required     /lib/security/pam_stack.so service=system-auth
[suga@xxx pam.d]$

  なんだか色々なライブラリーを取り込んでいる感じがする。

  日経Linuxには、ライブラリの話が書かれていないので、ネットの情報を見てみる。
  http://www.atmarkit.co.jp/flinux/samba/sambatips02/sambatips02.html

  するとライブラリを取り込む理由が書いてあった。

  各種プログラムの認証部分については、PAMのライブラリを利用しているのだ。
  図にすると次のようになる。

各種プログラムの認証部分は、PAMのライブラリを利用する様子
各種認証方式の関数が入ったライブラリをPAMが提供する形になっている。

  まだ、これだけでは見えてこない。
  そこで、次のサイトを見てみる事にした。
  http://www.linux.or.jp/JF/JFdocs/User-Authentication-HOWTO/pam.html

  書いてある内容を見て、なるほどと思った。
  図にすると次のようになる。

PAM一括認証
認証が必要なプログラムと、ユーザー情報を管理するファイルとの間に
PAM認証が入っている。

昔のLinuxは、個々のプログラム事に認証の部分を作って
ユーザー情報を管理するファイルを見にいっていたようだが、
個々のプログラム事に、認証プログラムを作成するのは大変なので
共通部品として、PAMが登場したようだ。

今では、ほとんどのLinuxのディストリビューターや、
いくつかの商用UNIXにも使われている。

  共通部品としての認証ライブラリを活用する事によって、
認証が必要なプログラムの開発者にとって、開発がしやすくなる。

  だが、/etc/pam.d/rloginファイルの中身を見た通り、
個々のプログラムごとに、どの認証のためのライブラリを使って、
どんな設定を行わないといけないのかを、ユーザー側は知る必要が出てくる。

  さて、実際に、どれくらいライブラリがあるのか、見てみる事にした。

/lib/security/ ディレクトリの中身 (RedHat7.3)
[suga@xxx security]$ ls
pam_access.so    pam_group.so      pam_mail.so         pam_shells.so       pam_unix_session.so
pam_chroot.so    pam_issue.so      pam_mkhomedir.so    pam_stack.so        pam_userdb.so
pam_console.so   pam_krb5.so       pam_motd.so         pam_stress.so       pam_warn.so
pam_cracklib.so  pam_krb5afs.so    pam_nologin.so      pam_tally.so        pam_wheel.so
pam_deny.so      pam_lastlog.so    pam_permit.so       pam_time.so         pam_xauth.so
pam_env.so       pam_ldap.so       pam_pwdb.so         pam_unix.so
pam_filter       pam_limits.so     pam_rhosts_auth.so  pam_unix_acct.so
pam_filter.so    pam_listfile.so   pam_rootok.so       pam_unix_auth.so
pam_ftp.so       pam_localuser.so  pam_securetty.so    pam_unix_passwd.so

  結構ある。
  これだけ覚えろという意味だろうか・・・ (^^;;

  さて、もう一度、rloginの場合の設定ファイルを見てみる。

rloginファイルの中身
[suga@xxx pam.d]$ more  rlogin  
#%PAM-1.0
# For root login to succeed here with pam_securetty, "rlogin" must be
# listed in /etc/securetty.
auth       required     /lib/security/pam_nologin.so
auth       required     /lib/security/pam_securetty.so
auth       required     /lib/security/pam_env.so
auth       sufficient   /lib/security/pam_rhosts_auth.so
auth       required     /lib/security/pam_stack.so service=system-auth
account    required     /lib/security/pam_stack.so service=system-auth
password   required     /lib/security/pam_stack.so service=system-auth
session    required     /lib/security/pam_stack.so service=system-auth
[suga@xxx pam.d]$

 authとか、accountなどの設定ファイルの書式や、ライブラリの種類を
覚えない事には、個々のプログラムごとの認証方法の設定ができない。

  だが困った事に・・・

  日本語の情報が少ないのらー!! (TT)

  渋々、英語のサイトを見るが、すぐに読む気をなくしてしまう。
  
有能な人の頭の中を見てみたい!
オープンソースの世界で活躍されておられる方々で、
コンピューターの知識はもちろんの事、英語力があり、
しかもビジネスなどにも詳しい方がおられる。
一体、それだけの知識などを、どうやって頭に入れるのか
非常に興味深い。

私の場合、金髪美人のおねーさんに恋をすれば、エロオヤジ丸出しで
「 I really love you , so please hold me tight !! 」と口にしながら、
英語の勉強をするかもしれないが、金髪女性には興味がないので
今の所、英語の勉強する気が起こらない (^^;;

PAMの設定方法について

だが、日本語のサイトを探してみるとあるものだ。 http://www.stackasterisk.jp/tech/systemManagement/pam01_01.jsp このサイトを見ながら、設定ファイルのお勉強をする事にした。 設定ファイルの書式は、タイプ、コントロールフラグ、 モジュールパス、引数の4種類の情報を入れるという。 具体的にrloginの設定ファイルを書式に表すと以下のようになる。
rloginファイルの中身
タイプ コントロール
フラグ
モジュールパス 引数
auth required /lib/security/pam_nologin.so
auth required /lib/security/pam_securetty.so
auth required /lib/security/pam_env.so
auth sufficient /lib/security/pam_rhosts_auth.so
auth required /lib/security/pam_stack.so service=system-auth
account required /lib/security/pam_stack.so service=system-auth
password required /lib/security/pam_stack.so service=system-auth
sessiond required /lib/security/pam_stack.so service=system-auth

  タイプには4種類ある。丁度、rloginの場合、4種類使われている。
  まずはタイプの「auth」の意味からだ。

  「auth」は、『認証を許可するかどうかの設定』という意味がある。
  そして、読み込むモジュールパス(ライブラリ)を記述する形になる。

  後からわかった話、PAMの設定で使われる「タイプ」という用語には
「何をさせるかを指定する」という意味で使われる。
  おそらく「何をさせるのかの分類」という意味合いから「タイプ」を
使っているのではと類推する。


  だが、この時は、Webサイトなどの説明を読んでも・・・

  よぅ、わからん (^^;;

  だったので、とりあえず、認証に関する「auth」に的を絞って
見ていく事にした。

  次に、モジュールパスの部分を見ると、ライブラリが置かれている
ディレクトリを指している。
  このライブラリこそ、認証関係に必要な関数などが入った物だ。
  共有ライブラリで、この形だと個々にプログラム内部に認証部分を
実装させる必要もなく、必要に応じて、共有ライブラリを利用できる。

  さて、ふと他のPAMの設定やライブラリの種類などを見ていた。

  すると、モジュールパスの部分で「/lib/security/pam_permit.so」は、
ノーパスワードで入る意味と書いていた。
  sufficientフラグを使うとサイトには書いている。

  早速、実験用のマシンで試してみる事にする。

loginファイルの中身を次のように書き加える
#%PAM-1.0
auth       sufficient /lib/security/pam_permit.so
auth       required /lib/security/pam_securetty.so
auth       required /lib/security/pam_stack.so service=system-auth
auth       required /lib/security/pam_nologin.so
account    required /lib/security/pam_stack.so service=system-auth
password   required /lib/security/pam_stack.so service=system-auth
session    required /lib/security/pam_stack.so service=system-auth
session    optional /lib/security/pam_console.so

  さて、他のマシンからtelnetを使ってみて、実際に、ノーパスワードで
ログインできるかどうか確かめてみる事にした。

他のマシンからtelnetを使ってログインしてみた
[suga@aaa suga]$ telnet 192.168.X.Y 
Trying 192.168.X.Y...
Connected to 192.168.X.Y.
Escape character is '^]'.
Red Hat Linux release 7.3 (Valhalla)
Kernel 2.4.18-3 on an i686
login: root
Last login: Tue Feb 28 16:37:03 from xxx
You have new mail.
[root@xxx root]#

  恐るべし!
  rootでログインの場合でも、ノーパスワードになってしまう。

  ところで、コントロールフラグの部分で「required」や「sufficient」がある。
  一体、どういう違いがあるのだろうか。

  ふと思った。
  「sufficient」には「十分な」という意味があるのだから、
認証OKするのに十分な条件を満たす場合に、使われるのではないか。
  この時点では、ぼんやりと浮かんだ思いつきにしか過ぎないが、
考え方としては、システム設定の問題ではなく、英語の問題だと思った。


  さて、てんでバラバラに調べていっても、話は発散するだけなので、
とりあえずは、loginの設定ファイルを見ていく事にする。

  そして、渋々、英語のサイトの内容も読む事にした。
  http://www.kernel.org/pub/linux/libs/pam/Linux-PAM-html/pam.html

/etc/pam.d/login ファイルの中身
#%PAM-1.0
auth       required /lib/security/pam_securetty.so
auth       required /lib/security/pam_stack.so service=system-auth
auth       required /lib/security/pam_nologin.so
account    required /lib/security/pam_stack.so service=system-auth
password   required /lib/security/pam_stack.so service=system-auth
session    required /lib/security/pam_stack.so service=system-auth
session    optional /lib/security/pam_console.so

  pam_securetty.soのモジュールが何を意味するのか調べてみた。

  すると、/etc/securetty ファイルのチェックを行うための
モジュールだと言う。

/etc/securetty ファイルの中身(RedHat7.3)
vc/1
vc/2
vc/3
vc/4
vc/5
vc/6
vc/7
vc/8
vc/9
vc/10
vc/11
tty1
tty2
tty3
tty4
tty5
tty6
tty7
tty8
tty9
tty10
tty11

  pam_securetty.soのモジュールは、上のファイルの中に記述されている
コンソールからの、rootでのログインを許可するという。

  このファイルを見て、ふと思い出す。
  シリアルポートからRC232Sケーブルを使って、Linuxにログインした時に
このファイルを触った事だ!
  (その時の話は「システム奮闘記:その41」をご覧ください)

  シリアルポートからrootでログインできる設定を行うために、
このファイルにシリアルのコンソールを追加したのだ。
  設定していた時点では、このファイルがrootでログインが可能な
コンソールを表したファイルだと知ったのだが、ようやく、理由がわかった。

  つまり、PAM設定で、root接続を許可するコンソールを記述したファイルとして
/etc/securettyファイルがあったのだ!

  思わぬ所で発見があった (^^)


  次に、pam_nologin.soモジュールを見てみる。
  このモジュールの役目は /etc/nologinファイルが存在していると、
root以外ではログインできない仕掛けになっているという。

  そういえば、/etc/nologinは、どこかで見た事があるファイルだ!

  古い記憶が蘇る。2000年にLinuxサーバーを導入した時だった。
  セキュリティー向上のため、root以外はログインできないようにするため
空ファイルとして、 /etc/nologinファイルを作成する話があった。

  「RedHat Linux6.1インターネットサーバー構築入門」という本だ。
  当時、設定したが、他の社内のマシンからtelnetが使えないため
不便さを感じて、すぐにやめたのを覚えている。
  5年以上の時を経て、ようやく、PAMの設定が影響していたのが、わかった。

  思わぬ所で2度目の発見があった (^^)

  ちなみに、/etc/nologinのファイルにメッセージを書き込むと
それがtelnetができなかった時に返すメッセージになる。

/etc/nologin ファイルの中身
[root@xxx root]# more /etc/nologin
ログインしちゃダメ!
[root@xxx root]

  実際に実験してみると次のように表示される。

実験結果
[suga@yyy suga]$ telnet 192.168.X.Y
Trying 192.168.X.Y...
Connected to 192.168.X.Y.
Escape character is '^]'.
Red Hat Linux release 7.3 (Valhalla)
Kernel 2.4.18-3 on an i686
login: suga
Password: 
ログインしちゃダメ!
Login incorrect

login: 

  /etc/nologinファイルの中身がメッセージなる事を初めて知った (^^)

  どうせなら、遊び心を持たせて、笑点・木久蔵(現・木久扇)さんのように

  いや〜ん。ばか〜ん。うふん。
  そこはログインじゃないのよ。あはん♪

  うーん、全然、色っぽくない  (--;;

キクちゃんこと、木久蔵(現・木久扇)さんは凄いのだ!
笑点では、お馬鹿キャラの役を演じる木久蔵(現・木久扇)さんだが、
計算づくで、あそこまでお馬鹿キャラを演じられるのは、
本当に頭が良い人でないとできない技だけに、凄いと思う。

「屋根なだけに、や〜ね」の定番のギャグをタイミング良く出して
笑いをとるなんて、お笑いを熟知した人でないとできない。
思わず「キクちゃん、最高」と思ったりする。

林家木久扇公式サイト(http://www.toyota-art.jp/)

一度、木久蔵ラーメンがどんな物か食べてみたいと思う今日この頃。

(2008/6/15に追加)

(1)  キクちゃんこと、木久蔵さんは2007年9月21日に木久扇に改名
(2)  木久蔵ラーメンを食べてみました。
     笑点ではネタとしてボロカスに言われていますが、実際に食べてみると
     薄味のラーメンで味は、それなりに美味しい物でした。

  閑話休題。
  さて、何気なく使っていた認証を使うプログラムは、PAMのお世話になっている。

  次に、rloginの認証について見てみる事にした。
  /etc/pam.d/rloginを見てみると、以下の設定になっている。

/etc/pam.d/rlogin ファイルの中身
#%PAM-1.0
# For root login to succeed here with pam_securetty, "rlogin" must be
# listed in /etc/securetty.
auth       required     /lib/security/pam_nologin.so
auth       required     /lib/security/pam_securetty.so
auth       required     /lib/security/pam_env.so
auth       sufficient   /lib/security/pam_rhosts_auth.so
auth       required     /lib/security/pam_stack.so service=system-auth
account    required     /lib/security/pam_stack.so service=system-auth
password   required     /lib/security/pam_stack.so service=system-auth
session    required     /lib/security/pam_stack.so service=system-auth
ピンクの部分を見れば、.rhostファイルの該当する場合なら
認証が無条件で認められる事が想像できる。

  同じように、リモートシェルの/etc/pam.d/rshファイルの中身も
上と似た設定になっている。


  今まで、バラバラに捉えていた認証の話が、実はPAMに集約されているのが
わかってきた。


さて、loginやsuファイルの中身を見ていると、以下のモジュールがある。 pam_stack.soモジュールだ。 これは大抵、引数としてservice=system-authをとる。 色々な認証設定ファイルの中で、このモジュールが見られる。 これは、system-authファイルの設定ファイルに従うという意味になる。 そこでsystem-authファイルの中身を見てみる。
/etc/pam.d/system-auth ファイルの中身
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth        required      /lib/security/pam_env.so
auth        sufficient    /lib/security/pam_unix.so likeauth nullok
auth        required      /lib/security/pam_deny.so

account     required      /lib/security/pam_unix.so

password    required      /lib/security/pam_cracklib.so retry=3 type=
password    sufficient    /lib/security/pam_unix.so nullok use_authtok md5 shadow
password    required      /lib/security/pam_deny.so

session     required      /lib/security/pam_limits.so
session     required      /lib/security/pam_unix.so

  ここでタイプの分類に目をつけてみる。

タイプの種類と説明
auth 認証を行うという
account ユーザー名とパスワードが利用可能になっているかの確認
authとセットで使われる
password パスワードの変更が可能という意味
session セッション開始と終了時にログをとる

  全体を網羅して見ていこうと思ったら、混乱してしまいそうなので、
まずは、system-authファイルの、authのタイプから追ってみる事にした。

/etc/pam.d/system-auth ファイルの中身 (auth部分だけ抜粋)
auth        required      /lib/security/pam_env.so
auth        sufficient    /lib/security/pam_unix.so likeauth nullok
auth        required      /lib/security/pam_deny.so
1番目にあるのは、pam_env.soモジュールを取り込んでいる。
これは認証時に、環境変数を取り込むという意味だ。

2番目にあるのは、UNIXの標準認証を行うという意味だ。
3番目にあるのは、認証拒否という意味だ。

  認証を行う部分になるのだが、コントロールフラグが2つある。
  requiredsufficientだ。

  ここまでで気づいた事は、sufficientの場合、認証OKという感じがする。

  そこでサイトにある説明をしっかり読むと納得できる答えがあった。
  まとめてみると、次のようになる。

コントロールフラグの説明
required
認証を行う時、ライブラリの方法の条件を満たしているか
チェックを行う。満たしていない場合は、認証失敗とする。

だが、認証失敗でも、この時点では終了しない。
その事については、後述しています。
sufficien
認証を行う時、ライブラリの方法の条件を満たしたら、
認証がOKという意味になる。
この部分で認証がOKになれば、後の部分は全て無視される。

ただし、このフラグが出てくる前の段階の「required」のチェックに
引っかかると、例え、「sufficient」の部分で条件を満たしても
認証は失敗に終わる。

  なるほどと思った。

  requiredの場合、チェックした結果、問題がなければ、次のステップへ
進むという意味になる。問題があれば、認証失敗となる。

  sufficientの場合、チェックした結果、条件を満たしているなら
認証がOKで、それ以降のステップは無視されるというわけだ。

  もう一度、system-authファイルのauthの部分を見てみる。

/etc/pam.d/system-auth ファイルの中身 (auth部分だけ抜粋)
auth        required      /lib/security/pam_env.so
auth        sufficient    /lib/security/pam_unix.so likeauth nullok
auth        required      /lib/security/pam_deny.so
1番目にあるのは、認証時に、環境変数を取り込むという意味だ。
認証の合否とは別なので、説明しずらい所・・・ (^^;;

2番目にあるのは、UNIXの標準認証を行うという意味だ。
/etc/passwdファイルと、/etc/shadowファイルを使う認証だ。
認証の条件を満たせば、認証OKで、この後のステップは無視される。

3番目にあるのは、認証拒否のモジュールを取り込む。
どんな場合でも、ここまで来たら、認証拒否という意味だ。
認証の合否とは別なので、説明しずらい部分だ・・・ (^^;;

  設定の部分を見てみると、話がすっきりとしない。
  requiredの部分に釈然としない物があるからだ。

  requiredの部分を見ていると、条件チェック以外に、何か意味がある。
  でないと、単に、条件を満たさなければ、認証拒否という説明だと
不十分になってしまう。

  そこで「設定の問題」ではなく「英語の問題」と考え、英和辞典を調べてみる。

動詞のrequireを英和辞典で調べると
requireの意味は、主に2種類あった。
1つ目は「を必要とする」と、2つ目は「要求する」という意味だ。

つまり、コントロールフラグの「required」の意味には
「〜の設定を必要とする(〜の設定がしたい)」という意味と、
「〜の条件が必要」という意味になる。

なので、言葉の問題として捉えると、すっきりするのだ

  言葉の問題と捉えると、sufficientの場合も調べてみる必要がある。

sufficientを英和辞典で調べると
sufficientには「・・・としては十分だ」という意味がある。

つまり設定では「〜の条件が満たせれば十分だ」
という意味を持たせている。

  やはり「言葉の問題」と捉えると、すっきりするのだ! (^^)


  ところで、他に、2つ、コントロールフラグがある。
  「requisite」と「optional」がある。

  「requisite」の役割は、「required」と、ほとんど同じだ。
  でも、違いはある。違いがないと、わざわざ別々に名前をつける事はないからだ。

  Webなどで調べた説明では「requisiteの場合、認証が失敗した時、
即座に拒否をするが、requiredは、その時点では拒否反応を示さない」
という内容なのだ。
  だが、これだけだと、わからない。

  何を意味しているのか、わからんのらー!!

  と叫んでみたが、叫ぶだけで終わってしまっては意味がないので、
具体的に、どんな現象が起こるのか実験をしてみる事にした。

  そこで、/etc/pam.d/login、/etc/pam.d/system-authの2つのファイルの中身を
authのタイプの所だけ「required」と「requisite」を置き換えてみた
  
/etc/pam.d/login ファイルの中身の書き換え
#%PAM-1.0
auth       requisite /lib/security/pam_securetty.so
auth       requisite /lib/security/pam_stack.so service=system-auth
auth       requisite /lib/security/pam_nologin.so
account    required /lib/security/pam_stack.so service=system-auth
password   required /lib/security/pam_stack.so service=system-auth
session    required /lib/security/pam_stack.so service=system-auth
session    optional /lib/security/pam_console.so
/etc/pam.d/system-auth ファイルの中身の書き換え
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth        requisite      /lib/security/pam_env.so
auth        sufficient    /lib/security/pam_unix.so likeauth nullok
auth        requisite     /lib/security/pam_deny.so

account     required      /lib/security/pam_unix.so

password    required      /lib/security/pam_cracklib.so retry=3 type=
password    sufficient    /lib/security/pam_unix.so nullok use_authtok md5 shadow
password    required      /lib/security/pam_deny.so

session     required      /lib/security/pam_limits.so
session     required      /lib/security/pam_unix.so

  そして、別のホストからrootでログインしてみる事にした。

別のホストからrootでログイン
[suga@yyy suga]$ telnet 192.168.X.Y
Trying 192.168.X.Y...
Connected to 192.168.X.Y.
Escape character is '^]'.
Red Hat Linux release 7.3 (Valhalla)
Kernel 2.4.18.3 on an i686
login: root
Login incorrect

login: 
パスワードの確認がなかった。
そこで比較のため、「requisite」に置き換える前の場合を
下に載せてみた。
別のホストからrootでログイン(置き換える前の場合)
[suga@yyy suga]$ telnet 192.168.X.Y
Trying 192.168.X.Y...
Connected to 192.168.X.Y.
Escape character is '^]'.
Red Hat Linux release 7.3 (Valhalla)
Kernel 2.4.18.3 on an i686
login: root
Password: 
Login incorrect

login:
パスワードの確認があった。

  requisiteの場合、認証拒否したモジュールの時点で、
認証が終了してしまう。
  つまり、telnetを行う際の認証の流れで見てみると、次のようになる。

telnetでの認証の流れ
(loginとsystem-authファイルの合成 & requisiteに置き換え版)
auth       requisite      /lib/security/pam_securetty.so
auth       requisite      /lib/security/pam_env.so
auth       sufficient     /lib/security/pam_unix.so likeauth nullok
auth       requisite      /lib/security/pam_deny.so
auth       requisite      /lib/security/pam_nologin.so
rootからのログインが許可されていないコンソールから、ログインがあったため
赤い部分のモジュールが認証拒否を行い、その時点で認証が終了した。
そのため、UNIXの標準認証であるpam_unix.soが動く事はないので、
パスワード認証の画面が出てこなかったのだ。

  上の流れでわかった事は、requisiteの場合、該当のモジュールで
認証が拒否されると、その時点で認証が終了してしまうため、
相手には、どの辺りで認証が拒否されたのか推測される恐れがある。
  そのためrequisiteを使うのは推奨されていないという。

  逆に、requiredを使うと、該当のモジュールで認証拒否だったとしても、
その時点では知らぬフリをして、その後の認証処理を進めて行くため、
どこで認証が拒否されたのかを、わからなくするする。


  ちなみに、requiredのお陰で働く機能があるのが、上のtelnetの
認証の流れでわかる。
  最後に「pam_nologin.so」のモジュールがある。これは既に説明した通り、
root以外のログインの場合認証を拒否する設定だ。
  一つ上の何でも認証を拒否するpam_deny.soモジュールがありながら、
「pam_nologin.so」のモジュールが動くのは、requiredのお陰で
認証拒否された場所があっても、その場では知らぬフリして、次の認証の
処理を行うため、「pam_nologin.so」のモジュールが動くからなのだ。


  つまり、requiredは、相手を撹乱させる戦法(?)なのだ!

  やはり実験をやってみて、自分の目で見ないと、わからないものだ (^^)

requisiteの意味を辞書で調べてみる
requisite」と「required」と言葉の意味に違いがあるかどうか、
興味があったので調べてみる事にした。

「requisite」には、「必要」という意味がある。
「required」と同じ意味になる。
一応、英英辞典でも調べてみたが、意味合いの違いはなさそうだ。

ここでは、フラグの働きが、ちょっとした役割の違いだけなので、深く考えず、
フラグの名前を日本語で例えると、同じ意味の「必要」と「不可欠」の
2種類の言葉を用意して、ちょっと違う2つの働きに対応させている。
つまり、ちょっと違う働きのフラグの名前に、同じ意味で、
発音の違う言葉を当てはめていると考えれば、わかりやすいと思う。

  さて、残り1つのコントロールフラグ「optional」がある。
  この意味は、ライブラリの動作の結果を表示させないという意味のようだ。

  うーん、よくわからん (--;;


さて、コントロールフラグの話は、これくらいにして、次に引数の話をします。 /etc/pam.d/system-auth ファイルの引数から見ていく事にした。
/etc/pam.d/system-auth ファイルの中身 (UNIXの認証部分だけ抜粋)

auth        sufficient    /lib/security/pam_unix.so likeauth nullok

引数は「likeauth」と「nullok」の2つある。

1つ目は、/etc/pam.d/system-authファイルを呼び出す際の
モジュール(pam_stack.so)が使っていた認証等の値を、
pam_unix.soでも使えるようにするための処置だ。

2つ目は、ノーパスワードを認めるという設定だ。

  うーん、1個、1個分解して見て行くと、わかりやすい。
  

  さて、引数は一旦、これくらいにして、残りのタイプを見ていく事にする。
  引続きsystem-authファイルの中身を見てみる。

/etc/pam.d/system-auth ファイルの中身 (authを除く)
account     required      /lib/security/pam_unix.so

password    required      /lib/security/pam_cracklib.so retry=3 type=
password    sufficient    /lib/security/pam_unix.so nullok use_authtok md5 shadow
password    required      /lib/security/pam_deny.so

session     required      /lib/security/pam_limits.so
session     required      /lib/security/pam_unix.so

  タイプの「account」を見てみる事にする。
  これはタイプ「auth」とセットになって動くもだという。
  パスワードの有効時間(期限付パスワードのチェック)や、認証時間などの
チェックに使われるようだ。


  タイプの「password」は、パスワードの設定や変更等の際に関わる部分だ。
  わかりやすく、/etc/pam.d/passwdファイルを見てみる事にした。

  だが、passwdファイルだけを見ても、「pam_stack.so service=system-auth」
だけなので、実際の動きを見るため、service=system-authファイルを
見てみる事にした。

/etc/pam.d/system-auth ファイルの中身(passwordのみ抜粋)
password    required      /lib/security/pam_cracklib.so retry=3 type=
password    sufficient    /lib/security/pam_unix.so nullok use_authtok md5 shadow
password    required      /lib/security/pam_deny.so

  まずは、pam_cracklib.soモジュールから見てみる。
  これはパスワードの中身のチェックで、総当たり攻撃を防ぐために
字数が短いパスワードや、簡単に類推できる地名や人名や、
辞書に載っている物に対して、「これはダメですよ」と警告するための物だ。
  さて、実際に、試してみる事にした。

パスワードの実験
[root@xxx root]# passwd suga
Changing password for user suga.
New password: mayumi
BAD PASSWORD: it is based on a dictionary word
Retype new password: 
passwd: all authentication tokens updated successfully.
[root@xxx root]# 
パスワードを「miyumi」にしてみた(実際は青の部分は表示されません)
すると、赤い部分の警告が出た。バレやすい悪いパスワードというわけだ。

でも、再入力の時に「mayumi」と打てば、認められてしまう。

しかし、覚えやすいパスワードという事で、私の愛する小野真弓の
「mayumi」が使えないのが残念だ (^^;;

  さて、引数の「retry」がある。
  これは、パスワード変更の時、入力と再入力がある。
両方で入力した物が一致しないと認められないのだ。
  人間の事だから打ち間違いはある。この「retry」は、
何回まで打ち間違える事ができるのかを意味する。
  上の場合だと「retry=3」なので、3回まで打ち間違えができる。
  試しに実験を行ってみた。

パスワードの実験
[root@xxx root]# passwd suga
Changing password for user suga.
New password: lovemayumi
Retype new password: mayumilove
Sorry, passwords do not match
New password: lovemayumi
Retype new password: mayumilove
Sorry, passwords do not match
New password: lovemayumi
Retype new password: mayumilove
Sorry, passwords do not match
passwd: Authentication information cannot be recovered
[root@xxx root]# 
パスワードの入力の時は「lovemayumi」で、再入力は「mayumilove」にした。
すると、パスワードが一致しないため、再度、入力を求めて来る。
(実際には、青い部分と赤い部分は表示されません)

設定通り、3回、打ち間違えを起こすと、ピンクの部分の表示が出てきて
パスワード変更が終わってしまう。

ここでは省略しますが、実際に「retry=1」にしたら、1回間違えると
パスワードの変更が終了します。

  ふと思った。もともと、認証は「仏の顔は3度まで」の言葉の如く、
3回までチャンスがあったように思える。
  これはモジュールの影響なのか、それとも他の設定の影響なのか
ふと疑問に思った。

  そこで本当に、「retry=3」の設定で3回チャンスがあるのか確かめるため、
実際に「retry=1」にしてみた。
  すると、1回しかチャンスがない事が確認できた。

パスワードの実験「retry=1」にした場合
[root@xxx root]# passwd suga
Changing password for user suga.
New password: lovemayumi
Retype new password: mayumilove
Sorry, passwords do not match
passwd: Authentication information cannot be recovered
[root@xxx root]# 
回間違えただけで、パスワードの変更のプログラムが終わってしまった。

(実際には、青い部分と赤い部分は表示されません)

  実際に触ってみて確認すると納得できるものだ (^^)


  さて、次のモジュール「pam_unix.so」に着目した。
  パスワード変更の時、UNIX標準認証の部分で何を行うかの条件設定だ。

  引数に「nullok」と「use_authtok」と「md5」と「shadow」がある。

  まずは「nullok」だが、これはヌルパスワードでもOKという事だ。
  つまり、ノーパスワード状態でもパスワードの変更が可能という意味だ。

  「use_authtok」だが、これがないと、ちょっと手間になる。
  「use_authtok」は、パスワードの変更で再入力が終わり、
入力と再入力が合致した時、パスワードの変更に素直に応じるという意味だ。

  もし、この引数がない場合だと、再入力の後、変更のための認証が
行われる。言葉で書くと、わかりずらいので、実験してみた。

パスワードの実験
引数「use_authtok」を削除した場合
[root@xxx root]# passwd suga
Changing password for user suga.
New password: lovemayumi
Retype new password: lovemayumi
Enter new UNIX password: lovemayumi
Retype new UNIX password: lovemayumi
passwd: all authentication tokens updated successfully.
[root@xxx root]#
パスワードの実験
引数「use_authtok」を残した場合
[root@xxx root]# passwd suga
Changing password for user suga.
New password: mayumilove
Retype new password: mayumilove
passwd: all authentication tokens updated successfully.
[root@xxx root]# 

  上のふたつを比較してわかる事は、引数「use_authtok」を削除した場合、
パスワードの変更の後、新しいパスワードでの認証を行わないと、
パスワードの変更ができない事だ。

  つまり、同じパスワードを2回の所を4回打たねばならないため、
手間になってしまう。
  この引数は、置いておいた方が手間にならずに済むし、
逆に、削除する場合は、どんな時なのか、よくわからない・・・

  さて、引数「md5」と「shadow」なのだが・・・

  どういう意味なのか、わからんのらー!!

  「md5」は、パスワードの保管をMD5のハッシュ関数で、不可逆の暗号化をして、
「shadow」は、シャドウパスワードを使う意味だと思われる。

  だが、「md5」を省いても、/etc/shadowの中身はテキストではなく、
暗号化された状態で保管されているし・・・。

  この際だから、常套手段を使って

  事務員なので、わかりませーん (^^)V

  で逃げる事を考えた。

  だが、ふと思った。
  「md5」の引数だが、もし、「md5」を省いた時と、暗号に違いがあるのか
確かめてみる事にした。

  もちろん、パスワードは私の大好きな小野真弓からとった「mayumi」だ。

/etc/shadowの暗号化されたパスワードの部分
引数「md5」を削除した場合
jEomhBZsxSACg
/etc/shadowの暗号化されたパスワードの部分
引数「md5」を残した場合
$1$kiKuwpDZ$mT878rFNIXDt677NgNcEf1

  長さも中身も、全く異なる暗号になっている。

  ここで仮説を立てる。
  UNIXのシャドーパスワードは、以前は、DESの暗号を使っていたが、
これだと危険なので、Linuxでは、MD5でも使えるようなった歴史がある。
  もし、引数「md5」を削除すると、暗号の方式が、DES方式になるのではと考えた。

  調べてみると、やはりそうだった。
  http://www.turbolinux.co.jp/support/document/knowledge/543.html

  こういう時、仮説を立証してくれる信頼できるサイトがあると助かる。
  もし、私の仮説が外れていても、責められるのは私だけでなく、
ターボリナックス社と一緒に心中(?)できるからだ (^^)


  さて、「shadow」の引数だが、説明ではパスワードの変更がある度に
/etc/shadowを更新するという意味なのだが、「shadow」の引数がなくても
更新されているようだ。
  一体、何の意味があるのか、不思議な所だ。

  正直に書いて、わかんなーい (^^)

  事務員だから、それで良いのだ (^^)V


さて、タイプの「session」の話が残っていた。 タイプの「session」は、セッション開始、もしくは終了の時の処理を 指定する時に使う。 まずは、loginファイルのタイプの「session」の部分を見てみる。
/etc/pam.d/login ファイルの中身 (sessionの部分を抜粋)
session    required /lib/security/pam_stack.so service=system-auth
session    optional /lib/security/pam_console.so

  これだけ見ると、やはりsystem-authファイルに投げている。
  そこで、system-authファイルを見てみる事にした。

/etc/pam.d/system-auth ファイルの中身(sessionの部分を抜粋)
session     required      /lib/security/pam_limits.so
session     required      /lib/security/pam_unix.so

  さて、pam_limits.soモジュールなのだが、ログインした時に
制限をかけるという意味だ。
  その制限は、/etc/security/limits.confに記述されている。
  デフォルトでは、ファイルは存在するのだが、コメントアウトされていて
全く記述されていない状態だ。

  どんな制限がかけられるのか、/etc/security/limits.confの説明を見てみた。

/etc/security/limits.conf ファイルの中身(RedHat7.3)
#
#Each line describes a limit for a user in the form:
#
#<domain>        <type>  <item>  <value>
#
#Where:
#<domain> can be:
#        - an user name
#        - a group name, with @group syntax
#        - the wildcard *, for default entry
#
#<type> can have the two values:
#        - "soft" for enforcing the soft limits
#        - "hard" for enforcing hard limits
#
#<item> can be one of the following:
#        - core - limits the core file size (KB)
#        - data - max data size (KB)
#        - fsize - maximum filesize (KB)
#        - memlock - max locked-in-memory address space (KB)
#        - nofile - max number of open files
#        - rss - max resident set size (KB)
#        - stack - max stack size (KB)
#        - cpu - max CPU time (MIN)
#        - nproc - max number of processes
#        - as - address space limit
#        - maxlogins - max number of logins for this user
#        - priority - the priority to run user process with
#        - locks - max number of file locks the user can hold
#
#<domain>      <type>  <item>         <value>
#
<domain> は、制限をかける、ユーザーやグループを記述する。
グループの場合は、グループ名の前に「@」を入れて、
ユーザー名と区別する必要がある。

<type> は、softとhardのどちらかを指定する。
softの場合は、ログイン後、一般ユーザーでも変更が可能。
hardの場合は、root以外は変更が不可能。

<item> は、何に対して制限をかけるかを指定する部分だ。
dataなら、最大データサイズ
nporcなら、最大プロセス数だ。

<value> は、制限した時の上限の値になる。

詳しくは以下のサイトをお薦めします。
http://www-06.ibm.com/jp/developerworks/linux/050513/j_l-seclnx3.html

  さて、ユーザーに制限をかけてみる事にした。
  プロセス数を最大で4つにしてみた。

/etc/security/limits.conf を以下のように設定した
#
#<domain>      <type>  <item>         <value>
#
suga            soft    nproc             4

  そして、他のマシンからログインして、実際にプロセス数が
制限されるかを確かめてみた。

実験結果
[suga@yyy suga]$ telnet 192.168.X.Y
Trying 192.168.X.Y...
Connected to 192.168.X.Y.
Escape character is '^]'.
Red Hat Linux release 7.3 (Valhalla)
Kernel 2.4.18.3 on an i686
login: suga
Password: 
Last login: Fri Mar 10 18:08:07 from yyy
You have mail.
[suga@xxx suga]$ ps 
  PID TTY          TIME CMD
 5594 pts/4    00:00:00 bash
 5629 pts/4    00:00:00 ps
[suga@xxx suga]$ sh
sh-2.05a$ sh
sh-2.05a$ sh
sh-2.05a$ sh
sh: fork: リソースが一時的に利用できません
sh-2.05a$

  確かに、プロセスに制限がかかっている事がわかる。

  だが、タイプをsoftで設定したため、ユーザー自身が最大の値を
変更する事が可能だ。
  さて、一体、どうやって変更するのだろうか。
  そこで調べて行くと、ulimitコマンドがあるのを知る。

  これは、ユーザーが使える資源の制限量を閲覧したり、資源の利用に
制限をかけるためのコマンドだという。

  詳しい使い方は以下のサイトにあります。
  http://www.express.nec.co.jp/linux/tech/knowledge/system/ulimit.html

  さて、実際に使ってみる。

ulimitコマンドを使ってみた (1)
[suga@xxx suga]$ ulimit -a
core file size        (blocks, -c) 0
data seg size         (kbytes, -d) unlimited
file size             (blocks, -f) unlimited
max locked memory     (kbytes, -l) unlimited
max memory size       (kbytes, -m) unlimited
open files                    (-n) 1024
pipe size          (512 bytes, -p) 8
stack size            (kbytes, -s) 8192
cpu time             (seconds, -t) unlimited
max user processes            (-u) 4
virtual memory        (kbytes, -v) unlimited
[suga@xxx suga]$ 

  実際に、最大プロセス数が4つに制限がかけられるのが見てわかる。
  さて、これを解除するには、以下のようにする。

ulimitコマンドを使ってみた (2)
[suga@xxx suga]$ ulimit -u 10
[suga@xxx suga]$ ulimit -a
core file size        (blocks, -c) 0
data seg size         (kbytes, -d) unlimited
file size             (blocks, -f) unlimited
max locked memory     (kbytes, -l) unlimited
max memory size       (kbytes, -m) unlimited
open files                    (-n) 1024
pipe size          (512 bytes, -p) 8
stack size            (kbytes, -s) 8192
cpu time             (seconds, -t) unlimited
max user processes            (-u) 10
virtual memory        (kbytes, -v) unlimited
[suga@xxx suga]$ 

  最大プロセス数が10個に変更されている。

  さて、root以外では変更できなくするには以下のようにすれば良い。

/etc/security/limits.conf を以下のように設定した
#
#<domain>      <type>  <item>         <value>
#
suga            hard    nproc             4


ulimitコマンドを使ってみた (3)
[suga@xxx suga]$ ulimit -a
core file size        (blocks, -c) 0
data seg size         (kbytes, -d) unlimited
file size             (blocks, -f) unlimited
max locked memory     (kbytes, -l) unlimited
max memory size       (kbytes, -m) unlimited
open files                    (-n) 1024
pipe size          (512 bytes, -p) 8
stack size            (kbytes, -s) 8192
cpu time             (seconds, -t) unlimited
max user processes            (-u) 4
virtual memory        (kbytes, -v) unlimited
[suga@xxx suga]$ ulimit -u 10
bash: ulimit: cannot modify max user processes limit: Operation not permitted
[suga@xxx suga]$

  エラーが出た。やはりroot以外でないと変更が無理なのだ。

  一個、一個、自分の目で確かめて行くと、よくわかる (^^)

  ulimitコマンドは、特定のユーザーが限られた資源を占有する事を防ぐため
制限をかけるコマンドだ。今日、初めて知った。
  ユーザーの制限を最初からかけるためのファイルとして、
/etc/security/limits.conf ファイルがある事も知った。


  さて、タイプ「session」の話に戻します。

/etc/pam.d/system-auth ファイルの中身(sessionの部分を抜粋)<
session     required      /lib/security/pam_limits.so
session     required      /lib/security/pam_unix.so

  pam_unix.soモジュールだが、この場合の役目は、接続の開始と終わりに
/var/spool/messagesファイルに、ログを残す事だ。

  このモジュールのお陰でログイン、ログオフする度にログが残るのだ。

  さて、実際にログが取られる様子を見てみる事にした。

他のマシンからログインした時
[suga@yyy suga]$ telnet 192.168.X.Y
Trying 192.168.X.Y...
Connected to 192.168.X.Y.
Escape character is '^]'.
Red Hat Linux release 7.3 (Valhalla)
Kernel 2.4.18.3 on an i686
login: suga
Password: 
Last login: Thu Mar  9 13:30:31 from yyy
You have mail.
[suga@xxx suga]$
ログインした時のログ /var/spool/messages の内容
Mar  9 13:30:45 xxx login(pam_unix)[3795]: session opened for user suga by (uid=0)
Mar  9 13:30:45 xxx  -- suga[3795]: LOGIN ON pts/4 BY suga FROM yyy

  しっかりとlogin(pam_unix)が記録されている。

  さて、ログアウトした場合を見てみる。

ログアウトした時
[suga@xxx suga]$ exit
Connection closed by foreign host.
[suga@yyy suga]$ 
ログアウトした時のログ /var/spool/messages の内容
Mar  9 13:31:32 xxx login(pam_unix)[3795]: session closed for user suga

  これも、しっかりとlogin(pam_unix)が記録されている。

  この時、初めて認証のログも、PAMが影響していた事を知った。

  さて、loginのsessionには、もう1つモジュールがある。
  pam_console.soモジュールだ。

/etc/pam.d/login ファイルの中身 (sessionの部分を抜粋)
session    required /lib/security/pam_stack.so service=system-auth
session    optional /lib/security/pam_console.so

  このpam_console.soモジュールは、ログインした時に、
/etc/security/console.permsをチェックして、デバイスが使える
ユーザー権限を指定できるというのだ。

  それと、/etc/security/console.apps のディレクトリに記述されている
システム管理用のコマンドの利用権限の変更もできるようだ。

  どうやら必要性がなさそうなので、軽く説明した程度で終わりたいと思います。
  丁度、キリが良いので、今回のシステム奮闘記は、これでおしまい (^^)


                 

  これで終わった。ワーイ、ワーイと喜んだのだが、待てよと思った。
  何か調べないと気が済まない。直観的に、何か調べないといけないと感じた。

  そこで、一歩踏み込んで見る事にした。

  pam_console.soモジュールは、コンソール(端末)からログインした時に限り
デバイスや、管理コマンドなどの権限を、ログインする一般ユーザーにも
割り当てるための物だという。

  これだけだと、どういう事を意味しているのか、わからない。
  調べてみると、まずはデバイスの権限を他のユーザーにも割り当てる
ファイルがある。
  そのファイルは、/etc/security/console.perms ファイルだ。

  早速、中身を見てみる。

console.perms ファイルの中身 (一部抜粋)
# file classes -- these are regular expressions
<console>=tty[0-9][0-9]* vc/[0-9][0-9]* :[0-9]\.[0-9] :[0-9]
<xconsole>=:[0-9]\.[0-9] :[0-9]

# device classes -- these are shell-style globs
<floppy>=/dev/fd[0-1]* \
         /dev/floppy/* /mnt/floppy*
<sound>=/dev/dsp* /dev/audio* /dev/midi* \
        /dev/mixer* /dev/sequencer \
        /dev/sound/* /dev/beep
<cdrom>=/dev/cdrom* /dev/cdroms/* /dev/cdwriter* /mnt/cdrom*

(途中、省略)

# permission definitions
<console>  0660 <floppy>     0660 root.floppy
<console>  0600 <sound>      0600 root
<console>  0600 <cdrom>      0660 root.disk

(この後は、省略)

  これだけだと、どんな設定なのか、意味がわからんので、
設定内容を調べてみる事にした。

console.perms ファイルの設定の意味 (一部抜粋)

<console>  0660 <floppy>     0660 root.floppy

青い部分は、そのデバイスのパーミッションの指定。
「0660」なので、ユーザーとグループは読み書き可能という意味だ。
そのデバイスファイルの所有者は、コンソールからログインした
ユーザーになる。一般ユーザーでも所有者になれるのだ。

そして、赤い部分は、ログアウトした後、そのデバイスファイルの
パーミッションと、所有者(この場合はroot)、
グループ名(この場合はfloopy)になるという意味だ。

  実際に、コンソールから一般ユーザーでログインしてみた。
  すると、デバイスファイルが一般ユーザーの所有になっているのだ!

フロッピーに関するデバイスファイルの所有者
[suga@xxx dev]$ ls -l | grep fd0 | more
brw-rw----    1 suga     floppy     2,   0  4月 11  2002 fd0
brw-rw----    1 suga     floppy     2,   4  4月 11  2002 fd0CompaQ
brw-rw----    1 suga     floppy     2,  12  4月 11  2002 fd0D360
brw-rw----    1 suga     floppy     2,  16  4月 11  2002 fd0D720

  こんな事、初めて知った (^^;;

  もちろん、フロッピーディスクを入れて、以下のような実験が行える。

フロッピーに関する実験
[suga@xxx dev]$ ls -l | grep fd0 | more
brw-rw----    1 root     floppy     2,   0  4月 11  2002 fd0
[suga@xxx dev]$ cd
[suga@xxx suga]$ more filename
FDディスクにデータを送るで!!
[suga@xxx suga]$
[suga@xxx suga]$ cat filename > /dev/fd0
[suga@xxx suga]$ 
[suga@xxx suga]$ cat /dev/fd0 | nkf -e | more
FDディスクにデータを送るで!!

(以下、ディスクのイメージファイルの内容です)

  つまり一般ユーザーがデバイスファイルを操作できるというわけだ。

  なぜ、コンソールからログインした一般ユーザーには
デバイスファイルを利用できる許可を行うのか。

  理由はいたって簡単で、一般ユーザーでも周辺機器の利用がある。
  音楽を聞くためにデバイスファイルを使ったりするので、
root以外でデバイスファイルが使えなかったら、音楽が聞けなくなる。

  音楽だけでなく、フロッピーなどの利用者の利便性をあげるための
設定といえる。

  ちなみに、他のホストからログインした時は、一般ユーザーでは
デバイスファイルが使えない。
  なぜなら、所有者がrootになっているためだ。

フロッピーに関するデバイスファイルの所有者
(他のマシンからログインした場合
[suga@xxx dev]$ ls -l | grep fd0 | more
brw-rw----    1 root     floppy     2,   0  4月 11  2002 fd0
brw-rw----    1 root     floppy     2,   4  4月 11  2002 fd0CompaQ
brw-rw----    1 root     floppy     2,  12  4月 11  2002 fd0D360
brw-rw----    1 root     floppy     2,  16  4月 11  2002 fd0D720

  もちろん、デバイスファイルにアクセスしてもエラーがでる。

フロッピーに関するデバイスファイルにアクセスするが
[suga@xxx suga]$ cat -v /dev/fd0 | more
cat: /dev/fd0: 許可がありません

  こんな事を知ったので、この部分を取り上げて良かった (^^)V


  さて、もう1つのpam_console.soモジュールの役目だが、
管理コマンドを一般ユーザーに権限を委譲できる事があげられる。

  そのコマンド群は、次のディレクトリの中に入っている。

  /etc/security/console.apps のディレクトリだ。

  さて、そのディレクトリの中身を見てみる。

/etc/security/console.apps ディレクトリの中
[suga@xxx console.apps]$ ls
authconfig      hwbrowser       printconf-tui                redhat-config-printer-gui  up2date
authconfig-gtk  internet-druid  printtool                    redhat-config-printer-tui  up2date-config
bindconf        kbdrate         reboot                       redhat-config-services     up2date-nox
dateconfig      kbdrate~        redhat-config-bind           redhat-config-time         xserver
gdmconfig       locale_config   redhat-config-date           redhat-config-users
gnome-lokkit    neat            redhat-config-network        rhn_register
gnorpm-auth     poweroff        redhat-config-network-cmd    serviceconf
halt            printconf-gui   redhat-config-network-druid  timetool

  なにやら、色々なコマンドがある。
  お馴染みのリブートコマンドまで含まれる。

  up2dateのコマンドの中身を見てみた。

up2dateのファイルの中身
[suga@xxx console.apps]$ more up2date
USER=root
PROGRAM=/usr/sbin/up2date
NOXOPTION=--nox
SESSION=true

  これはコンソールでログインした時も、rootしか使えないという意味だ。

  さて、これを触れば、一般ユーザーでも管理コマンドが使えるというわけだ。
  そこで、rebootコマンドに注目した。

  だが、ファイルの中身は空っぽだった。

rebootのファイル中身
[suga@xxx console.apps]$ more reboot
[suga@xxx console.apps]$ ls -l | grep reboot
-rw-r--r--    1 root     root            0  3月 13 18:33 reboot
[suga@xxx console.apps]$

  これでは、一般ユーザーがrebootを使えないのではと思い、
以下のように記述してみた。

rebootのファイルの中身
USER=suga
PROGRAM=/sbin/reboot
NOXOPTION=--nox
SESSION=true

  これで、私がコンソールで自分のアカウントでログインしても
rebootできると思った。
  そして、実験を開始したのだが・・・

  うまくいかへん (TT)

  だった。
  でも、調べる元気がなくなったので、諦める事にして、
rebootファイルを空っぽのファイルに戻した。

  ログアオウトした後、「そういえば、エラー内容をとるのを忘れていたなぁ」
と思い、一般ユーザーでログインして、rebootコマンドを使った。
  すると・・・

  一般ユーザーでrebootしてもうた  (・o・)

  思わず目が点になった。予想もしていなかった事だった。
  要するに、RedHat7.3のデフォルト状態では、一般ユーザーでも
自由にrebootがかけられる事を意味するのだ。

  今まで、rebootはrootにしかできない物と思い込んでいたのだが、
コンソールからrebootを行うのは、一般ユーザーでもできる事がわかった。

  もしかして、空っぽのファイルの場合、どのユーザーでも
使用可能という意味ではないかと思った。

  さて、この秘密の鍵を握るのは、最初に取り上げたPAMの
認証管理ファイルにある。  

  そこで、/etc/pam.d/rebootファイルを見てみた。

/etc/pam.d/rebootのファイルの中身
#%PAM-1.0
auth       sufficient   /lib/security/pam_rootok.so
auth       required     /lib/security/pam_console.so
#auth       required    /lib/security/pam_stack.so service=system-auth
account    required     /lib/security/pam_permit.so

  そうやらピンクの部分に原因があると思う。
  rootでなくても、特に、/etc/security/console.apps/rebootの中身が
空ファイルなので、特に、ユーザー制限がかけられていないと認識して
rebootの拒否する箇所がないと判断するのだと思う。

  こんな話がある事は、予想外だった!

  ちなみに、管理コマンドで、こんな設定が行えるのは
/sbin か /usr/sbin のディレクトリにあるアプリケーションだけだという。


各種サーバーのユーザーに認証にPAMが使われる

個々のモジュールを追っかけると膨大な量になるので、この辺りで終了します。 さて、こうして見て行くと、PAMの話を知るのが重要であるかがわかってきた。 何せ認証関係のプログラムだと、大抵の場合、PAMが影響しているからだ。 実は、PAMの認証を使ったサーバーにする事もできる事がわかった。 NISやSambaの認証サーバーを立ち上げる時だ。
NISサーバーとPAMの関係
複数のホストがあるが、ユーザー管理は1ヶ所で行う場合、
上図のようにNISを使う。NISサーバーは認証の時に、PAMを使う。

NISの場合、パスワード管理に、/etc/shadowを使っていないようだ。
そこのため上図では「パスワード保管ファイル」としました。

  認証サーバーを構築して、認証を一括管理を行えば、個々のホストに
ユーザー登録とユーザー管理を行う手間を省く事ができる。

  だが、それの実験は行いません。なぜなら・・・

  設定する必要性がないもーん (^^)

  必要に迫られた時に、取り上げたいと思います。


まとめ 最初、「PAM」の文字を見た時は、自分には関係ないと思っていましたが、 いざ、調べてみると、ログイン関係の設定などで、PAMが大きく影響している事を 知りました。 今まで、認証関係のソフトのインストールで、プレインストールか RPMに頼っていたために気がつかなかった問題でしたが、今回の事で しっかりと押さえておかないといけない部分だと思いました。

次章:「Proftpでftpサーバー構築の話」を読む

前章:「 OSが固まる原因(CPUの特権レベルの話)」を読む

目次:システム奮闘記に戻る

Tweet