2008年2月18日 星期一

syncpasswd

最近系計中assign了一個工作給我,就是負責把 每天自動sync nis的passwd到ldap上的script改進到也會一起sync gecos info。

這個工作很單純的,但是學長就是說用直接處理的方式會出現問題,所以一定有奇怪的問題存在,所以我就感到有點可怕了…

1. 最基本上想法,就是把nis上的gecos解出來,然後放到ldap的匯入格式 ldif,然後再叫 ldapmodify來吃就好了。
(如果事情有這麼單純,這樣真的就解決了)

2. 但是大家的gecos info都會亂塞資料,像是我的名字是繁體中文的,而ldap只吃utf-8的資料,所以就要先轉碼囉,用perl的話,就要用 Text::Iconv 這個東西了 :p 可是就算是改成utf-8,ldap一樣吃不進去,google告訴我,預設的ldap的nis.schema中的gecos這個欄位只吃IA5String,所以要改一下schema。

#attributetype ( 1.3.6.1.1.1.1.2 NAME 'gecos'
# DESC 'The GECOS field; the common name'
# EQUALITY caseIgnoreIA5Match
# SUBSTR caseIgnoreIA5SubstringsMatch
# SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

attributetype ( 1.3.6.1.1.1.1.2 NAME 'gecos'
DESC 'The GECOS field; the common name'
EQUALITY caseExactMatch
SUBSTR caseExactSubstringsMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )

這樣就可以在gecos中擺UTF-8字元了

3. 再來就是ldif裡面出現空白好像會出問題,所以要餵LDAP吃有空白的資料的話,那麼就得先把它轉成Base64,這個要用到 MIME::Base64

4. 就可以準備來玩匯入的功能了,不幸的是,有些人的匯入結果會顯示 Invalid format ...
看一下文字檔的內容,應該是因為gecos是沒有東西的關係… 那麼就是 gecos是空白的話,那就不要去replace gecos

5. 匯入還是出現錯誤,結果發現有些使用者不存在LDAP裡面,總管說把那些帳號建回來。(用MigrationTools)

6. 還是有錯誤,一樣是Invalid format,那麼就用暴力法,
# sudo ypcat master.passwd | grep uid
馬賽克:馬賽克:馬賽克:馬賽克::0:0:馬賽克,馬賽克,馬賽克 ,馬賽克,馬賽克:馬賽克:/bin/tcsh

有關個人隱私與安全部份全部被我馬賽克取代了… 看起來一切都好,那問題是出在哪邊呢?
換另外一個試試,這個gecos就比較長了,也讓我好奇是不是超過長度,但是我的gecos跟他的一樣長,我的就沒事哩!?不過我注意到一點,為什麼他的gecos會一半就斷掉了哩?
# sudo ypcat master.passwd | grep uid | cut -d":" -f 8 | hd
結果被我發現帳號的gecos裡面居然藏了一個 0x0A(換行字元),我想應該是這邊出問題吧 Orz

2008年2月17日 星期日

安裝mysql, php, apache2(非AppServer)

Abstract

分別到 www.mysql.com, www.php.net, www.apache.org 捉取最新(或最適合)版本的程式。 特別需要注意的是,PHP我們不捉msi版,而是要捉zip版,因為msi是精簡包,會缺相當多的工具; 不過也可以捉msi版來安裝,把zip版來當工具包。

p.s.

本文撰寫時,MySQL 5.0 的最新的版本為 MySQL 5.0.16,PHP 5則是 PHP 5.1.1

Step by Step

MySQL

除了step by step外,後面還會要求你Configure
MySQL 需要設定成Install As Windows Service
如果需要的話,可以勾選Include Bin Directory in Windows Path
一定要Modify Security Setting,去設定root@localhost的密碼

PHP

不是捉msi版的使用者把 php-5.1.1.zip解開丟到C:\PHP下面,
然後把C:\PHP\php.ini-dist複製一份到C:\Windows底下,然後記得把php.ini-dist改成php.ini,
打開php.ini,找到

extension_dir = "./"
感謝諺哥提醒:
應該要複製一份 c:\php\libmysql.dll到c:\program files\apache group\apache2\bin裡面,
這樣才能用php_mysql.dll, php_mysqli.dll
改成
extension_dir = "C:\PHP\ext"
還有
;extension=php_mysql.dll
;extension=php_mysqli.dll
去掉前面的分號

Apache

接下來,就用Step by Step 的方式把Apache裝起來。
打開
C:\Program Files\Apache Group\Apache2\conf\httpd.conf

#LoadModule ssl_module modules/mod_ssl.so
後面加入一行:
LoadModule php5_module /php/php5apache2.dll
找到
AddType application/x-gzip .gz .tgz
後面加入
AddType application/x-httpd-php .php .phtml
AddType application/x-httpd-php-source .phps
啟動MySQL, Apache2

OpenSSL

需要軟體
openssl

SSL 採用 X.509, 由上而下的金字塔憑證制度 ( Root CA -> CA -> Certificate )

建立RootCA的私鑰(Private Key) rootca.key

# mkdir -p /usr/local/etc/ssl
# /usr/local/etc/ssl
# cd /usr/local/etc/ssl
# openssl genrsa -des3 -out rootca.key 2048

Generating RSA private key, 2048 bit long modulus
..............................................................+++
.........+++
e is 65537 (0x10001)
Enter pass phrase for rootca.key:

要求輸入private key的密碼(repeat)


產生RootCA憑證申請書 rootca.csr


# openssl req -new -key rootca.key -out rootca.req
然後輸入RootCA的私鑰(private key)密碼
然後填資料
* 注意申請書的密碼跟憑證代辦公司的名稱按enter直接跳過

以root CA的身分簽發憑證

需要注意的是最高認證中心不可以太早過期, 因為如果最高認證中心的憑證過期的話, 其簽發的憑證也會失效,所以我們這邊設定成20年

# openssl x509 -req -days 7305 -sha1 -extfile /etc/ssl/openssl.cnf -extensions v3_ca -signkey rootca.key -in rootca.req -out rootca.crt

然後顯示一些資訊後 輸入rootca的私鑰密碼

ldap:

產生ldap server的private key(ldap.cs.nctu.edu.tw.key)


* 如果你為ldap server的私鑰加密碼的話, 每次啟動Server都要再輸入密碼

# openssl genrsa -out ldap.cs.nctu.edu.tw.key 2048
Generating RSA private key, 2048 bit long modulus
............................................................................+++
.............................................................................................+++
e is 65537 (0x10001)

產生ldap server的憑證申請書(ldap.cs.nctu.edu.tw.csr)

# openssl req -new -key ldap.cs.nctu.edu.tw.key -out ldap.cs.nctu.edu.tw.csr
* 輸入資料, 這邊很重要的是Common Name必須設定成 ldap server的FQDN相同, 不同的話會不能用
* 注意申請書的密碼跟憑證代辦公司的名稱按enter直接跳過



最高認證中心(RootCA,自己)發給ldap server憑證(ldap.cs.nctu.edu.tw.crt)

* 此例發給十年的憑證

# openssl x509 -req -days 3650 -sha1 -extfile /etc/ssl/openssl.cnf -extensions v3_req -CA rootca.crt - CAkey rootca.key -CAserial rootca.srl -CAcreateserial -in ldap.cs.nctu.edu.tw.csr -out ldap.cs.nctu.edu.tw.crt

然後顯示一些資訊,再輸入rootca的私鑰密碼。

完成

這樣就完成最高憑證中心與伺服器的認證了,大概看一下檔名與檔案身份的對應

rootca.key (最高憑證中心的私鑰)
rootca.csq (最高憑證中心的憑證申請書)
rootca.crt (最高憑證中心的憑證)

ldap.cs.nctu.edu.tw.key
ldap.cs.nctu.edu.tw.csq
ldap.cs.nctu.edu.tw.crt

Squid安裝

Introduction

效能決定在於:硬碟大小、使用人數、記憶體快取大小。

Proxy可分為硬體式、與軟體式。

Installation (fedora core 1)

1. 取得squid之rpm安裝檔

2. 以rpm –ivh squid-2.5.STABLE1-2.i386.rpm 安裝

3. 設定Squid

甲、 打開/etc/squid/squid.conf

乙、 找到cache_mem 的部份,把cache_men修改為電腦記憶體之三分之一(據說這是最佳值)

丙、 找到cache_dir的部份,將之設定到你要儲存的位罝,並將內容

cache_dir ufs /var/spool/squid 1000 16 256

ufs:代表儲存格式。尚有aufs diskd可供使用

1000:代表快取容量(M)。

16為第一層的資料夾數。256為第二層的資料夾數。

丁、 找到http_access的部份,http_access 設定允許、禁止哪些網域被存取

acl 的設定方式。

acl <列表名稱> <210.240.180.0/24>

http_access <列表名稱>

squid是循序處理規則的,規則的設定應該是由小到大的。

戊、 找到visible_hostname的部份,將之設定為全域名稱

4. 啟動測試 鍵入/etc/init.d/squid start 或是 service squid start都可以

5. 鍵入ntsysv 將squid 設為開機自動啟動。


Installation (gentoo)

1.
# emerge squid
2. 設定Squid

甲、 打開/etc/squid/squid.conf

乙、 找到cache_mem 的部份,把cache_men修改為512M (要是你有1G的記憶體的話)

丙、 找到cache_dir的部份,將之設定到你要儲存的位罝,並將內容

# vi /etc/squid/squid.conf
cache_mem 512M
cache_dir ufs /var/spool/squid 1000 16 256
ufs:代表儲存格式。尚有aufs diskd可供使用

1000:代表快取容量(M)。

16為第一層的資料夾數。256為第二層的資料夾數。

丁、 找到http_access的部份,http_access 設定允許、禁止哪些網域被存取

acl 的設定方式。

acl <列表名稱> <210.240.180.0/24>

for example:
acl dorm src 140.113.252.0/24
acl yahoo dst tw.yahoo.com.tw
acl bid dst tw.bid.yahoo.com.tw
http_access <列表名稱>

for example:
http_access allow dorm
http_access deny bid
http_access allow yahoo
squid是循序處理規則的,規則的設定應該是由小到大的。

戊、 找到visible_hostname的部份,將之設定為全域名稱

例如

visible_hostname proxy.cs.nctu.edu.tw

4. 啟動
# /etc/init.d/squid start
5. 設為開機自動啟動
# rc-update add squid default