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操作不求人 - 伍章之伍 - make 巨集式編譯器

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

Linux操作不求人 - 肆章之貳 - 伺服器架設(II) - 郵件伺服器 - postfix 與 dovecot