等保測評主機安全之centos之密碼長度

2019-06-14 215275人圍觀 ,發現 13 個不明物體 終端安全

*本文原創作者:起于凡而非于凡,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載

注:本文和等保聯系其實并不大,主要還是說一些linux里細節一些的東西,而且很有可能會浪費你生命中的好幾分鐘……

密碼長度,作為等級保護主機測評項里中密碼復雜度要求之一,是必須要查的。

在《等級測評師初級教程》里,對于密碼長度的設置指向了/etc/login.defs里的PASS_MIN_LEN字段。

#  PASS_MIN_LEN    Minimum acceptable password length.

PASS_MIN_LEN    5

簡單明了,對新密碼的長度最小值做出了限制。

不過,實際上這個參數是無效的,至少在centos6以及以上版本里,這個參數對新密碼長度沒有一點點的制約。

比如大家可以試一試,給PASS_MIN_LEN
設一個值,再用非root賬戶去改改密碼,看看對新密碼長度有沒有影響。甚至,還可以直接刪除login.defs文件,試一試。

反正,我的測試結果是:這個參數沒有起到作用。

結果是出來了,至于原因,我沒找到,網上也沒有相關的資料。或許該參數在centos以前的某個老版本里是有作用的,但隨著版本更新,特別估計是開始使用PAM認證機制后,該參數就無效化了,僅僅作為一個迷惑人的參數放置在login.defs文件里。

實際上真正起作用的,是一個pam模塊,具體點,也就是pam_cracklib.so模塊。

PAM認證機制個人感覺就是一個模塊化、組件化的機制,一些人把一些認證、驗證以及其他功能實現好了,然后上層的應用去調用配置文件(接口),而配置文件呢再調用底層的實現,大概就是下圖這個樣子:

Image所謂的應用程序,就包括在linux里使用的命令,好,回到密碼長度這個話題。

修改密碼時對于密碼的一系列驗證由pam_cracklib.so模塊實現,那么誰去調用?那當然就是passwd了(修改密碼的命令)。

passwd怎么調用的?是通過配置文件(接口)做到的。

在centos6以及以上版本中,這個配置文件就是/etc/pam.d中與passwd同名的文件,也就是/etc/pam.d/passwd

順便一提,/etc/pam.d中基本都是這類同名文件:

[[email protected] ~]# ls /etc/pam.d

atd               fingerprint-auth-ac  password-auth      smtp            system-config-authentication

authconfig        gdm                  password-auth-ac   smtp.postfix    system-config-date

authconfig-gtk    gdm-autologin        polkit-1           smtp.sendmail   system-config-kdump

authconfig-tui    gdm-fingerprint      poweroff           sshd            system-config-keyboard

chfn              gdm-password         ppp                sshd~           system-config-network

chsh              gnome-screensaver    reboot             ssh-keycat      system-config-network-cmd

config-util       halt                 remote             su              system-config-users

crond             ksu                  run_init           sudo            vmtoolsd

cups              login                runuser            sudo-i          xserver

cvs               login~               runuser-l          su-l

dovecot           newrole              setup              system-auth

eject             other                smartcard-auth     system-auth~

fingerprint-auth  passwd               smartcard-auth-ac  system-auth-ac
  

/etc/pam.d/passwd的內容如下:

[[email protected] ~]# cat /etc/pam.d/passwd
#%PAM-1.0
auth       include    system-auth
account    include    system-auth
password   substack    system-auth
-password   optional    pam_gnome_keyring.so

對于配置文件,具有一定的規范,第一列代表模塊類型,類型分為4種:

auth: 用來對用戶的身份進行識別.如:提示用戶輸入密碼,或判斷用戶是否為root

account:對帳號的各項屬性進行檢查.如:是否允許登錄,是否達到最大用戶數,或是root用戶是否允許在這個終端登錄等

session:這個模塊用來定義用戶登錄前的,及用戶退出后所要進行的操作.如:登錄連接信息,用戶數據的打開與關閉,掛載文件系統等.

passwd:使用用戶信息來更新.如:修改用戶密碼.

這里,由于是修改密碼,所以會使用passwd類型的模塊。

配置文件是可以互相調用的,passwd文件里的第三行

password   substack    system-auth

就調用了system-auth配置文件。

這里的substack和include都是引用的意思,只是稍微有點區別(具體百度就知道了)。

然后這個system-auth文件也在/etc/pam.d的文件夾中,內容為

[[email protected] ~]# cat /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      pam_env.so

auth        sufficient    pam_fprintd.so

auth        sufficient    pam_unix.so nullok try_first_pass

auth        requisite     pam_succeed_if.so uid >= 500 quiet

auth        required      pam_deny.so

account     required      pam_unix.so

account     sufficient    pam_localuser.so

account     sufficient    pam_succeed_if.so uid < 500 quiet

account     required      pam_permit.so

password    requisite     pam_cracklib.so try_first_pass retry=3 type=

password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok

password    required      pam_deny.so

session     optional      pam_keyinit.so revoke

session     required      pam_limits.so

session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid

session     required      pam_unix.so

其中,具體被引用(使用)到的是:

password    requisite     pam_cracklib.so try_first_pass retry=3 type=

password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok

password    required      pam_deny.so

pam_cracklib.so模塊有不少參數,主要常用的有這幾個(摘抄于網上):

minlen=N:最小密碼長度。
dcredit=N:當N>=0時,N代表新密碼最多可以有多少個阿拉伯數字。當N<0時,N代表新密碼最少要有多少個阿拉伯數字。
ucredit=N:和dcredit差不多,但是這里說的是大寫字母。
lcredit=N:和dcredit差不多,但是這里說的是小寫字母。
ocredit=N:和dcredit差不多,但是這里說的是特殊字符。

似乎到這里就差不多了,因為都找到了實際控制新密碼最小長度的地方了,但其實還沒完呢。

因為網上關于pam_cracklib模塊中這幾個參數的解釋,可以說,基本上都是不準確的。

那當然,我都這么說了,我這里自然會給一個準確的解釋(我覺得這應該是全網唯一清楚且準確的中文解釋了,因為我自己在查找資料的時候完全沒有搜到,有些資料比較接近,但實際還是沒說清楚)。

準確的解釋來man命令輸出的說明文檔:https://linux.die.net/man/8/pam_cracklib

其實寫得還是比較清楚的,但是還是有點抽象,我稍微解釋下。

minlen確實有最小長度的意思,但是當dcredit、ucredit、lcredit、ocredit的值(N)大于等于零的時候,情況就不同了。

N大于零的時候,完全不是網上說的“最多可以有多少個數字或大小寫字母或特殊字符”的意思,而是計算長度的時候會有變化。

比如ocredit(特殊字符)的值是2的時候,就代表有最多有2個特殊字符的長度額外能加1。

當你設置的密碼是:@#¥,它的長度被算作是5,而不是3。因為有2個特殊字符的長度被看做是2(額外加了個1),而第3個特殊字符沒有此類變化,長度仍被視作是1,所以總共長度時(2+2)+1=5。

所以,如果ocredit的值是4,那么@#¥%&的長度就是(4+4)+1=9。

其余的大小寫字母和數字的值大于零時,也是這個意思。而他們的默認值都是1,也就是會有1個字符的長度額外加1。

所以如果你什么都不設置,就設置minlen=8的話,理論上你的新密碼只要4類字符都包含,那么4個字符就夠了,比如:[email protected]

當然,如果你真這么設置,實際上是不行的,因為除了minlen對長度有限制,cracklib內部有代碼對其有限制,而且優先級高于minlen。

解釋如下:Note that there is a pair of length limits in Cracklib itself, a “way too short” limit of 4 which is hard coded in and a defined limit (6) that will be checked without reference to minlen。

大概的代碼如下:

#define MINLEN 6
  
  char *
  FascistLook(pwp, instring)
   PWDICT *pwp;
   char *instring;
  {
   int ii;
   char *ptr;
   char *jptr;
   char junk[STRINGSIZE];
   char *password;
   char rpassword[STRINGSIZE];
   int32 notfound;
  
   notfound = PW_WORDS(pwp);
   /* already truncated if from FascistCheck() */
   /* but pretend it wasn't ... */
   strncpy(rpassword, instring, TRUNCSTRINGSIZE);
   rpassword[TRUNCSTRINGSIZE - 1] = '';
   password = rpassword;
  
   if (strlen(password) < 4)
   {
   return ("it's WAY too short");
   }
   if (strlen(password) < MINLEN)
   {
   return ("it is too short");
   }
  
   jptr = junk;
   *jptr = '';
  
   for (ii = 0; ii < STRINGSIZE && password[ii]; ii++)
   {
   if (!strchr(junk, password[ii]))
   {
   *(jptr++) = password[ii];
   *jptr = '';
   }
   }
  
   if (strlen(junk) < MIND

所以說,如果長度小于4,會輸出it’s WAY too short,如果大于4小于6,會輸出it is too short。

當然,超過了6之后,就是由minlen控制了。

嗯……扯了這么久,大概把修改密碼時密碼長度的事情說完了。

正如前言所說,和等保關系不大。

不過如果在檢查的時候看到PASS_MIN_LEN    8 的時候,是給這1分還是不給分呢?

我想大家在心里都是有答案的,嘿嘿。

另外,這個pam認證機制還是經常會碰到的,比如在登錄失敗處理功能中,是用pam_tally或者pam_tally2模塊去實現。

所以聰明的你一定知道具體應該去哪個配置文件里查看是否進行設置了。

比如遠程ssh連接的登錄失敗處理功能,自然就是去pam.d文件夾中的sshd文件查看,sshd又引用passwd-auth,所這兩個文件都可以實現失敗處理(所以初級教程讓你去system-auth里查看配置,其實是管不了ssh遠程連接登錄的,實際上管的是本地tty終端登錄)。

而本地tty終端登錄,也就是使用login命令,是去pam.d文件夾中的login文件查看,login則引用system-auth文件,同理,這兩個文件都可以實現。

至于su命令和圖形化界面窗口登錄(比如gdm-password)也是按照這種方法去查看有效配置文件在哪兒。

就先寫到這了,以后有空再寫一寫其他的。

*本文原創作者:起于凡而非于凡,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載

相關推薦
發表評論

已有 13 條評論

取消
Loading...

文章目錄

    特別推薦

    推薦關注

    官方公眾號

    聚焦企業安全

    填寫個人信息

    姓名
    電話
    郵箱
    公司
    行業
    職位
    css.php 重庆百变王牌走势图 福建31选7开奖结果查询果 今天选四开奖结果查询 澳洲幸运8开奖结果体彩 手机打麻将怎么才能 浙江20选5中几个有奖 大庆麻将带宝下载 篮球比赛分析app 熟客温州麻将官网2019 乐乐安徽麻将电玩之家 河南快三号码遗漏图 重庆幸运农场异地操作 贵州十一选五开奖遗 英超曼城 极速赛车游戏下载单机版 广西棋牌游戏 江苏快3杀号软件