您的位置:首页 > 编程语言 > PHP开发

文件共享服务器 -----ftp服务<一>

2012-01-26 21:33 369 查看
文件共享服务器:
ftp:(文件传输协议) ftp协议
Client /server
Client tcp/ip cmd
浏览器
Cuteftp leapftp flashxp ssl

Server
Windows IIS server-u
Linux wu-ftp vsftpd pureftp
ftp 工作方式 :主动方式 被动方式
21(连接控制端口) 20(传递数据端口)
客户端访问(1)主动方式 (2)被动方式





ftp指令 (cmd)
Pwd 在哪
Cd 切换目录
Dir 远程查看目录
get(下载) mget (多个下载)
put(上传) mput(多个上传)
!dir(查看本地)
Lcd(切换本地)
传输方式: ascii和bin(二进制)

使用linux做ftp服务器
安装包为:vsftpd-2.0.5-16.el5_4.1.i386.rpm
Vsftpd的主配置文件为:/etc/vsftpd/vsftpd.conf
安装完后最初可以直接启用
[root@mail Server]# service vsftpd start
为 vsftpd 启动 vsftpd: [确定]
这时我们可以通过很多方式登录
[root@mail sasl2]# ftp 127.0.0.1
Connected to 127.0.0.1.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (127.0.0.1:root): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> dir 查看目录
227 Entering Passive Mode (127,0,0,1,133,210)
150 Here comes the directory listing.
drwxr-xr-x 2 0 0 4096 Dec 04 2009 pub
226 Directory send OK.
ftp> pwd 查看位置
257 "/"
ftp> !dir 查看本地目录
libanonymous.la liblogin.la libplain.la libsasldb.la Sendmail.conf
libanonymous.so liblogin.so libplain.so libsasldb.so smtpd.conf
libanonymous.so.2 liblogin.so.2 libplain.so.2 libsasldb.so.2
libanonymous.so.2.0.22 liblogin.so.2.0.22 libplain.so.2.0.22 libsasldb.so.2.0.22
ftp> bye
221 Goodbye.
[root@mail sasl2]# touch /home/user1/f1 在user1用户的家目录创建文件
[root@mail sasl2]# lftp 127.0.0.1 使用lftp方式登录(默认匿名登录)
lftp 127.0.0.1:~> pwd ftp://127.0.0.1 lftp 127.0.0.1:~> dir
drwxr-xr-x 2 0 0 4096 Dec 04 2009 pub
lftp 127.0.0.1:/> user user1 切换用户登录
口令:
lftp user1@127.0.0.1:~> dir
-rw-r--r-- 1 0 0 0 Jul 24 09:13 f1
drwx------ 3 500 500 4096 Jul 24 08:30 mail
lftp user1@127.0.0.1:~>
[root@mail sasl2]# lftp -u user1 127.0.0.1 使用用户名登录
口令:
lftp user1@127.0.0.1:~> pwd ftp://user1@127.0.0.1 lftp user1@127.0.0.1:~> dir
-rw-r--r-- 1 0 0 0 Jul 24 09:13 f1
drwx------ 3 500 500 4096 Jul 24 08:30 mail
lftp user1@127.0.0.1:~> bye 退出登录
只用linux才支持lftp登录方式
针对资源的权限:本地权限,网络权限 ,如果看、两个权限冲突时取最小权限
编译vsftpd的主配置文档
默认状态下ftp的共享文件夹/var/ftp/pub的权限为:
[root@mail ftp]# ll
drwxr-xr-x 2 root root 4096 2009-12-04 pub 不允许其他用户写入的,为了便于他们的上传我们改一下目录权限
[root@mail ftp]# chmod a+wt pub 不允许删除该目录
[root@mail sasl2]# vim /etc/vsftpd/vsftpd.conf 配置参数可以使用 man 5 vsftpd找到
12 anonymous_enable=YES 允许吗、匿名用户登录的
15 local_enable=YES 允许本地用户登录
18 write_enable=YES 本地与网络可读可写
22 local_umask=022 屏蔽权限
23anon_umask=073 默认是077,为匿名用户上传的文件保留可以下载权限(添加的)
27 #anon_upload_enable=YES 匿名用户向ftp上传东西被禁用
31 #anon_mkdir_write_enable=YES 匿名账号创建文件夹(但是只有它会只能传不能下载)
anon_other_write_enable=YES 添加别的写权限后才能执行对上传的目录执行删除改名
35 dirmessage_enable=YES 进入目录提示目录消息(需要在该目录下创建.message文件)
39 xferlog_enable=YES 启用传输时的日志记录
42 connect_from_port_20=YES
53 xferlog_file=/var/log/xferlog 打开它才会在传输时记录日志(该文件在传输时才会产生)
57 xferlog_std_format=YES 记录的日志的格式,该格式为标准格式
58 log_ftp_protocol=NO 在日志中记录用户登录上执行的操作命令(但是日志格式必须为非标准,即上一行为NO)
60 #idle_session_timeout=600 会话空闲超时
63 #data_connection_timeout=120 连接超时(三次握手)
86 ftpd_banner=Welcome to blah FTP service. 进入ftp时的消息,排头,不用登录就能看见
90 deny_email_enable=YES 匿名账号的密码可以用邮箱的账号,那么ftp就会把ftp的一些相关信息发到该邮箱中,不利于安全,我们可以借此禁用默写邮箱做密码,将其写入banned_emails文件中
91 # (default follows) 默认是允许的
92 banned_email_file=/etc/vsftpd/banned_emails 列入禁止使用邮箱账号做密码的名单,该文件需要先收工创建
97 chroot_list_enable=YES 根据列出的表单将用户锁定在家目录中
98 # (default follows)
99 chroot_list_file=/etc/vsftpd/chroot_list 该文件写入被锁定的账号(手动创建)
100 chroot_local_user=YES 将登录的所有用户都锁定在家目录
111 listen=YES (可以做成依赖于超级守护进程的服务器xinetd)
118 pam_service_name=vsftpd ftp账户使用pam验证
119 userlist_enable=YES 开启针对列表中用户的访问权限,该列表为/etc/vsftpd/user_list
120 userlist_deny=yes 决定该列表中的用户的访问时拒绝(YES)还是允许(NO)
121 tcp_wrappers=YES 使用系统中的简易防火墙(这个简易防火墙有两个文件/etc/hosts.allow与/etc/hosts.deny)
修改ftp的主配置文件后一定要重启vsftpd
系统的建议防火墙,主要依靠/etc/hosts.allow和/etc/hosts.deny
在/etc/hosts.deny系统先看到它默认动作是allow(可以改成deny)
vsftpd:192.168.20.33:allow 语法格式:服务:来源:动作(允许该地址访问)
在/etc/hosts.deny中系统最后才读取
vsftpd:all:deny




下面做一个ftp的小实例
1.新购一块磁盘,将ftp资料传到该目录下 —》分区格式化——》挂载/mnt/ftp
建立目录 public 公共文档 ,只许下载,不许上传与更改
2.每个用户家目录 home/用户 空间限制10m
3.同时在线用户3个 ,每用户连接数2
4.传递速率 1M/s 本地用户 100k/s 匿名用户
将新增磁盘分区格式化后,然后启用磁盘配额
[root@mail ~]# vim /etc/fstab
/dev/sdb1 /mnt/ftp auto defaults,usrquota 0 0
然后使用mount -a 或者重启,是这些参数生效
[root@mail ~]# mount
/dev/sdb1 on /mnt/ftp type ext2 (rw,usrquota) 生效了
对用户做磁盘配额的控制
[root@mail ~]# quotacheck -augvc
在/mnt/ftp就生成文件:aquota.user
[root@mail ftp]# edquota -u user1
Filesystem blocks soft hard inodes soft hard
/dev/sdb1 0 10000 10000 3 0 0
[root@mail ftp]# edquota -p user1 user2 将user1的设置拷贝给user2
[root@mail ftp]# quotaon /dev/sdb1
[root@mail ftp]# vim /etc/rc.d/rc.local 编译开机启动配额
quotaon /dev/sdb1 添加该项
在/mnt/ftp下创建匿名账号访问的公共目录public(对other用户没有写权限)
[root@mail ftp]# mkdir public
[root@mail ftp]# cd public/
[root@mail public]# touch l1
[root@mail public]# touch l2
在 /mnt/ftp 为用户创建家目录
[root@mail ftp]# mkdir home
[root@mail ftp]# mv /home/user* home/ 将本地用户转移过来
[root@mail ftp]# ll home/
总计 2
drwx------ 4 user1 user1 1024 07-24 17:13 user1
drwx------ 4 user2 user2 1024 07-24 16:42 user2
[root@mail ftp]# vim /etc/passwd 修改passwd文件中用户家目录的路径
user1:x:500:500::/mnt/ftp/home/user1:/bin/bash
user2:x:501:501::/mnt/ftp/home/user2:/bin/bash
但是新建的账号家目录还是在/home/下,那么我们需要创建账号默认的家目录
[root@mail ftp]# useradd -D -b /mnt/ftp/home 那么在创建的账号默认的家目录就改了
[root@mail ftp]# useradd user3
[root@mail ftp]# grep user /etc/passwd
user1:x:500:500::/mnt/ftp/home/user1:/bin/bash
user2:x:501:501::/mnt/ftp/home/user2:/bin/bash
user3:x:502:502::/mnt/ftp/home/user3:/bin/bash
默认匿名账号的根默认是/var/ftp/pub,我们需要改变它的根,让它为/mnt/ftp/public
在主配置文件中添加
[root@mail ftp]# vim /etc/vsftpd/vsftpd.conf
anon_upload_enable=YES 允许匿名用户下载
anon_root=/mnt/ftp/public
此时配额已经做我们可以上传文件是试试
创建规定大小文件:dd if=/dev/zero of=f2 bs=1M count=5
做用户连接数以及本地与匿名账户传输速率做限制
max_clients=3 最大用户连接数位3
max_per_ip=2 每用户最多连接数位2
local_max_rate=1000000 本地最大传输速率为100m
anon_max_rate=100000 匿名用户最大传输速率为10m
重启vsftpd就可以做测试了

实现基于超级守护进程的ftp
我们将ftp服务做成超级守护进程就能实现在规定时间可以访问了
首先编译主配置文件/etc/vsftpd/vsftpd.conf
listen=NO 切换服务模式
[root@mail ~]# cd /etc/xinetd.d/
[root@mail xinetd.d]# cp -p tftp vsftpd 生成ftp的超级守护进程文件
[root@mail ~]# vim /etc/xinetd.d/vsftpd 编译该文件
service ftp
{
id =vsftpd
socket_type = stream
protocol = tcp
wait = no
user = root
server = /usr/sbin/vsftpd
server_args = /etc/vsftpd/vsftpd.conf
disable = no
access_times = 08:00-20:00
}
[root@mail ~]# service xinetd restart 便可以启动ftp了

ftp安全
1.加密ftp ssl ftps 证书
让ca给自己颁发一个证书利用证书加密
[root@mail ~]# cd /etc/pki/
[root@mail pki]# vim tls/openssl.cnf
45 dir = /etc/pki/CA
88 countryName = optional
89 stateOrProvinceName = optional
90 organizationName = optional
:80,90 r/match/optional
[root@mail CA]# mkdir crl certs newcerts 创建这些目录
[root@mail CA]# touch index.txt serial 创建文件
[root@mail CA]# vim serial 给该文件一个起始序列号
01
在CA目录下产生一个钥匙
[root@mail pki]# cd CA/
[root@mail CA]# openssl genrsa 1024 >private/cakey.pem
Generating RSA private key, 1024 bit long modulus
...........................................++++++
.......++++++
e is 65537 (0x10001)
然后产生一个自签发的证书
[root@mail CA]# openssl req -new -x509 -key private/cakey.pem -days 3650 -out cacert.pem
[root@mail CA]# ll
总计 12
-rw-r--r-- 1 root root 1074 07-17 11:26 cacert.pem 证书文件产生
drwx------ 2 root root 4096 07-17 11:24 private
[root@mail CA]# chmod 600 private/cakey.pem 对私钥进行权限处理
[root@mail CA]# mkdir -pv /etc/ftp/certs 创建多级子目录存放ftp的证书文件
mkdir: 已创建目录 “/etc/ftp”
mkdir: 已创建目录 “/etc/ftp/certs”
[root@mail CA]# cd /etc/ftp/certs/
[root@mail certs]# openssl genrsa 1024 >vsftpd.key 产生钥匙
Generating RSA private key, 1024 bit long modulus
..++++++
.........++++++
e is 65537 (0x10001)
根据钥匙做请求文件:
[root@mail certs]# openssl req -new -key vsftpd.key -out vsftpd.csr
[root@mail certs]# ll
总计 8
-rw-r--r-- 1 root root 1094 07-17 11:36 vsftpd.csr
-rw-r--r-- 1 root root 887 07-17 11:34 vsftpd.key
[root@mail certs]# openssl ca -in vsftpd.csr -out vsftpd.crt 颁发证书
[root@mail certs]# ll
总计 12
-rw-r--r-- 1 root root 3032 07-17 11:55 vsftpd.crt
-rw-r--r-- 1 root root 639 07-17 11:54 vsftpd.csr
-rw-r--r-- 1 root root 887 07-17 11:52 vsftpd.key
[root@mail certs]# chmod 600 * 更改一下权限
我们为了测试可是使用wireshark抓包
[root@mail certs]# yum install wireshark -y
[root@mail ~]# tshark -ni eth0 -R "tcp.dstport eq 21" 抓取ftp关于21端口的包
20.610580 192.168.20.22 -> 192.168.20.66 FTP Request: USER user1
20.853138 192.168.20.22 -> 192.168.20.66 TCP 1377 > 21 [ACK] Seq=13 Ack=69 Win=372232 Len=0
22.257695 192.168.20.22 -> 192.168.20.66 FTP Request: PASS 123
在未启用加密验证的情况下,使用账户访问ftp,很容易就会抓到账号与密码
那么我们启用ftp加密
在ftp主配置文件中没有关于加密的,但我们可以根据man vsftpd.conf查看ftp手册来找到
[root@mail certs]# vim /etc/vsftpd/vsftpd.conf
force_local_logins_ssl=YES 强制本地账号登陆加密
force_local_data_ssl=YES 本账号传递数据加密
ssl_enable=YES 打开ssl验证
ssl_tlsv1=YES 启用ssl的版本号
ssl_sslv3=YES
ssl_sslv2=YES
rsa_cert_file=/etc/ftp/certs/vsftpd.crt 本地证书存放位置
rsa_private_key_file=/etc/ftp/certs/vsftpd.key 本地钥匙存放位置
之后重启ftp服务
这时我们使用ftp客户端软件测试登陆(命令行不支持ftps)





此时再抓包便不会再抓到有关账号跟密码的数据包了

2.虚拟账号(linux操作系统部存在的账号,但是可以登录ftp进行访问)
[root@mail certs]# vim /etc/vsftpd/vuser.txt 创建一个文本,放置虚拟账号
Jim 账号
000 密码
然后我们需要生成hash加密的数据库文件以便让后续的pam.userdb这个模块来读取我们的用户名密码进行验证,我们需要安装 db4-utils包
[root@mail certs]# yum install db4-utils -y
[root@mail certs]# cd /etc/vsftpd/
[root@mail vsftpd]# db_load -T -t hash -f vuser.txt vuser.db 生成数据库文件
Vsftpd要启动虚拟账号需要跟pam认证模块结合,在/etc/pam.d/有一个vsftpd文件,这是vsftpd利用pam这个认证模块认证账户登录的,我们产生这样一个类似虚拟账号的认证文件
[root@mail vsftpd]# ll
总计 36
-rw------- 1 root root 125 2009-12-04 ftpusers
-rw------- 1 root root 361 2009-12-04 user_list
-rw------- 1 root root 4864 07-17 12:13 vsftpd.conf
-rwxr--r-- 1 root root 338 2009-12-04 vsftpd_conf_migrate.sh
-rw-r--r-- 1 root root 12288 07-17 12:41 vuser.db
-rw-r--r-- 1 root root 18 07-17 12:36 vuser.txt
[root@mail vsftpd]# cd /etc/pam.d/
[root@mail pam.d]# cp vsftpd vsftpd.t
[root@mail pam.d]# vim vsftpd.t
auth required pam_userdb.so db=/etc/vsftpd/vuser
account required pam_userdb.so db=/etc/vsftpd/vuser
上面dn=后面的就是我们生成好的hash数据文件,文件后缀的不需要打,pam_userdb.so这个模块会自动帮我们识别的,虚拟账号必须映射到系统的一个本地账号上,可以不设密码。
[root@mail pam.d]# vim /etc/vsftpd/vsftpd.conf
pam_service_name=vsftpd.t
guest_enable=YES 打开guest账号
guest_username=test1 设置虚拟账号的映射

跟登录相关的日志放在/var/log/secure
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  职场 休闲 ftp服务