post by tommy @ 28 十月, 2006 11:32
相同的程式, 在我家中的伺服器 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 的方式來處理會比較好一點.