autofs 無法自動掛載目錄

學校 Server 之間的備份都是利用 NFS 搭配 autofs 服務,再使用 cron 及備份的 Script 來做備份,重新安裝 Server後,發現 autofs 無法自動掛載 NFS 目錄,所以備份無法成功。
後來發現應該也是 SELinux 所造成的問題
# ls -lZ /etc/auto.*
-rw-r–r–. root root unconfined_u:object_r:admin_home_t:s0 /etc/auto.bs
-rw-r–r–. root root system_u:object_r:etc_t:s0       /etc/auto.master
-rw-r–r–. root root system_u:object_r:etc_t:s0       /etc/auto.misc
-rwxr-xr-x. root root system_u:object_r:etc_t:s0       /etc/auto.net*
-rwxr-xr-x. root root system_u:object_r:etc_t:s0       /etc/auto.smb*

auto.bs 是我從備份的設定檔複製過去的,所以權限不同[@more@]解決方式:
1. 關閉 SELinux,感覺 SELinux 有點像是 Windows 上的 使用者帳戶控制(UAC),強調會比較安全,但卻造成使用者操作上的不便。不過在這裡並不關閉 SELinux,而是改用第二種方法。
2. 更改權限
# chcon -u system_u -t etc_t /etc/auto.bs

再檢查一下權限
# ls -lZ /etc/auto.*
-rw-r–r–. root root system_u:object_r:etc_t:s0       /etc/auto.bs
-rw-r–r–. root root system_u:object_r:etc_t:s0       /etc/auto.master
-rw-r–r–. root root system_u:object_r:etc_t:s0       /etc/auto.misc
-rwxr-xr-x. root root system_u:object_r:etc_t:s0       /etc/auto.net*
-rwxr-xr-x. root root system_u:object_r:etc_t:s0       /etc/auto.smb*

重新啟動 autofs 服務
# /etc/init.d/autofs restart
正在停止 automount:                                       [  確定  ]
正在啟動 automount:                                       [  確定  ]

這時候就正常了!

後記:
關於 SELinux 所造成的困擾,最簡單的解決方式,就是不要直接從別的目錄複製舊的設定檔來想要直接覆蓋,而是先編輯新的設定檔,再把舊資料讀入,就會沒有問題了!
以 Apache Web Server 為例
# cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.$(date +%F)
# vim /etc/httpd/conf/httpd.conf
:r /root/bak/httpd.conf

# chcon -u system_u -t httpd_config_t /etc/httpd/httpd.conf*

Windows XP & Office 2003 支援日期已破百

Windows XP 從 2001 年 8 月 24 日發表至今已超過 12 個年頭,Office 2003 則是在 2003 年 9 月 17 日推出,至今也超過了 10 年,真是一段漫長的時間。。
以上資料來自 維基百科:Windows XP / Office 2003
微軟之前已經宣布,將在 2014 年 4 月 8 日停止對 Windows XP 和 Office 2003 的支援,剩下的時間已經不到 100 天了。

squid Proxy Server & SELinux

重新安裝了之前硬碟故障的 Proxy Server,系統安裝完後,複製之前備份的設定檔後,重新啟動 Proxy Server 後,發現無法啟動 Proxy Server
# service squid start
正在啟動 squid:                                           [失敗]
2013/12/27 13:59:21| Processing Configuration File: /etc/squid/squid.conf (depth 0)
FATAL: Unable to open configuration file: /etc/squid/squid.conf: (13) Permission denied
Squid Cache (Version 3.1.10): Terminated abnormally.
CPU Usage: 0.009 seconds = 0.005 user + 0.004 sys
Maximum Resident Size: 22736 KB
Page faults with physical i/o: 0[@more@]檢查 /etc/squid/squid.conf 的檔案權限
# ls -l /etc/squid/squid.conf*
-rw-r—–. 1 root root 4399 2013-11-19 00:48 /etc/squid/squid.conf
-rw-r—–. 1 root squid 2510 2013-10-01 21:44 /etc/squid/squid.conf.bak

所屬群組似不同
# chown root:squid /etc/squid/squid.conf
# ls -l /etc/squid/squid.conf*
-rw-r—–. 1 root squid 4399 2013-11-19 00:48 /etc/squid/squid.conf
-rw-r—–. 1 root squid 2510 2013-10-01 21:44 /etc/squid/squid.conf.bak

但還是無法啟動
# service squid start
正在啟動 squid:                                           [失敗]
2013/12/27 13:59:21| Processing Configuration File: /etc/squid/squid.conf (depth 0)
FATAL: Unable to open configuration file: /etc/squid/squid.conf: (13) Permission denied
Squid Cache (Version 3.1.10): Terminated abnormally.
CPU Usage: 0.009 seconds = 0.005 user + 0.004 sys
Maximum Resident Size: 22736 KB
Page faults with physical i/o: 0

後來發現可能是 SELinux 的問題,權限不對
ls -lZ /etc/squid/squid.conf*
-rw-r—–. root squid unconfined_u:object_r:admin_home_t:s0 /etc/squid/squid.conf
-rw-r—–. root squid system_u:object_r:squid_cache_t:s0 /etc/squid/squid.conf.bak

更改成正確的屬性
# chcon -R -u system_u -t squid_conf_t /etc/squid/squid.conf

再次檢查屬性
# ls -lZ /etc/squid/squid.conf*
-rw-r—–. root squid system_u:object_r:squid_conf_t:s0 /etc/squid/squid.conf
-rw-r—–. root squid system_u:object_r:squid_conf_t:s0 /etc/squid/squid.conf.bak

原本 Squid Proxy Server Cache 目錄權限
ls -lZ /cache1/* | head
/cache1/00:
drwxr-x—. squid squid system_u:object_r:default_t:s0   00/
drwxr-x—. squid squid system_u:object_r:default_t:s0   01/
drwxr-x—. squid squid system_u:object_r:default_t:s0   02/
drwxr-x—. squid squid system_u:object_r:default_t:s0   03/
drwxr-x—. squid squid system_u:object_r:default_t:s0   04/
drwxr-x—. squid squid system_u:object_r:default_t:s0   05/
drwxr-x—. squid squid system_u:object_r:default_t:s0   06/
drwxr-x—. squid squid system_u:object_r:default_t:s0   07/
drwxr-x—. squid squid system_u:object_r:default_t:s0   08/

更改成正確的屬性
# chcon -R -u system_u -t squid_cache_t /cache1

再次檢查屬性
ls -lZ /cache1/* | head
/cache1/00:
drwxr-x—. squid squid system_u:object_r:squid_cache_t:s0 00/
drwxr-x—. squid squid system_u:object_r:squid_cache_t:s0 01/
drwxr-x—. squid squid system_u:object_r:squid_cache_t:s0 02/
drwxr-x—. squid squid system_u:object_r:squid_cache_t:s0 03/
drwxr-x—. squid squid system_u:object_r:squid_cache_t:s0 04/
drwxr-x—. squid squid system_u:object_r:squid_cache_t:s0 05/
drwxr-x—. squid squid system_u:object_r:squid_cache_t:s0 06/
drwxr-x—. squid squid system_u:object_r:squid_cache_t:s0 07/
drwxr-x—. squid squid system_u:object_r:squid_cache_t:s0 08/

就可以正常啟動 Proxy Server 了!
# service squid start
正在啟動 squid:.                                          [  確定  ]

 

WaterFox 26.0.0 版

WaterFox 是另外一套 64 位元的 Firefox,它的特色就是強調它的執行速度很快,可以嫓美 Google Chrome。

Waterfox 官方網站: https://www.waterfoxproject.org/
WaterFox 26.0.0 安裝版及免安裝版下載網頁: https://www.waterfoxproject.org/download.php
WaterFox 正體中文語系:ftp://ftp.mozilla.org/pub/mozilla.org/firefox/releases/26.0/win32/xpi/zh-TW.xpi

中文化的方式和 CyberFox 一樣,就不另外說明,請參考 Cyberfox 64 位元 Firefox

不過有一點比較麻煩的是,WaterFox 和原本的 Firefox 不能同時開啟,所以只能二選一了!

大批產生學生帳號的 LDIF 格式檔

每學年初都會由校務行政系統由擷取新的學生資料,並搭配亂數密碼,使用 awk 來大批產生學生帳號,在建立學生帳號時,可以建立硬碟容量限制 Quota、建立 Samba 密碼、建立學生個人網頁、設定帳號使用期限、初始化個人目錄設定…….等等,一些瑣碎的事都可以一個步驟完成。
在處理 Open LDAP Server 時,也想要利用這樣的方式來處理這個部份,稍微試了一下,看起來應該是沒有太大的問題。
底下是實驗的學生資料,以 csv 格式,每個學生一列資料,以空格當做欄位間隔
欄位分別是 班級 座號 姓名 帳號 密碼 群組
# head -2 102_class41.lst
四忠 01 蔡中火 s0990499 123456 s0990
四忠 02 陳大水 s0990999 234567 s0990[@more@]建立 LDAP 密碼檔
# vim mkldifpw.awk
# 產生密碼
{print “slappasswd -s “$5 }

測試
# awk -f mkldifpw.awk 102_class41.lst | sh
{SSHA}CmIwt8puhug01FSBsdqVSpQgMkkuuQWv
{SSHA}9sgDt6+WDZG4y9nZasVL5jRgpbkMq3AU

輸出成密碼檔
# awk -f mkldifpw.awk 102_class41.lst | sh > /root/102_class41_ldifpw.lst

把 102_class41.lst 和 102_class41_ldifpw.lst 組合起來
# paste -d ” ” 102_class41.lst 102_class41_ldifpw.lst > 102_class41_ldap.lst
四忠 01 蔡中火 s0990499 123456 s0990 {SSHA}xecUVfAyOlao7udDzLccUvf4fHOonjzN
四忠 02 陳大水 s0990999 234567 s0990  {SSHA}WqVy40LfOfoRV1KBwlJFPpfGNgnkIbtr

建立產生 ldif 的 awk 檔
# vim mkldif.awk
# 帳號密碼檔格式
四忠 01 蔡中火 s0990499 123456 s0990 {SSHA}xecUVfAyOlao7udDzLccUvf4fHOonjzN

{print “dn: uid=”$4″,ou=”$6″,ou=Student,dc=ldap,dc=tces.ilc.edu.tw” }
{print “uid: “$4 }
{print “cn: “$1$2$3 }
{print “sn: “$1$2$3 }
{print “mail: “$4″@tces.ilc.edu.tw” }
{print “objectClass: person” }
{print “objectClass: organizationalPerson” }
{print “objectClass: inetOrgPerson” }
{print “objectClass: posixAccount” }
{print “objectClass: top” }
{print “userPassword: “$7 }
{print “loginShell: /sbin/nologin” }
{print “uidNumber: 500” }
{print “gidNumber: 500” }
{print “homeDirectory: /home/”$6″/”$4 }
{print “gecos: “$1$2$3 }
{print “” }

測試一下
# awk -f mkldif.awk 102_class41_ldap.lst
dn: uid=s0990499,ou=s0990,ou=Student,dc=ldap,dc=tces.ilc.edu.tw
uid: s0990499
cn: 四忠01蔡中火
sn: 四忠01蔡中火
mail: s0990499@tces.ilc.edu.tw
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
userPassword: {SSHA}xecUVfAyOlao7udDzLccUvf4fHOonjzN
loginShell: /sbin/nologin
uidNumber: 500
gidNumber: 500
homeDirectory: /home/s0990/s0990499
gecos: 四忠01蔡中火

dn: uid=s0990999,ou=s0990,ou=Student,dc=ldap,dc=tces.ilc.edu.tw
uid: s0990999
cn: 四忠02陳大水
sn: 四忠02陳大水
mail: s0990999@tces.ilc.edu.tw
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
userPassword: {SSHA}WqVy40LfOfoRV1KBwlJFPpfGNgnkIbtr
loginShell: /sbin/nologin
uidNumber: 500
gidNumber: 500
homeDirectory: /home/s0990/s0990999
gecos: 四忠02陳大水

最後可能比較麻煩的是 uidNumber 的部份,因為 uidNumber 是建立帳號時,系統依帳號的使用而自動編號產生的,當然也可以在建立學生帳號時,直接指定使用者的 uidNumber
# useradd
-u, –uid UID                 user ID of the new account

Apache 伺服器使用 LDAP 認證

Apache 網頁除了可以使用 .htaccess 和 MySQL 的認證外,也可以使用 LDAP Server 來做使用者的認證。

1. 安裝所需的套件
# yum install mod_authz_ldap php-ldap

2. 建立測試目錄及檔案
# mkid /var/www/html/testldap
# echo “Test LDAP” > /var/www/html/testldap/index.html
[@more@]3. 修改設定檔
# vim /etc/httpd/conf.d/authz_ldap.conf
LoadModule authz_ldap_module modules/mod_authz_ldap.so

<IfModule mod_authz_ldap.c>

<Directory “/var/www/html/testldap”>
      AuthzLDAPMethod ldap
      # 192.168.154.167 為 LDAP Server IP
      AuthzLDAPServer 192.168.154.167
      AuthzLDAPUserBase ou=Teacher,dc=ldap,dc=tces.ilc.edu.tw
      AuthzLDAPUserKey uid
      AuthzLDAPUserScope base
#
      AuthType Basic
      AuthName “Test LDAP”
      require valid-user
#
</Directory>

4. 重新啟動 Apache Web Server
# service httpd restart

5. 進行測試

輸入正確的帳號及密碼,就可以看到測試的網頁

OpenLDAP Server 的備份與還原

將整個 OpenLDAP 資料庫匯出:
# /usr/sbin/slapcat -b “dc=ldap,dc=tces.ilc.edu.tw” -l /root/ldap_backup_`date +%F`.ldif

將備份資料檔案匯入:
# /usr/sbin/slapadd -l /root/ldap_backup_2013-12-27.ldif

要注意檔案屬性與擁有者的問題:
# chown -R ldap.ldap /var/lib/ldap

也可以直接備份 /var/lib/ldap 整個目錄
# tar cvJf /root/ldap_backup_`date +%F`.tar.xz /var/lib/ldap

LDAP Client

JXplorer – A Java Ldap Browser
JXplorer 是一個 base on Java 的 LDAP Browser,支援多種平台 Windows / Linux / …..
JXplorer 官方網站:http://jxplorer.org/
[@more@]GQ LDAP client
官方網站:http://sourceforge.net/projects/gqclient/
圖取自 http://ict.udlap.mx/people/carlos/is346/admon05_ldap.html

LDAP Explorer Tool
官方網站:http://sourceforge.net/projects/ldaptool/?source=recommended

Luma – LDAP browser and administration utility
官方網站:http://sourceforge.net/projects/luma/?source=recommended
                    http://luma.sourceforge.net/

Windows 平台版本需要先安裝 Python 才可以正常執行
下面的圖取自官方網站:http://luma.sourceforge.net/screenshots.html

LDAP Browser/Editor 是一套 base on Java 的 LDAP Browser/Editor
下載網站:https://www.netiq.com/communities/cool-solutions/cool_tools/gawors-excellent-ldap-browsereditor-v282/
下圖取自 Opends: Wiki: 2_4_LDAPBrowserEditor — Project Kenai

Softerra LDAP Browser 是一套免費 base on Windows 使用的 LDAP Browser
官方網站:http://www.ldapadministrator.com/
下載網站:http://www.ldapadministrator.com/download.htm
LDAP Browser 4.5 是免費的,而 LDAP Administrator 2013.2 是要收費的

將 ldapsearch 輸出內容 (LDIF) 轉 UTF-8 編碼

雖然在 ldapadd 匯入 LDIF 格式檔時,已經將檔案內容轉換 UTF-8 格式,可常匯入了,但是在 ldapsearch 搜尋資料時,看到的卻是亂碼
cn 的部分應該是正常的中文字,但現在顯示的卻是亂碼
# /usr/bin/ldapsearch -x -b “ou=Teacher,dc=ldap,dc=tces.ilc.edu.tw” uid=*
# extended LDIF
#
# LDAPv3
# base <ou=Teacher,dc=ldap,dc=tces.ilc.edu.tw> with scope subtree
# filter: uid=*
# requesting: ALL
#

# t850008, Teacher, ldap.tces.ilc.edu.tw
dn: uid=t850008,ou=Teacher,dc=ldap,dc=tces.ilc.edu.tw
uid: t850008
cn:: 5p6X5pit5ZCN
objectClass: account
objectClass: posixAccount
objectClass: top
userPassword:: e2
loginShell: /bin/bash
uidNumber: 953
gidNumber: 500
homeDirectory: /home/t850008

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1 [@more@]底下的內容參考 PHP 程式: ldapsearch 輸出內容 (LDIF) 轉 UTF-8 編碼 « Jamyy’s Weblog
# 建立 php 的轉換檔
# vim /root/utf8ldif.php

<?php

function fn_output($str) {
if (strpos($str,":: ") > 0) {
//解 Base64 編碼
//當 ldap 欄位名稱後面接的是兩個冒號即表示該欄位內容為 Base64 編碼
$head = substr($str,0,strpos($str," ")-1);
$body = substr($str,strpos($str," ")+1);
$str = $head . " " . base64_decode($body) . "n";
} else if (preg_match('/x5c[A-F0-9][A-F0-9]x5c[A-F0-9][A-F0-9]/',$str)) {
//解 URL 編碼
//URL 編碼出現在註解 (#), ldapsearch -LLL 可取消輸出註解內容
$str = urldecode(str_replace("","%",$str));
}
if (!preg_match('/n$/',$str)) {
//如果處理過後的字串沒有換行符號 (n) 就塞一個給他
$str .= "n";
}
return($str);
}

$line_old = "";
$line_merge = "";
$params = count($argv);
if ($params == 1) {
//未給參數時, 開啟 STDIN 串流
$f = fopen("php://stdin","r");
} else {
//開啟指定檔案
$f = fopen("$argv[1]","r");
}
while (!feof($f)) {
$line = fgets($f);
if (substr($line,0,1) == " ") {
//若該行行首為空白字元, 表示因內容過長而斷行
//以 line_merge 變數合併各段落
if ($line_merge == "") {
$line_merge = trim($line_old) . trim($line);
} else {
$line_merge .= trim($line);
}
} else if ($line_merge > "") {
//輸出合併好的內容
echo fn_output($line_merge);
$line_merge = "";
} else {
//輸出一般內容
echo fn_output($line_old);
}
$line_old = $line;
}
fclose($f);
?>

使用方式
# /usr/bin/ldapsearch -x -b “ou=Teacher,dc=ldap,dc=tces.ilc.edu.tw” uid=* | php /root/utf8ldif.php

# extended LDIF
#
# LDAPv3
# base <ou=Teacher,dc=ldap,dc=tces.ilc.edu.tw> with scope subtree
# filter: uid=*
# requesting: ALL
#

# t850008, Teacher, ldap.tces.ilc.edu.tw
dn: uid=t850008,ou=Teacher,dc=ldap,dc=tces.ilc.edu.tw
uid: t850008
cn: 林昭名
objectClass: account
objectClass: posixAccount
objectClass: top
userPassword:: e2
loginShell: /bin/bash
uidNumber: 953
gidNumber: 500
homeDirectory: /home/t850008

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries:

中文字的部分就可以正常顯示了!

在 CentOS 6.x 上安裝 phpLDAPAdmin

phpLDAPAdmin 是一套以網頁介面來管理 LDAP Server 的 PHP 程式,功能和 phpMyAdmin 類似。
phpLDAPAdmin 官方網站:http://phpldapadmin.sourceforge.net/wiki/index.php/Main_Page

安裝方式:
1. 增加 EPEL 套件庫
# wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# rpm -ivh epel-release-6-8.noarch.rpm

2. 更新套件庫
# yum update[@more@]3. 搜尋 phpLDAPAdmin 套件
# yum search phpLDAPAdmin
phpldapadmin.noarch : Web-based tool for managing LDAP servers

4. 進行安裝
# yum install phpLDAPAdmin

5. 限定可以連線的 IP 網頁
# vim /etc/httpd/conf.d/phpldapadmin.conf
<Directory /usr/share/phpldapadmin/htdocs>
  Order Deny,Allow
    Deny from all
    Allow from 127.0.0.1 192.168.1.0/24
    Allow from ::1
</Directory>

6. 重新啟動 Web Server
# service httpd restart

7. 進行連線