• PAM 認 證 模 組


    作者:陳柏菁 E-mail

     

    作用:限制哪些用户或者组可以从哪里登陆,或者可以建立/etc/nologin立即阻止一般用户登陆,限制

    user可以使用的资源.例如cpu,文件,登陆数量,某些服务的登陆时间.

    第二十章  PAM 認 證 模 組

    索引:

    20.1 認識 PAM

    20.1.1
    PAM 的簡介

    20.1.2
    PAM 的相關檔案

    20.2 PAM 模組設定檔

    20.2.1
    PAM 模組設定檔的設定格式

    20.2.2
    PAM 認證模組的功能

    20.3 PAM 的設定範例



    20.1 認識 PAM
    20.1.1 PAM 的簡介
      PAM 全名為 Pluggable Authentication Module -- 可插入式認證模組,可以簡單的將其視為一個應用程式介面 (API),它是在傳統 UNIX 上頭,應用程式常使用的一種認證方式。就整個認證系統而言,PAM 可以說是認證系統的前端,而認證機制 (即真正要採取認證的方式,比如根據 /etc/passwd 或 LDAP 等來做認證) 則是屬於認證系統的後端。
      舉個例子來說,當 client 端的 user 要使用 SSH 做遠端連線時,首先必須輸入帳號密碼,而在 SSH Sever 收到這個認證資訊時,sshd 會將其交給 PAM 去做處理,接著則是依 /etc/pam.d/sshd 檔案內的設定來決定依哪些認證模組來做確認的工作,而 PAM 則是會將最後處理的結果適時的回應給 sshd。由以上的例子說明不難發現 sshd 本身必須支援 PAM 認證才行,也就是說 sshd 程式本身的原始碼裡頭必須包含 PAM 函式。您可以使用 ldd 指令來查閱一下就知道了:

    suselinux:~ # ldd /usr/sbin/sshd
        linux-gate.so.1 => (0xffffe000)
        libwrap.so.0 => /lib/libwrap.so.0 (0x40031000)
    libpam.so.0 => /lib/libpam.so.0 (0x40039000)
        libdl.so.2 => /lib/libdl.so.2 (0x40041000)
        libkafs.so.0 => /usr/lib/libkafs.so.0 (0x40044000)

      如您還不太清楚 PAM 所扮演的角色,請參考以下這個架構圖再配合上面的說明來看,應該就會有概念了:


    圖一:PAM 的架構圖

      至於為何要取名為可插入式的認證模組呢 ? 因為它是一組隨時可讓管理員來彈性使用的認證函式庫,比如您只希望有少數使用者可以執行 su 指令來切換成其他 user 或 root 的身份,那麼可以在 /etc/pam.d/su 檔案中去引用 pam_wheel.so 模組,而當您想取消此項功能時,就將此模組拿掉即可,如此一來,我們就不必為了達到這個目的而去重新編譯 su 程式了。看到這裡,大家是不是覺得使用這個 PAM 真的是非常具有彈性呢 ?

    20.1.2 PAM 的相關檔案
      上一小節的觀念沒問題的話,緊接著就來說明一下與 PAM 有關的幾個相關檔案介紹: 

    ˙
    /lib/libpam*.so:
    支援 PAM 的應用程式,需使用這裡所提供的 PAM 函式來存取相關的模組設定檔。不過有的 Distribution 則是將 PAM 函式安置在 /usr/lib 目錄中。

    ˙
    /etc/pam.d/*:
    PAM 認證模組的主要設定檔就是放在這個目錄下。我們需要為支援 PAM 的應用程式安置一個檔案在裡頭,至於檔名則是寫死在程式原始碼裡面 ; 通常這裡的檔名會取一個與程式本身的名稱相關或相同 (服務名稱),所以平常您千萬不要隨意去更改檔名,因為如果程式找不到 PAM 模組設定檔時,就會套用 /etc/pam.d/other 檔案裡的設定內容。


    早期的 PAM 模組設定檔為 /etc/pam.conf 這個檔案,而目前則大多是安置在 /etc/pam.d 目錄中。

    ˙
    /lib/security/*:
    PAM 所使用的認證模組就是安置在這裡,比如 pam_unix2.so、pam_time.so、pam_nologin.so 等等。

    ˙
    /etc/security/*
    有些 PAM 認證模組會去讀取此目錄下的相關檔案,而套用裡邊的設定值。至於詳細的情形,我們後面的範例會有說明。

      了解了相關檔案的配置之後,我們再以 PAM 認證的詳細流程圖來跟各位說明:


    圖二:PAM 的認證流程

      在圖二的流程圖中,是說明應用程式會先去呼叫 PAM 函式,然後再由其去讀取 /etc/pam.d/ 目錄下的 PAM 模組設定檔,並依裡面的設定來依序執行 PAM 模組,而這些模組是以在設定檔中所設定的順序被堆疊起來 ; 接著這些堆疊模組就開始為應用程式執行不同的認證工作,那當然執行結果或許成功,或許失敗,不過不論成功或失敗都需要將執行結果回應給 PAM 函式。比如第一個 PAM 模組驗證成功或失敗後,會回應給 PAM 函式知道,至於下一個 PAM 模組會不會接著執行驗證工作,則是要依照剛剛上一個 PAM 模組傳回的結果及所設定的控制旗標來決定 (下一節會說明),而等 PAM 模組都驗證完畢後,PAM 函式才會將最終結果傳回給應用程式。


    模組堆疊的概念
    往往很多時候,管理者會希望對使用者所輸入的認證資訊不是只單純的檢查帳號密碼而已,可能還會希望能進一步的作各項控管,比如開放某些服務只能在規定的時間內才能使用,或者希望部分服務只有少數使用者能夠存取,其他使用者不能使用但可以存取其他的服務等等,此時管理者就可以根據不同的需求來引用 (插入) 不同的模組,那當然不同的模組所執行的檢查工作就不同囉,比如模組 1 檢查完後,可能換模組 2 接著進行其他的檢查,模組 2 檢查完畢後也可能會由模組 3 再進行檢查 (端看管理者在設定檔中如何配置這些模組),這就是利用模組堆疊 ( statcked modules ) 的概念來驗證用戶的合法性。

    20.2 PAM 模組設定檔

    20.2.1 PAM 模組設定檔的設定格式
      這部分主要是探討 /etc/pam.d/ 目錄下的 PAM 模組設定檔的內容:

    suselinux:~ # ls /etc/pam.d
    chage gdm-autologin passwd   radiusd samba  sudo   xlock
    chfn  login      pop3    rexec   shadow useradd xscreensaver
    chsh  netatalk    ppp     rlogin  squid  vsftpd
    cups  openwbem    pure-ftpd rpasswd sshd   xdm
    gdm   other      quagga   rsh    su    xdm-np

      先簡單了解一下這些檔案的設定格式:

    modules_type
    control_flags
    modules_path
    options

    模組類型
    控制旗標
    模組路徑
    傳給模組的參數

      這其中除了 options 欄位外,其餘都是必要設定的欄位 ; 接著就分別來對這幾個欄位做相關說明:

    ˙
    模組類型
    共分四種 modules_type:

    auth
    對使用者所提供的認證資訊做驗證,比如檢查帳號密碼。

    account
    非認證方面的帳號管理,比如檢查帳號密碼的期限是否過期、哪些帳號可從哪些來源端來存取服務,及特定帳號登入終端機時是否在所允許的時間內等等。

    password
    與更新認證訊息有關,比如使用者變更密碼時會檢查新密碼是否夠安全,或者將修改後的密碼加密後寫入資料庫裡頭。

    session
    這個模組類型裡所使用的模組,是與使用者在存取服務前後所需執行的一些工作有關聯。比如紀錄掛載目錄的資訊、限制 user 的資源使用等等。

    ˙
    控制旗標
    一個認證模組在執行認證檢查時,有可能成功 (success),也有可能失敗 (failure),當其傳回 success 或 failure 時,PAM 將會採取什麼動作 ? 是要繼續執行下一個模組認證 (模組堆疊的特性),還是要結束認證工作不繼續往下,這就要看您是採用什麼 control_flags 了。所以簡單的說, control_flags 是用來告知 PAM 在執行模組認證成功或失敗之後,接下來要採取的動作為何。底下就來說說四個主要的控制旗標:

    required
    當使用此旗標的其中一個認證模組傳回 failure 時,還是會繼續往下執行其他堆疊模組的認證 (相同的 module_type),等全部都執行完畢後,PAM 才傳回 failure。那如果認證模組傳回 success 時,也還是會繼續往下執行其他堆疊模組的驗證。
    或許您會想說既然已經傳回失敗了,為何還要繼續往下去執行下一個 PAM 模組呢 ? 如此不是多此一舉嗎 ? 其實這樣做的目的是為了安全上的考量,也就是說透過堆疊模組這樣的設計,可以讓用戶端永遠不知道他是如何被拒絕的,因為如果當用戶了解其被拒絕的理由後,可能就會特別針對這方面來做進一步的突破,而這將會造成對系統安全上的一大威脅。

    requisite
    當使用此旗標的認證模組傳回 failure 時,則會終止整個認證程序,而不再往下驗證,PAM 會馬上傳回一個 failure 給應用程式。那如果傳回 success ,則還是會繼續往下執行其他堆疊模組的驗證。
    一般人往往分不清楚 required 與 requisite 的差異,簡單的說,不論是 required 或 requisite,只要傳回 success,都還是會繼續往下驗證,只有當它們都傳回 success 時,才算是真正的 success。而如果 required 傳回 failure 時,是會繼續執行其他堆疊模組的驗證,但 requisite 傳回 failure 時,則是會終止整個驗證程序。

    sufficient
    以相同的 modules_type 來說,如果之前的 required 都傳回 success (或者之前根本沒有 required),使用此旗標的認證模組也傳回 success 時,則不再繼續往下執行此 modules_type 中的其他堆疊模組,並傳回 success 給 PAM 函式。不過這並不意味著整個認證就是成功的,萬一有其他 modules_type 的認證模組使用 required 旗標並傳回 failure 時,那還是算認證失敗。另外不論當 required 是傳回 success 或 failure 時,sufficient 的 failure 都會被當成 optional 來看待,而被忽略。

    optional
    使用此旗標的認證模組,無論傳回 success 或 failure 都不會影響整體的認證結果,其主要是用來做 log 而已。

    ˙
    模組路徑
    如果這個欄位只設定模組名稱,未指定其實際的路徑,則表示這個模組是被安置在 /lib/security 目錄中。

    ˙
    模組參數
    這裡舉幾個模組參數給各位參考:

    use_first_pass
    認證模組不會要求使用者輸入密碼,而是從之前的 auth modules 來取得使用者密碼,若密碼不符合或未輸入密碼則認證失敗。

    try_first_pass
    認證模組不會要求使用者輸入密碼,而是從之前的 auth modules 來取得使用者密碼,若密碼不符合或未輸入密碼則要求重新輸入一次。

    debug
    讓 syslogd 將 level 為 debug 等級的資訊寫入紀錄檔內。

    nullok

    允許無密碼 ( /etc/shadow 的密碼欄位是空的,或使用 "passwd -d username" 來刪除使用者密碼 ) 的使用者可以登入系統。

    20.2.2 PAM 認證模組的功能
      PAM 模組是存放在 /lib/security 目錄中:

    suselinux:~ # ls /lib/security
    pam_access.so   pam_lastlog.so   pam_permit.so    pam_time.so
    pam_chroot.so   pam_ldap.so     pam_pwcheck.so   pam_unix.so
    pam_cracklib.so  pam_limits.so    pam_radius_auth.so pam_unix2.so
    pam_debug.so    pam_listfile.so   pam_resmgr.so    pam_unix_acct.so
    pam_deny.so    pam_localuser.so  pam_rhosts_auth.so pam_unix_auth.so
    pam_devperm.so   pam_mail.so     pam_rootok.so    pam_unix_passwd.so
    pam_env.so     pam_make.so     pam_rpasswd.so   pam_unix_session.so
    pam_filter     pam_mkhomedir.so  pam_securetty.so  pam_userdb.so
    pam_filter.so   pam_mktemp.so    pam_selinux.so   pam_userpass.so
    pam_ftp.so     pam_motd.so     pam_shells.so    pam_warn.so
    pam_group.so    pam_ncp_auth.so   pam_smb_auth.so   pam_wheel.so
    pam_homecheck.so pam_nologin.so   pam_smbpass.so   pam_winbind.so
    pam_issue.so    pam_opensc.so    pam_stress.so    pam_xauth.so
    pam_krb5.so    pam_opie.so     pam_succeed_if.so
    pam_krb5afs.so   pam_passwdqc.so   pam_tally.so

      由於實在是太多了些,因此這裡就挑幾個 PAM 認證模組的功能來說明囉:

    認證模組名稱

    主   要   用   途

    相 關 檔 案

    搭配的模組類型

    pam_access.so
    可允許或拒絕特定的使用者及群組從哪個特定來源端登入。
    access.conf
    account

    pam_cracklib.so
    此模組搭配其後所設定的項目,如 difok、retry、minlen、dcredit、ocredit 等,可以用來確保您使用者所選用的密碼是夠安全的。
    password

    pam_deny.so
    拒絕一切存取。
    皆可

    pam_env.so
    此模組會載入 /etc/security/pam_env.conf 檔案,以載入額外的環境變數來使用。
    pam_env.conf
    auth

    pam_limits.so
    此模組會參照 /etc/security/limits.conf 的設定,來限制使用者所能使用的資源,如 CPU 使用時間、user 能同時登入的次數、user 能開啟的檔案數等等。
    limits.conf
    session

    pam_listfile.so
    此模組會依照我們所做的設定及所指定的檔案,來決定是否允許或拒絕使用者存取該服務。
    auth

    pam_mail.so
    當使用者有新的信件進來時,會在該使用者登入時告知這個訊息。
    /var/spool/mail/*

    auth
    session

    pam_nologin.so
    可用來拒絕一般 user 登入本機,包含遠端登入。
    /etc/nologin
    auth、account

    pam_permit.so
    允許一切存取。
    皆可

    pam_pwcheck.so
    當使用者變更密碼時,此模組會檢查使用者所建立的新密碼是否夠安全。
    pam_pwcheck.conf
    password

    pam_rootok.so
    此模組設定在 /etc/pam.d/su 檔案中時,表示允許 root 在執行 su 指令來切換成其他 user 的身分時,可以不需輸入密碼。
    auth

    pam_securetty.so
    限定 root 可從哪幾個安全的終端機登入。
    /etc/securetty
    auth

    pam_time.so
    依照 /etc/security/time.conf 的設定,來限制使用者可以在什麼時間登入本機。
    time.conf
    account

    pam_unix2.so
    此模組可用來檢查使用者所提供的帳號密碼是否正確或帳號密碼是否過期等,端看我們所設定的模組類型 (modules_type) 為何而有不同的功用。
    皆可

    pam_wheel.so
    此模組設定在 /etc/pam.d/su 檔案中時,表示只允許 wheel 群組的成員可以執行 su 指令來變換成其他 user 的身份。
    auth

    註:上面 [相關檔案] 欄位如未指出路徑,即是存在於 /etc/security 目錄中。另外如您想找更多的說明文件,請自行查閱 /usr/share/doc/packages/pam/modules。
    20.3 PAM 的設定範例
      看了前面兩節的介紹後,可能還是有點模模糊糊的,不過沒關係,底下我們會舉幾個模組設定檔的範例來加以解說,這樣應該就可以對 PAM 認證模組有進一步的認識。

    範例一:/etc/pam.d/login

    suselinux:~ # vi /etc/pam.d/login
    #%PAM-1.0
    auth    requisite pam_unix2.so    nullok # set_secrpc
    auth    required  pam_securetty.so
    auth    required  pam_nologin.so
    auth    required  pam_env.so
    auth    required  pam_mail.so
    account  required  pam_unix2.so
    password required  pam_pwcheck.so   nullok
    password required  pam_unix2.so    nullok use_first_pass use_authtok
    session  required  pam_unix2.so    none # debug or trace
    session  required  pam_limits.so

      這是 login 認證模組所要讀取的模組設定檔。您可以注意到模組類型為 auth 的第一筆,其所使用的控制旗標為 requisite,此乃表示 pam_unix2.so 模組若是傳回 failure,則不會再往下進行其他堆疊模組的認證,而是直接宣告認證失敗。那如果傳回 success, 則是會繼續往下進行其他堆疊模組的認證。 只有當 requisite 及所有的 required 都傳回 success,整個認證才算成功。
      pam_unix2.so 模組運用在 auth 中時,是用來檢查使用者所提供的帳號密碼是否正確 ; 運用在 account 中時,是檢查使用者所提供的密碼是否有效,或者需要再建立新的密碼 ; 運用在 password 中時,是把使用者所修改的密碼進行加密後寫入資料庫裡 ; 運用在 session 中時,則是告知 syslogd 將使用者的登入資訊紀錄下來。

      您可以嘗試將 requisite 改成 sufficient,然後選擇任何一個文字介面的終端機來登入,此時您會發覺就算輸入錯誤的密碼或甚至不輸入密碼,還是可以成功登入,因為使用 sufficient 旗標的認證模組所傳回的 failure 會被忽略掉。測試完成後請記得馬上改回來噢。
      接著來對以下幾個 PAM 認證模組做個測試練習:


    測試 pam_securetty.so 模組
    這個模組主要是讀取 /etc/securetty 檔案的內容,以決定 root 可以從哪幾個安全的終端機登入。作個實驗吧 ! 首先請您打開 /etc/securetty 檔案,並把 tty6 那一行註解起來:

    suselinux:~ # vi /etc/securetty
    tty1
    tty2
    tty3
    tty4
    tty5
    # tty6 → 將該行註解起來。

    存檔離開後,請切換至 tty6,並使用 root 身分登入看看,結果如何呢 ? 應該是會無法登入對吧 ! 因為此終端機已經不是安全的終端機了。如果換成以一般 user 身分登入,則是不會受到這裡限制的。
    再做個測試,先編輯 /etc/pam.d/xdm,並插入 pam_securetty.so 模組於其中:

    suselinux:~ # vi /etc/pam.d/xdm
    #%PAM-1.0
    auth    required  pam_unix2.so   nullok #set_secrpc
    auth    required  pam_securetty.so ← 引入 pam_securetty.so 模組。
    account   required  pam_unix2.so
    :略

    存檔離開後,請您以 root 身分登入 X-WINDOW,結果當然是失敗的囉,至於一般 user 則是不受這裡的限制噢。


    測試 pam_nologin.so 模組
    此認證模組只要發覺系統上存在一個 /etc/nologin 的檔案,就會拒絕一般 user 的登入。

    suselinux:~ # touch /etc/nologin


    好了,如果依照我們目前所做的調整,root 是不能登入 tty6 的,且一般 user 無法登入任何的終端機。現在再做個測試,先把 /etc/pam.d/login 裡 auth 第一筆的 requisite 再改成 sufficient,這時候您會發現 root 是可以成功登入 tty6 的,且一般 user 亦可成功登入本機,這是因為當 sufficient 所使用的認證模組已傳回 success,因此不會再繼續執行 modules_type 為 auth 的其他堆疊模組,那當然 pam_securetty.so 及 pam_nologin.so 也就不會執行驗證的工作了。


    測試 pam_limits.so 模組
    這模組會參照 /etc/security/limits.conf 的設定,來限制 user 的使用資源,舉個簡單的例子:

    suselinux:~ # vi /etc/security/limits.conf
    @users - maxlogins 2

    說明
    limits.conf 的設定內容分成四個欄位,分別是 domaintypeitemvalue
    domain
    可以是 username 或 groupname,不過使用 groupname 時,請記得在前面加上個 "@" 符號。
    type
    有 soft 及 hard 這兩個選項可以設定,代表的是 soft limit 及 hard limit。
    item
    為限制存取資源的項目,有 core、data、nproc、maxlogins、… 等等,請自行參考設定檔裡的說明。
    value
    為該 item 的設定值。
    以我們這裡的例子來說,是要限制 users 群組的成員,最多只能同時登入兩次 (含遠端登入),比如使用者 barry 為 users 群組成員,目前已登入 tty1 及 tty2,則其無法再由其他的終端機登入。


    測試 pam_time.so 模組
    此模組所參考的檔案為 /etc/security/time.conf,主要是用來限定使用者能存取某個服務的時間。至於 time.conf 的設定格式如下:

    services ; ttys ; users ; times

    接著分別來說明這幾個欄位的意義:

    services
    設定服務名稱。

    ttys
    設定所使用的終端機名稱。

    users
    所限定的使用者名稱列表。

    times
    限定存取的時間。至於時間格式的寫法,週一至週日分別為 Mo、Tu、We、Th、Fr、Sa、Su,而 Al 是表示週一至週日的每一天,AlWe 則是除了週三以外的每一天。另外您還需搭配確切的存取時間來使用,比如 "MoWeFr0800-1200 " 是每週一三五的早上八點至十二點," ! Al0000-2400 " 則是表示所有時間都禁止的意思。

    :往往您還可以搭配萬用字元 " * " 及邏輯運算符 ! (NOT)、| (OR)、& (AND) 於其中。
    以上如果沒問題的話,馬上舉個例子來練習看看。首先先於 /etc/pam.d/login 檔案中插入 pam_time.so 模組:

    suselinux:~ # vi /etc/pam.d/login
    #%PAM-1.0
    :略
    account required pam_unix2.so
    account required pam_time.so ← 引用 pam_time.so 模組。
    :略

    再至 /etc/security/time.conf 中做設定:

    suselinux:~ # vi /etc/security/time.conf
    login ; tty3 | tty4 | tty5 ; tina | david ; MoWe0900-2200
    # 允許 tina 或 david 在週一及週三的早上九點至晚上十點登入本機的第三、四、五
    # 個終端機,至於其他時間則禁止登入。
    login ; tty* ; user* ; !Al0000-2400
    # 如使用者的帳號名稱是以 user 做開始者 (如 user01、user225 等),則
    # 無論什麼時候都禁止登入所有文字介面的終端機。

    最後如您想禁止所有一般 user 登入本機,可以這麼設定:

    suselinux:~ # vi /etc/security/time.conf
    login ; tty* ; !root ; !Al0000-2400

    範例二:/etc/pam.d/pop3

    suselinux:~ # vi /etc/pam.d/pop3
    #%PAM-1.0
    auth  required pam_unix2.so
    auth   required pam_listfile.so onerr=succeed item=user sense=deny file=/etc/poplist
    account required pam_unix2.so

    這是跟收信有關的認證模組所要讀取的模組設定檔。而我們這裡引用了 pam_listfile.so 模組,它可以用來載入其後所指定的檔案 /etc/poplist,以決定要允許或拒絕使用者存取 pop3 服務。另外 " onerr=succeed " 的意思是說,如果 /etc/poplist 檔案不存在,驗證模組就把它當作是成功的 ; 反過來說,如果希望 /etc/poplist 檔案不存在時,就當成驗證失敗來處理的話,那設定成 " onerr=fail " 即可。
      再來是 " sense=deny ",其表示存在於 /etc/poplist 中的使用者是無法存取 pop3 服務的,至於其他使用者則是會被允許。一樣道理,如設定成 " sense=allow ",則只有 /etc/poplist 中的使用者可以存取 pop3 服務,其他人則會被拒絕。
      假使現在希望拒絕使用者 barry 及 mary 使用 pop3 服務,那麼就到 /etc/poplist 內將做設定:

    suselinux:~ # vi /etc/poplist
    barry
    mary

      夠簡單吧 ! 如果都沒問題的話,再來看個類似設定的檔案 /etc/pam.d/vsftpd:

    suselinux:~ # vi /etc/pam.d/vsftpd
    #%PAM-1.0
    auth   required pam_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed
    auth   required pam_unix2.so
    auth   required pam_shells.so
    account  required pam_unix2.so
    password required pam_unix2.so
    session  required pam_unix2.so

      第一行的設定應該看得懂了吧 ! 簡單的說,就是設定在 /etc/ftpusers 檔案中的使用者,無法存取 ftp 服務啦。

    範例三:/etc/pam.d/sshd

    suselinux:~ # vi /etc/pam.d/sshd
    #%PAM-1.0
    auth   required pam_unix2.so  # set_secrpc
    auth    required pam_nologin.so
    auth    required pam_env.so
    account  required pam_unix2.so
    account  required pam_nologin.so
    account  required pam_access.so ← 引入 pam_access.so 模組。
    password required pam_pwcheck.so
    password required pam_unix2.so   use_first_pass use_authtok
    session  required pam_unix2.so   none # trace or debug
    session  required pam_limits.so

      這裡主要是針對 pam_access.so 來做說明。此模組預設會載入 /etc/security/access.conf 檔案,來進一步允許或拒絕哪些帳號能從哪些特定的來源端登入。所以接著就介紹 access.conf 這個檔案:

    suselinux:~ # vi /etc/security/access.conf
    # 檔案設定格式如下:
    # permission : users : origins
    # permission 可以設定成 " + " (允許存取) 或 " - " (拒絕存取)。
    # users 可以是使用者名稱、群組名稱或所有人 (ALL)。
    # origins 則為來源端的設定,可以是主機名稱、網域名稱 (.domain.com.tw)、主機
    # 位址、網路位址 (192.168.1.)、所有來源端 (ALL) 及不含 " . " 的主機名稱 (LOCAL)。
    - : user01 user02 : ALL EXCEPT .paching.com.tw 192.168.1.
    - : tina david   : LOCAL 192.168.2.
    - : ALL EXCEPT group01 group02 : 192.168.1.222

      第一行設定是說 user01 及 user02 這兩個使用者,除了來源端為 paching.com.tw 網域內的主機及 192.168.1.x 以外,拒絕從其他來源端存取 SSH 服務。
      第二行設定是說不允許 tina 及 david 從不含 " . " 的來源主機名稱或 192.168.2.x 的來源端存取 SSH 服務。
      最後一行的設定是說除了 group01 及 group02 的群組成員外,禁止其他人從 192.168.1.222 的來源端存取 SSH 服務。
      當您在作測試時,請先稿定名稱解析方面的問題,比如可以先至 /etc/hosts 內去把來源端的主機名稱及 IP 位址設定上去。
      如果現在您只希望能讓某個特定的一般使用者能存取 SSH 服務,其他人全部拒絕 (包括 root 在內),可這麼設定:

    suselinux:~ # vi /etc/security/access.conf
    - : ALL EXCEPT barry : ALL

      這應該不須多加解釋了吧 !

    範例四:/etc/pam.d/su

    suselinux:~ # vi /etc/pam.d/su
    auth    sufficient  pam_rootok.so
    auth    required   pam_unix2.so   nullok # set_secrpc
    account   required   pam_unix2.so
    password  required   pam_pwcheck.so  nullok
    password  required   pam_unix2.so   nullok use_first_pass use_authtok
    session   required   pam_unix2.so   debug # none or trace

      先看看 auth 第一筆的設定,在這裡因為引用了 pam_rootok.so 模組,所以當 root 執行 su 指令來變換成其他 user 的身分時,不需輸入密碼即可轉換成功。
      不過您有沒有注意到第一筆是採用 sufficient 控制旗標,這就表示當 pam_rootok.so 傳回 success 時,就不再執行 auth 中其他堆疊模組的認證。現在如果把 sufficient 改成 required 又如何呢 ? 此時當然是會要求 root 輸入密碼囉。


    測試 pam_wheel.so 模組
    當您要限定一般使用者執行 su 的話,就可以引入這個模組噢,看看以下的範例:

    suselinux:~ # vi /etc/pam.d/su
    auth    sufficient  pam_rootok.so
    auth    required   pam_unix2.so   nullok # set_secrpc
    auth    required   pam_wheel.so   group=wheel
    account   required   pam_unix2.so
    password  required   pam_pwcheck.so  nullok
    password  required   pam_unix2.so   nullok use_first_pass use_authtok
    session   required   pam_unix2.so   debug # none or trace


    這裡是引用了 pam_wheel.so 模組,其後是指定可使用 su 指令來轉換身分的群組名稱,預設是 wheel 群組,當然您也可以指定其他的群組,這樣一來,就只有是該群組的成員才可以執行 su 囉。自己測試一下吧。

      PAM 認證模組就介紹到這裡了。不過憑良心說,您要是初次接觸 PAM 的話,會覺得好像不是那麼容易入門,但偏偏它對系統安全方面的管理又非常有幫助,因此多花點時間在這上頭學習是有其必要的。


    copyright © 2005 by barry ( 柏青哥 )

  • 相关阅读:
    IOS整体代码复习一
    IOS复习UIActionSheet&UIAlertView
    IOS复习Plist文件的读取和写入
    IOS复习UITextfield&UILabel
    iOS中判断两个圆是否重叠
    iOS指针回调函数
    ios函数指针
    iOS分区
    ios指针第二天
    iOS指针第一天
  • 原文地址:https://www.cnblogs.com/jjkv3/p/3750829.html
Copyright © 2020-2023  润新知