歡迎您光臨本站 註冊首頁

vsftpd+pam+mysql出錯,虛擬用戶無法登錄

←手機掃碼閱讀     火星人 @ 2014-03-04 , reply:0

vsftpd+pam+mysql出錯,虛擬用戶無法登錄

vsftpd+pam+mysql出錯,虛擬用戶無法登錄

這幾天我似乎碰到一個棘手的問題,
我做一個FTP,用的系統是centos4.4
按照vsftpd+pam+mysql來做,但是一直在pam這裡卡住了,很生鬱悶*_*
參照手冊:

vsftpd虛擬用戶的配置(mysql)

1. 創建guest用戶

VSFTPD採用PAM方式驗證虛擬用戶。由於虛擬用戶的用戶名/口令被單獨保存,因此在驗證時,VSFTPD需要用一個系統用戶的身份來讀取資料庫文件或資料庫伺服器以完成驗證,這就是VSFTPD的guest用戶。這正如同匿名用戶也需要有一個系統用戶ftp一樣。當然,我們也可以把guest用戶看成是虛擬用戶在系統中的代表。下面在系統中添加vsguest用戶,作為VSFTPD的guest。

# useradd vsguest -d /var/ftp

當虛擬用戶登錄后,所在的位置為vsguest的自家目錄/var/ftp 。

2. 設置VSFTPD配置文件

在/etc/vsftpd.conf文件中,加入以下選項:
guest_enable=YES

guest_username=vsguest

然後執行以下命令,讓VSFTPD在後台運行:

# /usr/local/sbin/vsftpd &

3. 將虛擬用戶保存在MySQL資料庫伺服器中

我們建立資料庫vsdb,表users,欄位name和passwd用於保存虛擬用戶的用戶名和口令,同時增加兩個虛擬用戶ruize和guojia。

# mysql -p

mysql>create database vsdb;

mysql>use vsdb;

mysql>create table users(name char(16) binary,passwd char(16));

mysql>insert into users (name,passwd) values ('ruize',password('go'));

mysql>insert into users (name,passwd) values ('guojia',password('go'));

mysql>quit

然後,授權vsguest可以讀vsdb資料庫的users表。執行以下命令:

# mysql -u root mysql -p

mysql>grant select on vsdb.users to vsguest@localhost identified by 'vsguest';

mysql>quit

如果要驗證剛才的操作是否成功可以執行下面命令:

#mysql -u vsguest -pvsguest vsdb

mysql>select * from users;

如果成功,將會列出ruize、guojia和加密后的密碼

4. 設置MySQL的PAM驗證

這裡我們要用到一個利用mysql進行pam驗證的開源項目(http://sourceforge.net/projects/pam-mysql/)。首先從網站下載它的程序包pam_myql-0.5.tar.gz,複製到/root目錄中。在編譯安裝之前,要確保mysql- devel的RPM包已經安裝在你的機器上,如果沒有請從RHL安裝光碟中安裝該包。然後,執行以下命令:

#tar xvzf pam_mysql-0.5.tar.gz

#cd pam_mysql

#make

#make install

注意:make install這一步可能會出現錯誤,那隻好手動將該目錄下生成的pam_mysql.o複製到/lib/security目錄下。

接下來,我們要設置vsftpd的PAM驗證文件。打開/etc/pam.d/ftp文件,加入以下內容:

auth required pam_mysql.so user=vsguest passwd=vsguest host=localhost db=vsdb table=users usercolumn=name passwdcolumn=passwd crypt=2

account required pam_mysql.so user=vsguest passwd=vsguest host=localhost db=vsdb table=users usercolumn=name passwdcolumn=passwd crypt=2

上面涉及到的參數,只要對應前面資料庫的設置就可以明白它們的含義。這裡需要說明的是crypt參數。crypt表示口令欄位中口令的加密方式:crypt=0,口令以明文方式(不加密)保存在資料庫中;crypt=1,口令使用UNIX系統的DES加密方式加密后保存在資料庫中;crypt=2,口令經過MySQL的 password()函數加密后保存。

經過以上的步驟,虛擬用戶就可以正常使用了。

5. 進一步的虛擬用戶設置

這裡介紹進一步的虛擬用戶設置。首先,介紹虛擬用戶的許可權設置。

VSFTPD-1.2.0新添了virtual_use_local_privs參數,當該參數激活(YES)時,虛擬用戶使用與本地用戶相同的許可權。當此參數關閉(NO)時,虛擬用戶使用與匿名用戶相同的許可權,這也就是VSFTPD-1.2.0之前版本對虛擬用戶許可權的處理方法。這兩種做法相比,後者更加嚴格一些,特別是在有寫訪問的情形下。默認情況下此參數是關閉的(NO)。

當virtual_use_local_privs=YES時,只需設置write_enable=YES,虛擬用戶就可以就擁有寫許可權。而virtual_use_local_privs=NO時,對虛擬用戶許可權的設置就更嚴格一些。

控制虛擬用戶瀏覽目錄:如果讓用戶不能瀏覽目錄,但仍可以對文件操作,那麼需要執行以下二個步驟:一,配置文件中,anon_world_readable_only=YES。二,虛擬用戶目錄的許可權改為只能由vsguest操作:

# chown vsguest.vsguest /var/ftp

# chmod 700 /var/ftp

允許虛擬用戶上傳文件:

write_enable=YES

anon_upload_enable=YES

允許虛擬用戶修改文件名和刪除文件:

anon_other_write_enable=YES

由於以上選項的設置同樣會對匿名用戶生效。如果不想匿名用戶趁機擁有同樣的許可權,最好是禁止匿名用戶登錄。

其次,由於虛擬用戶在系統中是vsguest身份,所以可以訪問到系統的其他目錄。為了更加安全,我們可以將虛擬用戶限制在自家目錄下。有兩種做法:一,在配置文件中增加以下選項

chroot_local_user=NO

chroot_list_enable=YES

chroot_list_file=/etc/vsftpd.chroot_list

然後,在/etc/vsftpd.chroot_list文件中加入虛擬用戶名ruize和guojia。

第二種做法,在配置文件中修改chroot_local_user=YES。

經過修改後,虛擬用戶登錄后其根目錄就限制在/var/ftp下,無法訪問其他目錄。

 ............

  登錄后還是登錄不了,鬱悶啊,把錯誤發給朋友們:

1.主配置文件,盡量最小化了,還是不行:
#standalone mode
listen=YES
listen_address=59.70.*.*
#host control
tcp_wrappers=YES
anon_other_write_enable=NO
# Access rights
anonymous_enable=YES
local_enable=YES
chroot_local_user=YES
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES

# Security
anon_world_readable_only=NO
connect_from_port_20=YES
hide_ids=YES

#log
xferlog_enable=YES
xferlog_file=/var/log/vsftpd.log

# Performance
one_process_model=NO
ftpd_banner=welcome to my ftpserver !

#virtual_user
virtual_use_local_privs=YES
write_enable=YES
guest_enable=YES
guest_username=vsgu
pam_service_name=ftp

2.接下來是我的pam_mysql.so里的配置

auth required pam_mysql.so user=vsguest passwd=vsguest host=localhost db=vsdb table=users usercolumn=name passwdcolumn=passwd crypt=2

account required pam_mysql.so user=vsguest passwd=vsguest host=localhost db=vsdb table=users usercolumn=name passwdcolumn=passwd crypt=2

和上面的一樣

3.錯誤顯示:

# ftp 59.70.*.*
Connected to 59.70.*.*.
220 welcome to my ftpserver !
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (59.70.157.112:root): gcj
331 Please specify the password.
Password:
*** glibc detected *** free(): invalid next size (fast): 0x09761b08 ***
Login failed.
421 Service not available, remote server has closed connection

4系統日誌

# tail -n 20 /var/log/messages
Aug 14 11:39:20 localhost vsftpd: crypt changed.
Aug 14 11:39:20 localhost vsftpd: db_connect  called.
Aug 14 11:39:20 localhost vsftpd: returning 0 .
Aug 14 11:39:20 localhost vsftpd: db_checkpasswd called.
Aug 14 11:39:20 localhost vsftpd: pam_mysql: where clause =
Aug 14 11:39:20 localhost vsftpd: SELECT passwd FROM users WHERE name='gcj'
Aug 14 11:39:25 localhost vsftpd: pam_sm_authenticate called.
Aug 14 11:39:25 localhost vsftpd: dbuser changed.
Aug 14 11:39:25 localhost vsftpd: dbpasswd changed.
Aug 14 11:39:25 localhost vsftpd: host changed.
Aug 14 11:39:25 localhost vsftpd: database changed.
Aug 14 11:39:25 localhost vsftpd: table changed.
Aug 14 11:39:25 localhost vsftpd: usercolumn changed.
Aug 14 11:39:25 localhost vsftpd: passwdcolumn changed.
Aug 14 11:39:25 localhost vsftpd: crypt changed.
Aug 14 11:39:25 localhost vsftpd: db_connect  called.
Aug 14 11:39:25 localhost vsftpd: returning 0 .
Aug 14 11:39:25 localhost vsftpd: db_checkpasswd called.
Aug 14 11:39:25 localhost vsftpd: pam_mysql: where clause =
Aug 14 11:39:25 localhost vsftpd: SELECT passwd FROM users WHERE name='gcj'

5.mysql
我和朋友一起檢查過我的mysql里的設置,沒有一點問題
全部通過

這就很麻煩了,看來真的遇到問題了,
本人小菜,無法解決,呵呵
希望有高手不吝賜教
《解決方案》

我想是你的密碼那個地方錯誤,應該選擇用明碼方式
《解決方案》

不是啊,我改過了,也不行!
現在這個錯誤我通過加大共享內存解決了,
但是什麼錯誤也,沒有,照樣虛擬用戶登不上阿
高手請教下了

[火星人 ] vsftpd+pam+mysql出錯,虛擬用戶無法登錄已經有457次圍觀

http://coctec.com/docs/service/show-post-36522.html