文件服务器:

基于应用层:FTP

基于文件系统的文件服务器:

内核级的网络文件系统:NFS

POSIX API

跨OS的网络文件系统:CIFS

网络存储:

NAS:Network Attached Storage,网络附加存储;

文件系统级别的存储接口;

SAN:Storage Area Network,存储区域网络;

块[设备]级别的存储接口;

iSCSI

FTP:

File Transfer Protocol,文件传输协议;

C/S架构:

两组套接字:

控制连接套接字:21/TCP

数据连接套接字:20/TCP,随机套接字;

TCP连接:

控制连接(命令连接)

数据连接

数据传输的模式:

文本格式(ASCII):

二进制格式:

数据连接的建立方式:

主动模式:服务器主动向客户端发送建立数据连接的请求;

被动模式:从客户端向服务器已经协商好的端口发起数据连接建立的请求;

端口的格式:112,123

FTP本身的安全性:

默认明文传输数据;认证时的用户名和密码均为明文;

安全增强:

ftps:ftp over SSL/TLS;

sftp:ftp over SSH

FTP协议的实现;

S:

Windows系统:IIS,Serv-U

Linux系统:wuftpd,proftpd,pureftp,vsftpd

C:

CLI:ftp,lftp,wget,lftpget,...

GUI:FlashFXP,FileZila,CuteFTP,GFTP,...

vsftpd:

开源解决方案;

安装:vsftpd-VERSION.release.rpm

程序环境:

主配置文件:/etc/vsftpd/vsftpd.conf

辅助配置文件:/etc/vsftpd/other_file

主程序:/usr/sbin/vsftpd

默认的匿名用户访问的数据根目录:/var/ftp

Systemd Unit File:/usr/lib/systemd/system/vsftpd.service

配置vsftpd:

用户类别:

匿名用户:ftp,anonymous;

系统用户:存在于/etc/passwd中的用户;

系统用户如果通过验证访问FTP站点,其默认访问的目录为其家目录;还可以切换至真正的根目录;

针对于这一问题,可以将其直接禁锢于其家目录中;

虚拟用户:只能访问FTP服务器但不能完成系统登陆操作的用户;

数据文件:

RDBMS:

主配置文件:/etc/vsftpd/vsftpd.conf

其中的主要配置指令格式:

Directive=Value

注意:

1.所有Directive字符串前面不允许添加任何字符,即所有的指令必须位于本行的绝对行首;

2."="两侧绝对不允许出现空白字符;

3.Value部分,如果是布尔值,则必须都为大写字母,如YES,NO;

常用的指令:

全局的指令:

write_enable=YES

匿名用户授权:

anonymous_enable=YES

anon_upload_enable=YES

anon_mkdir_write_enable=YES

anon_other_write_enable=YES

anon_umask=022

系统用户:

local_enable=YES

local_umask=022

禁锢系统用户于其家目录中:

chroot_local_user=YES

chroot_list_enable=YES

chroot_list_file=/etc/vsftpd/chroot_list

注意:

如果chroot_local_user=YES,那么除了/etc/vsftpd/chroot_list中的用户之外,所有用户都被禁锢于家目录;

如果chroot_local_user=NO,那么除了/etc/vsftpd/chroot_list中的用户之外,所有用户都不被禁锢于家目录;

定义传输日志:

xferlog_enable=YES

xferlog_file=/var/log/xferlog

xferlog_std_format=YES

用户访问控制:

userlist_enable=YES

userlist_deny=YES

userlist_file=/etc/vsftpd/user_list

注意:

如果userlist_deny=YES,那么/etc/vsftpd/user_list就是黑名单,而且无需密码认证;

如果userlist_deny=NO,那么/etc/vsftpd/user_list就是白名单,存在于此文件中并且不存在于/etc/vsftpd/ftpusers文件的用户,可以访问FTP服务器;

认证机制:

PAM认证:

pam_service_name=vsftpd

主要认证用户账户的身份;

TCP_WRRAPERS认证:

tcp_wrappers=YES

应用/etc/hosts.allow和/etc/hosts.deny完成基于IP地址认证;

被动模式:

pasv_enable=YES

pasv_max_port=61000

pasv_min_port=60000

限速:

local_max_rate=128000

anon_max_rate=50000

注意:单位是Byte/S

回顾:

FTP

21/TCP

20/TCP, 某随机端口/TCP

ASCII

BINARY

匿名用户:ftp, anonymous

本地用户:存储于/etc/passwd中的用户

虚拟用户:仅能访问FTP服务但不能登录系统

vsftpd,

/etc/vsftpd/vsftpd.conf

vsftpd(2)

1.vsftpd的虚拟主机

2.vsftpd的虚拟用户

利用文件系统的数据库文件存放用户账户和密码

利用MySQL存放用户账户和密码

3.分别设定不同虚拟用户的访问权限

vsftpd的虚拟主机:

区分不同的虚拟主机,仅依靠套接字的不同而已;

listen_port=21

listen_address=172.16.69.1

基本ftp服务器虚拟主机:/etc/vsftpd/vsftpd.conf

listen_port=21

listen_address=172.16.69.1

存储虚拟用户于文件的虚拟主机:/etc/vsftpd/vuser_file.conf

listen_port=21

listen_address=172.16.69.101

存储虚拟用户于MySQL的虚拟主机:/etc/vsftpd/vuser_mysql.conf

listen_port=21

listen_address=172.16.69.201

虚拟用户:

虚拟用户账户存储于何处?

文件,MySQL,Oracle,Redis,LDAP...

vsftpd本身不具备用户账户身份验证功能,认证功能托管给pam;

pam:Plugin Athentication Module,插入使认证模块

以文件存放虚拟用户的配置步骤:

1.创建用于保存虚拟用户文件,其中奇数行为用户名,偶数行为密码;

# touch VUSER_FILE

tom

123456

jerry

123123

2.将保存虚拟用户账户的文本文件转换为数据库文件:

db_load -T -t hash -f /PATH/TO/VUSER_FILE /PATH/TO/USERDB.db

3.设定PAM的认证文件

/etc/pam.d/vusers.file

auth required /lib64/security/pam_userdb.so db=/PATH/TO/USERDB

account required /lib64/security/pam_userdb.so db=/PATH/TO/USERDB

4.创建一个用于映射虚拟用户身份的本地用户

useradd LOCAL_USER

5.修改此虚拟主机的配置文件:

anonymous_enable=NO 匿名用户

guest_enable=YES 来宾用户

guest_username=LOCAL_USER 来宾用户名

pam_service_name=vusers.file    pam认证文件

local_root=/myftp/ftpdata       单独设置权限目录

anon_upload_enable=YES 允许上传文件

anon_mkdir_write_enable=YES 允许创建目录

anon_other_write_enable=YES 允许修改和删除

如果想要对于所有的虚拟用户分别设定权限,可以使用:

在虚拟主机的主配置文件中添加指令:

user_config_dir=/PATH/TO/CONFIG_DIR

创建出这个目录,并且在目录下创建出与虚拟用户名相同的文件;

anon_upload_enable=YES

anon_mkdir_write_enable=YES

anon_other_write_enable=YES

local_root=/myftp/ftpdata/alice

anon_umask=022

基于MySQL存放虚拟用户

'centos',PASSWORD('qhdlink')

'suse',PASSWORD('link19')

1.编译安装pam的mysql驱动

下载地址:http://pam-mysql.sourceforge.net/

需要预先安装编译环境,即: Development Tools,Server Platform Development, pam-devel, mysql_devel

# tar xf pam_mysql-0.7RC1.tar.gz

# cd pam_mysql-0.7RC1

# ./configure --with-pam=/usr --with-mysql=/usr --with-pam-mods-dir=/lib64/secutiry

# make -j 4 && make install

2.创建数据库,数据表,及授权用户;

mysql> create database vsftpd;

mysql> use vsftpd;

mysql> create table users (username char(20),password char(48));

mysql> insert into users values ('centos',PASSWORD('qhdlink')),('gentoo',PASSWORD('qhdlink'))

mysql> grant all on vsftpd.* to 'vsftpd'@'localhost' identified by 'vsftppass';

mysql> grant all on vsftpd.* to 'vsftpd'@'127.0.0.1' identified by 'vsftppass';

mysql> grant all on vsftpd.* to 'vsftpd'@'172.16.%.%' identified by 'vsftppass';

3.创建pam的认证文件:

/etc/pam.d/vusers.mysql

auth required /lib64/security/pam_mysql.so user=vsftpd passwd=vsftppass host=127.0.0.1 db=vsftpd table=users usercolumn=username passwdcolumn=password crypt=2

account required /lib64/security/pam_mysql.so user=vsftpd passwd=vsftppass host=127.0.0.1 db=vsftpd table=users usercolumn=username passwdcolumn=password crypt=2

4.创建映射用户:

useradd mysqluser

5.修改此虚拟主机的配置文件:

anonymous_enable=NO

guest_enable=YES

guest_username=LOCAL_USER

pam_service_name=vusers.mysql

user_config_dir=/PATH/TO/MYSQL_USER_CONFIG

文件服务——NFS

NFS——Network File System

NIS

LDAP

NFS: SUN

NFSv1

NFSv2, NFSv3, NFSv4

nfs: 2049/TCP

辅助类的服务:

rpc.portmapper:端口映射表

rpc.mountd:认证

rpc.lockd:加锁

rpc.statd:状态

安装nfs:

nfs-utils

nfs服务器配置文件:

/etc/exports

/etc/exports.d/*

主配置文件主要包括两部分:

Shared_path Machine_Name1(Security_options) Machine_Name2(Security_options) ...

Shared_path:建议写绝对路径,要共享的目录;

Machine_Name:

single host:单独主机,IP地址或主机名

wildcards:使用*或?来做通配,如果只写一个*则表示所有主机;

IP networks:IP网段,NETWORK/NETMASK, NETWOEK/PREFIX_LEN

192.168.100.0/255.255.255.0

172.16.0.0/16

exportfs -ar命令重读配置文件

exports 查看配置文件的设置

showmount 显示nfs服务器的信息  

showmount -e 172.131.132.1.

Security_options:

General Options:

ro:只读

rw:读写

sync:同步存储

async:异步存储

nohide:不把共享目录中子目录挂载的内容隐藏;

User ID Mapping:

root_squash:压缩root用户权限,一般映射为nfsnobody;

all_squash:压缩所有的本地用户权限,映射为nfsnobody;

注意:默认情况下,root用户被压缩权限,而所有的普通用户都没有被压缩权限;如果想要取消root用户的权限压缩,则需要使用no_root_squash选项;

anonuid and anongid:为受到权限压缩的用户指定一个额外的UID和GID做映射,而不再使用nfsnobody;

注意:uid和gid是可以任意指定的,而无需关注是否有对应于此uid的用户或gid的组;

NAS: 网络附加存储,文件系统级别的存储网络;

回顾:

vsftpd

listen-port=

listen-address=

虚拟用户:

pam_userdb.so

pam_mysql.so

user_config_dir=

NFS

NAS

文件服务器(4)

Samba

smb协议:Service Message Block,服务消息块;

139/tcp,445/tcp

NetBios协议:

137/udp,138/udp

cifs文件系统

Andrew Tridgwell

Samba的功能:

文件系统共享:

打印机共享:

NetBios协议:

Workgroup model:

Domain Model:

程序环境:

samba

samba-client

samba-common

samba-commom-tools

samba-*libs

主配置文件:/etc/samba/smb.conf

主程序:

smbd:实现SMB协议/CIFS文件系统 Service的程序;

nmbd:NetBIOS name server;名称解析服务器

UNIT文件:

smb.service

nmb.service

客户端程序:

smbclient:交互式命令行客户端工具,类似于ftp工具;

mount.cifs:挂载cifs文件系统的专用命令;

也可以使用mount -t cifs

samba的主配置文件:/etc/samba/smb.conf

两类配置段:

Global Settings:全局配置;

[global]

Network-Related Options 网络配置

workgroup = MYGROUP 工作组

server string = Samba Server Version %v 描述信息

netbios name = MYSERVER 名称

interfaces = lo eth0 192.168.12.2/24 192.168.13.2/24 哪一个网络接口接受远程主机的samba请求

hosts allow = 127. 192.168.12. 192.168.13.

Logging Options

log file = /var/log/samba/log.%m 日志文件 %m:客户主机的IP地址

max log size = 50 日志多大

Standalone Server Options 独立进程守护

security = user samba的运行模式

samba服务的安全级别,取值有四个:

share:匿名共享,允许所有人以来宾用户身份匿名访问所有共享目录;

user:使用samba服务自我管理的账户和密码进行用户认证;用户账户必须首先是系统用户,但密码并非为/etc/shadow中存放的密码,而是由samba自行管理的密码数据库文件中存放的密码;存放密码的文件的格式由passdb backend指令进行定义;  主流的

server:由第三方服务器进行统一用户身份认证;

domain:使用域控制器进行用户身份验证;基于kerberos协议进行;

passdb backend = tdbsam

即用户后台。有三种用户后台:smbpasswd,tdbsam,dapsam

Share Definitions:共享定义

有三类:

[homes]:为每个samba用户定义其是否可以通过samba访问自己的家目录;   默认就好

[priters]:定义共享打印机; 默认就好

[share_fs]:定义共享目录或文件系统;

常用的共享指令:

comment:注释信息;

path:定义当前共享的目录的路径,建议使用绝对路径;

browseable:是否可以被浏览,其实指的是是否能够在访问的页面里直接被看到;

public:是否将共享的目录公开给所有用户访问,一般与"share"安全级别同时使用;

guest ok:是否允许来宾账户访问;

注:public = yes 相当于 guest ok = yes

writable:对共享目录是否有"写"共享权限;针对于所有的合法用户;

read only:对共享目录是否有"只读"共享权限;针对于所有的合法用户;

注意:writable = yes 相当于 read only = no

write list = username @groupname +groupname:允许哪些用户或组对此共享目录有"写"共享权限;

valid users = username @groupname +groupname:定义哪些用户或组为此共享目录的有效访问用户;

注意:

writable = yes + valid users = username @groupname +groupname 相当于 write list = username @groupname +groupname

create mode = 0644:通过共享方式创建的文件的默认权限;

dir mode = 0755

directory mode = 0755

上述两个指令意思是:通过共享方式创建的目录的默认权限;

samba的配置文件中可用的宏列表:

%v:samba程序的版本号;

%m:客户端主机的NetBIOS名称;

%H:当前用户的家目录的路径;

%U:当前用户的用户名;

%g:当前用户的属组的组名;

%h:当前samba主机的HOSTNAME;

%I:客户端主机的IP地址;

%T:当前的系统日期和时间;

samba用户管理:

smbpasswd:当passdb backend为smbpasswd的时候,其添加的用户有效;

-a:添加samba用户;

-x:删除samba用户;

-d:禁用samba用户;

-e:启用被禁用的samba用户;

pdbedit:当passdb backend为tdbsam的时候,其添加的用户有效;

-L:列出所有被成功添加的samba用户;

-a,--create:添加samba用户;

-u username:指明要管理的用户;

-x,--delete:删除samba用户;

-t,--password-from-stdin:从标准输入接收字符串作为samba用户的密码;

创建一个共享目录:

# mkdir /myshare

# chmod 1777 /myshare

[myshare]

 comment = my shared directory for LAN

 hosts allow = 172.16.

 path = /myshare

 public = no

 browsable = yes

 write list = @smbusers centos

 create mask = 0644

 dir mask = 0755

使用testparm命令测试配置文件的语法是否正确;

启动或重载配置文件即可使新配置的共享生效;

# systemctl {start|reload} smb.service

共享目录的访问方式:

客户端工具交互是访问:

smbclient客户端工具:

-L SERVER_IP:查看指定服务器上的samba共享目录列表;

-U USERNAME:指定以特定用户的身份来访问或查看;

-N:在使用匿名用户或来宾用户的时候无需输入密码;

使用smbclient命令访问共享目录:

smbclient -U USERNAME //SERVER_IP/DIR_SHARED_NAME 

挂载访问:

mount -t cifs -o username=USERNAME[,password=PASSWORD] //SERVER_IP/DIR_SHARED_NAME MOUNT_POINT

创建用于保存samba用户的文件,如:/root/smbuser.txt, 权限600;

此文件中的用户名和密码的书写格式:

username=USERNAME

password=PASSWORD

mount.cifs -o credentials=/root/smbuser.txt //SERVER_IP/DIR_SHARED_NAME MOUNT_POINT

查看服务器上的共享目录的访问状态:

smbstatus命令:

-b:显示简要格式的输出信息;

-v:显示详细格式的输出信息;