跳到主要內容

Linux操作不求人 - 肆章之拾 - 伺服器架設(IX) - 帳號目錄與網域名稱伺服器 - LDAP 與 DNS

     LDAP(Lightweight Directory Access Protocol,https://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol)通常用於跨作業平台間的使用者資料認證,透過TCP/IP的協議方式,便可以維護與登錄同一份帳號密碼跟使用者登錄的資訊,每個使用者用DN(distinguished name)來區別,DN內容包含如email,地址與電話,猶如商業登錄使用的黃頁簿電子版。關於LDAP 的屬性參數,可參考http://www.zytrax.com/books/ldap/ape/ 與 https://www.ldap.com/understanding-ldap-schema。筆者幾年前在安裝 Shibboleth(https://shibboleth.net/about/) 作為全球圖書館藏SSO(Single Sign On)的登入媒介時,就需先安裝LDAP的伺服器認證登入方式。在CentOS6_x64下,便是利用OpenLDAP(http://www.openldap.org/)來達到分享目錄的方式。同樣的,我們利用 yum install -y openldap-*,來下載 OpenLDAP 套件:
























(圖4-82)

接著利用以下指令複製設定檔至 /var/lib/ldap,並變更檔案擁有者與擁有群組皆為 ldap
$ cp /usr/share/openldap-server/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
$ chown ldap:ldap /var/lib/ldap/DB_CONFIG 

接著利用以下指令,產生用來做資料加密的金鑰,再利用ssl做成用RSA加密的金鑰,接著再由此金鑰產生憑證。如圖4-83
$ /etc/pki/tls/certs
$ make ldap.key
$ openssl rsa -in ldap.key -out ldap.key
$ make ldap.csr
$ openssl x509 -in ldap.csr -out ldap.crt -req -signkey ldap.key -days 3650
/*  同樣產生十年的私鑰來使用 */

$ chmod 400 ldap.*
/* 修改讀取權限,只限 root 讀取 */


















(圖4-84)

製造需要的金鑰與憑證後,將這些檔案複製到 /etc/openldap/cacerts 內,並改為權限與群組皆為 ldap 如下
$ cp ldap.key ldap.crt ca-bundle.crt /etc/openldap/certs
$ chmod ldap:ldap /etc/openldap/certs/ldap.key
$ chmod ldap:ldap /etc/openldap/certs/ldap.crt
$ chmod ldap:ldap /etc/openldap/certs/ca-bundle.crt

需重新啟動 ldap 服務與加入開機啟動,如下指令
$ service slapd restart
$ chkconfig --level 235 slapd on

此時可看到如圖4-85之服務埠號 389,請記得防火牆亦須開起允許埠號 389 的封包,才能讓LDAP的Client機器去讀取LDAP資料,使用如下指令
$ iptables -A INPUT -p tcp --dport 389 -j ACCEPT
$ iptables-save








(圖4-85)



接著設定需要 ssl/tls 加密的 mod_ssl.ldif 設定檔案,內容如圖4-85,儲存離開後,並利用指令 ldapmodify -Y EXTERNAL -H ldapi:/// -f mod_ssl.ldif











(圖4-85)

如此就可以將ldap連線方式 ldaps啟用,修改設定檔 /etc/sysconfig/ldap,將檔案內的SLAPD_LDAPS 參數設定成 yes。並重新啟動 ldap 伺服器軟體
$ service slapd restart



再來,我們要先產生 ldap 最上層權限之帳號的密碼。利用指令 slappasswd 產生{SSHA}(預設為 SSHA,若要換為 MD5, 只要加上參數 -h md5 即可)的管理者密碼。 並利用 vim 產生檔案 chrootpw.ldif 來將 slappasswd 產生的密碼檔,編輯進去。如圖4-86之olcRootPW為填入SSHA密碼,筆者已把敏感資訊去除,請讀者自行複製您設定的密碼貼上。並使用以下指令加入剛剛產生的設定檔,執行後會產生如圖4-87
$ ldapadd -Y EXTERNAL -H ldapi:/// -f chrootpw.ldif

/* -Y 為SASL的認證機制( https://en.wikipedia.org/wiki/Simple_Authentication_and_Security_Layer ), -H 為指定 LDAP 的 URI -f 為輸入調整的資訊參數檔,其他參數可利用 man ldapadd 來查閱 */






(圖4-86)









(圖4-87)

接著再設定下一層的資訊,先用 slappasswd 產生另一組給管理帳號用manager帳號使用之密碼。利用指令 vim chdomain.ldif,來編輯 LDAP 網域與管理者manager資訊。如圖4-88,dc=,dc= 為您的 domain name ,如換為 dc=linux, dc=com。olcRootPW: 設定為上述 slappasswd 產生的 SSHA 密碼,儲存離開後,再利用如下指令匯入LDAP資料庫:
$ ldapmodify -Y EXTERNAL -H ldapi:/// -f chdomain.ldif




















(圖4-88)

以上設定完成後,我們還需設定其他下一層群組。利用 vim basedomain.ldif 輸入如圖4-89內容,並利用指令 ldapadd -x -D cn=Manager,dc=xxx,dc=xxx -W -f basedomain.ldif,來匯入,如圖4-90。筆者已抹除圖內一些敏感資訊,接著用指令 ldapsearch -x -b "dc=linux,dc=com" 來檢查是否有匯入 LDAP 的資料庫
接著再將基本群組匯入資料庫,設定檔如圖4-90






















(圖4-89)













(圖4-90)

以上皆完成後,我們可以新增一個使用者到LDAP資料庫內,已方便登入驗證。先使用slappasswd 來產生新使用者所要用的密碼編碼。接著用 vim ldapuser.ldif 編輯我們要匯入的使用者參數檔,如圖4-91。並利用如下的指令加入:
$ ldapadd -x -D cn=manager,dc=mylinux,dc=com -W -f ldapuser.ldif


















(圖4-91)

以上方式加入後,若要刪除使用者或群組,請利用以下指令
$ ldapdelete -x -W -D 'cn=manager,dc=mylinux,dc=com' \ 'uid=myldapuser,ou=People,dc=mylinux,dc=com'
/*  用於刪除使用者 */

$ ldapdelete -x -W -D 'cn=manager,dc=mylinux,dc=com' \ 'uid=myldapuser,ou=Group,dc=mylinux,dc=com'
/* 用於刪除群組 */


LDAP Client 端的設定,為需先下載軟體 yum install openldap-clients nss-pam-ldapd,如圖4-91





















(圖4-91)

因我們有設定可透過 ssl/tls 連線,故要將此功能加入Client連線時的參數(http://www.openldap.org/doc/admin24/tls.html)。如下指令

$echo "TLS_REQCERT allow >> /etc/openldap/ldap.conf
$echo "tls_reqcert allow >> /etc/openldap/nslcd.conf
$echo "tls_reqcert allow >> /etc/openldap/pam_ldap.conf

再進行利用 ldap 結合 pam 模組作登入系統的認證,如圖4-92
$ authconfig --enableldap --enableldaptls --enableldapauth -- \ ldapserver=mylinux.com --ldapbasedn="dc=linux,dc=com" -- \ enablemkhomedir --update







(圖4-92)
除此之外,亦可使用指令 setup 來逐一設定利用LDAP認證登入的方式,選Authentication configuration 後,選 Run Tool ,再點選 use LDAP 跟 Use LDAP Authentication (圖4-93):




































(圖4-93)

     綜觀來看,OpenLDAP的設定相當繁瑣,但其實有脈絡可循,大抵上就是由上層分類別名,逐一設定至下層使用者帳號。除此之外,對於習慣圖形界面的讀者,若需要圖形畫管理LDAP,確認先有網頁伺服器軟體後,亦可安裝phpldapadmin 網頁管理界面(http://phpldapadmin.sourceforge.net/wiki/index.php/Main_Page)。
以上設定為參考https://www.server-world.info/en/note?os=CentOS_6&p=ssl,https://www.server-world.info/en/note?os=CentOS_6&p=ldap 與 https://www.server-world.info/en/note?os=CentOS_6&p=ldap&f=2
其他詳細的 OpenLDAP 的設定,讀者可參考 http://www.openldap.org/doc/。


@dns
     DNS伺服器主要提供IP與網域名稱的對應,隨時提供連上網際網路的機器查詢,故也常成爲殭屍網路攻擊(https://en.wikipedia.org/wiki/Zombie_(computer_science))的目標。DNS所利用之原理與網路協定,可參考https://en.wikipedia.org/wiki/Domain_Name_System。一般來說,架設DNS伺服器與管理,是一件吃力不討好的事。因爲要確保24小時的維運與常更新修改動作,就是需要管理者用有效率的方法來施行監控與撰寫程式來分擔。故中小企業內除自家內部網路的DNS伺服器需自行架設外,一般建議要架設網際網路DNS,還是直接利用或forwardISP或大專院校計算機中心所提供的DNS伺服器爲宜,切勿連結來路不明的DNS伺服器,以防網址對應IP的詐欺,而將您的瀏覽器導入惡意網站,嚴重則可能被盜取重要帳號密碼,如釣魚網站(Phishing)。
相同地,我們一樣透過指令 yum install bind bind-* 來安裝所需的DNS伺服器軟體bind (http://www.isc.org/downloads/BIND/)























(圖4-85)
接著利用指令 vim 編輯 bind 的設定檔 /etc/named.conf,以下僅列需出修改之處:

options {
           listen-on  port  53 {127.0.0.1; 10.0.2.15; }
           listen-on-v6  port  53  { none;  };
          /*  若不想用 ipv6則將原先 ::1 修改為none,並在/etc/sysconfig/name 內,加入OPTIONS="-4" 的參數  */
           allow-query  {  localhost;  10.0.2.0/24;  };
         
           dnssec-enable yes;
           dnssec-validation  yes;
           dnssec-lookaside auto;
           /* 為了避免被假 dns 欺騙的攻擊(https://en.wikipedia.org/wiki/DNS_spoofing),我們利用 dnssec 來認證為正確主機(https://www.isc.org/downloads/bind/dnssec/)*/
};

zone  "mylinux.com" IN {
type  master;
file     "forward.mylinux.zone";   # 需自行產生相同檔案名稱來對應,當正解析
allow-update { none; };
};

zone  "2.0.10.in-addr.arpa"  IN  {
type  master;
file   "reverse.mylinux.zone";    # 需自行產生相同檔案名稱來對應,當反解析
allow-update  { none; };
};
----------------------------------------------------------------------

接著在 /var/named/ 下,利用指令 vim forward.mylinux.zone 設定正向解析zone檔(從主機名稱查詢到IP)檔,加入如下內容並儲存:


$TTL  86400
@     IN     SOA    mydns.mylinux.com.  root.mylinux.com. (
           2016111101 ;Serial       # 同常以日期戳章為主,格式如YYYYMMDDXX
           3600             ;Refresh
           1800             ;Retry
           604800         ;Expire
           86400           ;Minimum   TTL
)
@        IN    NS          mydns.mylinux.com.
@        IN    A            10.0.2.15
mydns       IN    A      10.0.2.15




接著在 /var/named/ 下,利用指令 vim reverse.mylinux.zone 設定反向解析zone(從IP對應主機名)檔,加入如下內容並儲存:

$TTL 86400
@  IN   SOA   mydns.mylinux.com.  root.mylinux.com.  (
2016111101 ;Serial       #
           3600             ;Refresh
           1800             ;Retry
           604800         ;Expire
           86400           ;Minimum   TTL
)
@        IN    NS          mydns.mylinux.com.
@        IN    PTR            mylinux.com.
mydns       IN    A      10.0.2.15
15       IN   PTR          mydns.mylinux.com.
--------------------------------------------------------------------------------

上述設定儲存後離開,為了避免DNS Server服務的欺騙或被假造的安全性,我們利用dnssec (https://www.icann.org/resources/pages/dnssec-qaa-2014-01-29-en, https://en.wikipedia.org/wiki/Domain_Name_System_Security_Extensions) 的能力,來簽署 dns server 伺服器之驗證。用指令 yum install dnssec-tools 下載安裝 dnssec-tools,並將 dnssec key 放入 /etc/pki/dnssec-keys,由以下指令來產生:
$ cd /etc/pki/dnssec-keys
$ dnssec-keygen -a NSEC3RSASHA1 -b 2048 -n ZONE mylinux.com
/* 利用 NSEC3RSASHA1 加密方式,長度為 2048 bytes 來產生金鑰對 ,-b 數目愈多處理愈慢,此動作用來產生 ZSK */

$ dnssec-keygen -r /dev/urandom -f KSK -a NSEC3RSASHA1 -b 2048 -n ZONE mylinux.com
/* 接著產生 KSK (https://www.icann.org/resources/pages/ksk-rollover)  */
以上完成後,會產生兩組 .key 與 .private 檔。藉此,我把要金鑰檔加入 zone 檔內。利用 vim /var/named/mylinux.com.zone ,編輯此 zone 檔如下
$INCLUDE  /etc/pki/dnssec-keys/Kmylinux.com.+000+00000.key
$INCLUDE  /etc/pki/dnssec-keys/Kmylinux.com.+000+00001.key
/* .key 檔名端看您利用 ls Kmylinux.com.*.key 所得到之名稱  */

接著要對 zone 檔做簽署的認證動作,如以下:
$ cd /var/named
$ dnssec-signzone -S -K /etc/pki/dnssec-keys -e  +31536000 -N INCREMENT \ forward.mylinux.com.zone
/* 利用 /etc/pki/dnssec-keys 內的 key,簽署一年的認證,並產生 mylinux.com.zone.signed 檔  */

完成此指令後,會產生 forward.mylinux.com.zone.signed,修改 /var/named.conf 內之zone檔,如下:
zone "mylinux.com" j IN{
         type master;
         allow-transfer { 10.0.2.15; };
         allow-update { none; };
         also-notify  { 10.0.2.15; };
         file "forward.mylinux.com.zone.signed";
};

對 reverse 的 zone 檔做與 forward 的 zone 檔一樣的簽署動作,並修改 /var/named.conf 設定。

(以上產生ZSK與KSK設定,參考自 http://www.thenoccave.com/2013/05/17/dnssec-complete-howto-sign-the-zone/ 與 https://www.crc.id.au/configuring-dnssec-on-el6-and-bind-9/)


重新啟動 bind並開啟防火牆的允許DNS伺服器埠號 53
$ service bind restart 
$ iptables -p udp -m state --state NEW --dport 53 -j ACCEPT
$ iptables -p tcp -m state --state NEW --dport 53 -j ACCEPT
$ iptables-save


關於其他 BIND 的詳細設定,可參考 https://www.isc.org/downloads/bind/doc/,DNSSEC可參考ICANN (https://www.icann.org/resources/pages/dnssec-qaa-2014-01-29-en) 。經由 DNSSEC 的加密驗證方式,我們可避開 DNS 假造欺騙,轉嫁等攻擊,但亦可能造成資料傳送間的效率降低,就如同俗話有云:有一好,沒倆好。但筆者個人仍深刻覺得,公開服務的DNS伺服器,應該要有設定DNSSEC的驗證機制,若只是內網自身服務,就可以斟酌使用,或是僅做 ZSK的方式。不然可能會搞昏頭,弄到不要不要的。



If you have any feedback or question, please go to my forum to discuss.

這個網誌中的熱門文章

Linux 操作不求人系列 - 貳章之貳 - Shell Script 程式設計(II) - BASH 與 TCSH / CSH

     在上章,我們介紹很多bash shell指令的應用方式,並讓它們變成 script,在這章此節,我們要承襲上節,繼續討論 bash shell script 的其它程式設計概念,與讓程式可重複使用的方法,就是利用函式(function)。      首先,我們來創作一個判斷是否為閏年的函數,script的名稱就取為 check_year.sh ,請自行將其設為可執行。程式碼如圖2-6,為了解說方便,筆者利用指令 nl check_year.sh 將程式碼包含行數印出(圖2-7),其他除顏色外,都與圖2-6同。以下 export 宣告環境變數,自訂變數無需加宣告保留字。(2021.10.07更正export說明,以下自訂變數宣告請直接去除export開頭) (圖2-6) (圖2-7)        圖2-7第2-6行,與之前的範例相似,皆有防堵參數個數輸入錯誤的判斷。第7-11行為接著判斷輸入的年分,是否為真的正整數,也就是大於零的數字。其中第7行可解釋為,利用正規表示式搜尋 $2 字串值得頭至尾部的字元,皆由 0-9 組成,若有,則為真(True)會進入 if 內的陳述執行, 但我們想要的,應該是僅要字串其中一字元為非正整數,便進入if 內的警告並跳出 。故,筆者在判斷式前多加一個 ! ,代表著當字元完全是正整數時,就不要執行  if  內陳述,而直接往第12行執行,但若其中有一個字元為非正整數,則會進入 if 內印出錯誤訊息並跳出 Script 。在此例使用者輸入非正整數等字串(如:12ab、cde、1a1b),便會出現錯誤訊息"Error Value",並跳出 Script 。而第8行的判斷式,效果跟第7行相同,但只能在BASH 3.0才能支援,故筆者故意保留,讓讀者可以學到另一種表示方式。         第12-28行,為宣告一個函式 leapyr () ,在 BASH Script內若要使用含式,必須在使用之前先建立函式的功能,如函式建立在第12-28行,則若要呼叫使用(Call)函式,則必須在第29行之後才能呼叫,並且可重複呼叫。第13行為定義函式呼叫時,一定會有一個外部參數, 此外部參數非該 Script 的外部參數 ,而是由程式撰寫者給入,故在此無設定防呆判斷。第14-

Linux操作不求人- 肆章之壹 - 伺服器架設(I) - SSH(SFTP、SCP)、FTP伺服器與遠端連線

@ ssh, sftp      通常安裝好 CentOS6_x64 作業系統後,sshd, ssh daemon 的服務功能是預設開啟的,如筆者的前面篇章所述,預設的 iptables 防火牆設定,亦是開啟讓 ssh 的連線是可通過的,不僅可以連出,也可以被連入。若要確認是否有安裝 sshd 套件以及在啟動時的 runlevel 2 3 5 是否有被載入,可以使用以下指令搜尋: $   rpm  -qa  |   grep  openssh     #  ssh 與 sshd 連線服務皆由 openssh 應用軟體提供。 或使用以下 $   rpm  -qa  |   grep  ssh         #  比用關鍵字 openssh 搜尋更模糊,故符合的條件更多。      如圖4-1可以查詢到有關於 openssh-client 與 openssh-server 的套件, openssh-server 便是提供連入服務的軟體,openssh-client 為提供可以連出的工具。若無以上套件,則使用 yum install openssh ,則可下載安裝。 (圖4-1) 再接著輸入以下指令查詢到 sshd 這個服務,是否有再開機程序內載入,如圖4-2 $ chkconfig | grep ssh   # 查詢 sshd 是否有於 開機 runlevel 啟動 再利用以下指令,來查詢是否防火牆有允許連線 $ iptables  -L  |  grep ssh   # 出現如圖4-2 允許通過之條件 (圖4-2)      接下來,我們要先來調整 sshd 的設定檔,利用 vim  /etc/sshd/sshd_conf ,如圖4-3-1與4-3-2。因為設定檔參數很多,筆者為方便說明,將 /etc/sshd/sshd_conf 檔案內容分成兩張圖。 (圖4-3-1)

Linux操作不求人 - 伍章之陸 - Intel PXE 與利用 tftp + anaconda kickstart來自動部署系統

     現代的個人電腦與筆電爲了節能省碳,往往皆省略了光碟機的設置。雖然說 USB隨身碟亦可應用於安裝作業系統,但若遇到機房的大量機器需安裝之問題,亦不適合此種用光碟片或隨身碟逐臺安裝的方式,或是需準備多片光碟或隨身碟。故爲了大量安裝與部屬 Linux作業系統的機器,我們便可透過具有PXE功能之網路卡(https://en.wikipedia.org/wiki/Preboot_Execution_Environment),其所具備的網路開機的能力,來作透過網路方式來安裝與大量部署 CentOS Linux作業系統。其原理 wikipedia  的PXE說明,都解釋得很清楚,筆者不需要再 " 掉書包 ",在開發者大神面前班門弄斧,我們就直接來做做看。      首先,我們一樣透過 yum來安裝所需的 tftp伺服器軟體(http://www.jounin.net/tftpd32.html),利用PXE支援 tftp 透過 udp 埠號 69連線,來提供檔案的能力,給利用 PXE開機後安裝作業系統的機器,圖5-60   (圖5-60) 接著修改 tftp 設定檔 /etc/xinetd.d/tftp,如圖5-61,請記得 disable  要改為 no (圖5-61)      若要修改 server_args 參數為自訂的 tftp root 路徑,記得要變更 SELinux 的權限設定,如要改為/tftpboot,則使用指令 chcon  來調整,如以下: $ mkdir /tftpboot $ chcon  --reference /var/lib/tftpboot  /tftpboot 接著將 xinetd 與 tftp 加入開機啟動,並重啟動 xinetd,如下: $ chkconfig  --level  235  xinetd on $ chkconfig  --level  235  tftp  on $ service xinetd restart 開放防火牆通行 $ iptables -A INPUT -p udp --dport 69 -j ACCEPT $ service iptables re