Tommy 碎碎念

Tommy Wu's blog

« 上一篇 | 下一篇 »

限制 pure-ftpd 可以登入的使用者
post by tommy @ 28 十月, 2006 11:32
正常來說, 如果使用 PAM 來管理, 我們可以使用 pam_listfile.so 來控制那些帳號可以使用 ftp, 而那些帳號不可以使用 ftp. 不過, 上星期我試著把我們部門內的開發用的測試主機上頭的 ftpd 由 vsftpd 改成 pure-ftpd 之後, 卻發現我們用來認證的 PAM -> LDAP 方式, 在 pure-ftpd 上頭都會失敗, 在 pure-ftpd 上頭, 只能使用 unix 的認證方式 (不過還是透過 LDAP).

相同的程式, 在我家中的伺服器 Debian Etch, 使用 PAM 並沒有問題. 不過公司用的 CentOS 4 上頭, 使用 PAM => LDAP 在之前其他的服務上頭也沒有問題. 唯獨在 pure-ftpd 有問題. 有試著看過 pure-ftpd 的程式, 並沒有發現有任何可疑的地方. 就是在呼叫 PAM 的函式時, 會失敗, 看了一下失敗的錯誤碼 4 (PAM_SYSTEM_ERR), 在 PAM 的文件上只有說明是 System error. 之後就沒有任何描述了. 我也看不出來是那兒有問題. 因為相同的程式碼, 在其他的服務上頭, 都不會有這個錯誤. (而且... 相同的 pure-ftpd 程式碼, 在我家中是可以用的)

最後, 就放棄使用 PAM 來處理 pure-ftpd 的認證了. 因此, 原本我們使用 pam_listfile.so 來管制使用者的作法, 就不能使用了. 所以,  就改了一下 pure-ftpd 的程式, 在登入時檢查 /etc/pure-ftpd/pure-ftpd.userlist 這個檔案的內容, 使用者帳號有在裡頭的才允許登入.

這個修正如下:

--- ./src/log_unix.c.orig	2006-10-20 16:03:22.000000000 +0800
+++ ./src/log_unix.c 2006-10-20 16:09:05.000000000 +0800
@@ -27,6 +27,33 @@
}
pw = *pw_;
result->auth_ok--;
+// twu2, add check for user list
+{
+ FILE *fp;
+
+ fp = fopen("/etc/pure-ftpd/pure-ftpd.userlist", "rt");
+ if (fp != NULL) {
+ int found;
+ char buf[1024];
+ char *p;
+
+ found = 0;
+ while (!feof(fp)) {
+ if (fgets(buf, 1024, fp) == NULL) break;
+ p = strtok(buf, " \t\r\n");
+ if (p == NULL) continue;
+ if (*p == '#' || *p == ';') continue;
+ if (strcmp(p, account) == 0) {
+ found = 1;
+ break;
+ }
+ }
+ fclose(fp);
+ if (found == 0)
+ return;
+ }
+}
+// twu2 end
#ifdef HAVE_SETUSERSHELL
if (pw.pw_shell == NULL) {
return;

patch 可以在這兒抓取: http://www.teatime.com.tw/~tommy/mypatch/pureftpd_userlist.patch 

再說一次, 這個 patch 基本上應該不需要用到, 如果你的 PAM 使用上頭沒有問題的話, 直接使用 pam_listfile.so 的方式來處理會比較好一點.

Del.icio.us Furl HEMiDEMi Technorati MyShare
迴響
暱稱:
標題:
個人網頁:
電子郵件:
迴響

  

Bad Behavior 已經阻擋了 123 個過去 7 天試圖闖關的垃圾迴響與引用。
Power by LifeType. Template design by JamesHuang. Valid XHTML and CSS