这篇文章应该是有史以来,历时最长最纠结的一次,毫不夸张的讲总结到词穷的地步了。现在每次一到理论知识梳理的过程,总有种茶壶里的饺子,稍微懂点但有说不出来,哎!这辈子估计当不了老师了,话不多说还得撸起袖子接着写不是。
第一章、详细描述一次加密通讯的过程,结合图示最佳。
HTTPS在基于SSL建立会话前,会经历4次握手过程以获取会话密钥。流程如下:
图示1
HTTPs 通讯流程详细说明
1. 客户端请求(ClientHello)
客户端向服务器发送会话请求,这一步称为ClientHello。ClientHello中包括以下内容:
一个随机数,其后将用于生成会话密钥
客户端所支持的加密算法
客户端所支持的协议版本、压缩方法
主机名,即要请求的网址(TLS中扩充内容,早期的SSL没有这一部分,所以一台主机只能有一个域名)
2. 服务器响应(SeverHello)
服务器收到请求后,向客户端做响应。响应用内容包括:
SeverHello,SeverHello包括以下内容:
(1)一个随机数,其后将用于生成会话密钥
(2)服务器所支持的加密算法
(3)服务器CA证书(含公钥)
SeverHello结束符
3. 客户端验证证书,发送会话密钥
客户端对收到的服务端证书进行验证,验证内容包括:
(1) 证书是否由可信机构颁布、证书中的域名与实际域名是否一致、证书是否已经过期等。
(2)验证失败,则显示警告信息
(3)验证成功,则做以下操作:
(a)生成一个主密钥,其后将做为会话密钥
(b)使用从证书中提取的公钥对主密钥进行加密
(c)将加密后的主密钥发送到服务器
在这一步中,客户端向服务器发送内容还包括:
编码改变通知,表示之后的信息都会使用双方商定的加密方法和密钥进行加密
客户端握手结束通知,也做为服务器较验哈希值
4. 服务器获取会话密钥,并通知客户端
服务器收到客户端响应值后,会使用私钥解密出会话密钥。并向客户端最后响应,响应内容包括:
编码改变通知,表示之后的信息都会使用双方商定的加密方法和密钥进行加密
服务端握手结束通知,也做为客户较验哈希值
5. 双方使用会话密钥进行加密通讯
第二章、描述创建私有CA的过程,以及为客户端发来的证书请求进行颁发证书。
创建一套私有CA首先准备搭建环境,准备两台服务器现称为A和B,A来扮演CA服务器,B来扮演客户端,在B上搭建一个WEB服务,向A请求一份证书用在web上,现在开始记录创建过程。
1. A生成自己的私有证书
~]# openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048
图示2
2. A作为CA生成自签证书
~]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 7300 #参数说明: req:请求并生成证书命令; new:新的证书请求; x509:生成自签证书,这个选项是在创建CA证书时使用,为客户端生成证书是不要使用此选项; key:读取私有证书密钥,默认CA的私有密钥存储在/etc/pki/CA/private/目录下; out:证书生成后存放位置,CA的证书需要放置在/etc/pki/CA/目录下命名为cacert.pem:这个是固定格式,如果存储位置发生改变或名称不是cacert.pem则在给客户端颁发证书时会出现一些问题; days:证书有效期,单位为天; #下边是相关CA信息填写 You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter ‘.‘, the field will be left blank. ----- Country Name (2 letter code) [XX]:CN #国家简写 State or Province Name (full name) []:beijing #所属省份 Locality Name (eg, city) [Default City]:beijing #所属城市 Organization Name (eg, company) [Default Company Ltd]:mright.ltd #组织名称 Organizational Unit Name (eg, section) []:CA #组织部门 Common Name (eg, your name or your server‘s hostname) []:ca.mright.xyz #CA的主机名 Email Address []:[email protected] #CA管理员邮箱
3. CA设置完成后,开始设置B客户端,B主机主要是生成私有密钥,然后根据密钥来创建向CA申请证书的请求证书。
~]# mkdir /etc/httpd/ssl && openssl genrsa -out /etc/httpd/ssl/httpd.key 1024 ~]# openssl req -new -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr -days 365 #下边是相关客户端证书信息填写 You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter ‘.‘, the field will be left blank. ----- Country Name (2 letter code) [XX]:CN #国家简写 State or Province Name (full name) []:beijing #所属省份 Locality Name (eg, city) [Default City]:beijing #所属城市 Organization Name (eg, company) [Default Company Ltd]:mright.ltd #组织名称 Organizational Unit Name (eg, section) []:ops #组织部门 Common Name (eg, your name or your server‘s hostname) []:www.mright.xyz #CA的主机名 Email Address []:[email protected] #CA管理员邮箱 ~]# scp /etc/httpd/ssl/httpd.csr [email protected]:/tmp/ #将请求证书通过scp工具发送给CA服务器
4. CA收到B的请求后,进行证书签发工作
注意:签发证书前还需要准备两个文件index.txt和serial
~]# touch index.txt #为certs中所有签署的证书生成一个目录(相当于数据库),此文件默认不存在,需要手动生成。 ~]# echo 01 > serial #此文件记录的是当前证书已经发到多少个,默认该文件不存在需要手动创建,并指明其初始值为01。 ~]# openssl ca -in /tmp/httpd.csr -out /etc/pki/CA/newcerts/01.crt -days 365 Using configuration from /etc/pki/tls/openssl.cnf Check that the request matches the signature Signature ok Certificate Details: Serial Number: 1 (0x1) Validity Not Before: Mar 27 05:47:47 2017 GMT Not After : Mar 27 05:47:47 2018 GMT Subject: countryName = CN stateOrProvinceName = beijing organizationName = mright.ltd organizationalUnitName = ops commonName = www.mright.xyz emailAddress = [email protected] X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 3D:88:30:5A:A9:C1:91:9B:5F:80:16:22:71:F6:D3:A1:F5:44:ED:9B X509v3 Authority Key Identifier: keyid:A0:B2:C1:CA:B9:63:4D:4A:36:6A:44:7F:5C:15:26:30:67:62:EF:65 Certificate is to be certified until Mar 27 05:47:47 2018 GMT (365 days) Sign the certificate? [y/n]: 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated
5. 到此客户端证书签发完成,将新签发的证书移动至/etc/pki/CA/certs目录中,客户端证书通过scp传送回客户端
~]# mv /etc/pki/CA/newcerts/01.crt /etc/pki/CA/certs/www.mright.xyz.crt #可以通过证书名字来标识该证书是为哪个客户端签发 ~]# scp /etc/pki/CA/certs/www.mright.xyz [email protected]:/tmp/ 在B主机上将证书放置在/etc/httpd/ssl/目录中 ~]# mv /tmp/www.mright.xyz.crt /etc/httpd/ssl/
6. 所有操作均已完成,将B主机生成的请求证书以及传送至A主机目录下的/tmp目录中的请求证书删除
#B主机: ~]# rm -f /etc/httpd/ssl/httpd.csr #A主机: ~]# rm -f /tmp/httpd.csr
第三章、 搭建一套DNS服务器,负责解析magedu.com域名(自行设定主机名及IP)
(1) 能够对一些主机名进行正向解析和逆向解析;
(2) 对子域cdn.magedu.com进行子域授权,子域负责解析对应子域中的主机名;
(3) 为了保证DNS服务系统的高可用性,设计一套方案,并写出详细实施过程;
设定情境为
A:192.168.0.10 为DNS主服务器,主机名为node1.mright.xyz
B:192.168.0.110 为DNS从服务器,主机名为node2.mright.xyz
C:192.168.0.120 为DNS子域服务器,主机名为node3.mright.xyz
现在开始搭建环境,三个服务器默认都已安装bind服务。
~]# yum install bind bind-utils -y
A服务器设置:
1) 配置主DNS服务器全局配置
node1]# vim /etc/named.conf acl local { 192.168.0.10; 192.168.0.110; 192.168.0.120; localhost; }; acl net { 192.168.0.0/24; localhost; 127.0.0.1; }; options { listen-on port 53 { 127.0.0.1;192.168.0.10; }; directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; allow-query { localhost; }; recursion yes; dnssec-enable no; dnssec-validation no; bindkeys-file "/etc/named.iscdlv.key"; managed-keys-directory "/var/named/dynamic"; pid-file "/run/named/named.pid"; session-keyfile "/run/named/session.key"; }; logging { channel default_debug { file "data/named.run"; severity dynamic; }; }; zone "." IN { type hint; file "named.ca"; }; include "/etc/named.rfc1912.zones"; include "/etc/named.root.key";
2) 在/etc/named.rfc1912.zones区域配置文件中设置view视图进行定义区域
注意:要启用view视图定义区域解析时,要将主配置文件中的"."根域名写入到named.rfc1912.zones开头位置,将named.conf中的根域名区域删除。
node1]# vim /etc/named.rfc1912.zones view { match-clients{ local;net; }; //定义视图匹配客户端列表,也就是定义白名单 allow-query { local;net; }; //定义允许查询客户端列表 allow-recursion { local;net; }; //定义允许递归查询请求客户端列表 allow-update { local; }; //定义允许更新区域数据库的客户端列表 allow-transfer { local; }; //定义允许区域传送的主机列表 zone "." IN { type hint; file "named.ca"; }; zone "magedu.com" IN { type master; file "magedu.com.zone"; }; zone "0.168.192.in-addr.arpa" IN{ type master; file "192.168.0.zone"; }; };
3) 主DNS视图配置,acl和本地解析域已经定义完成,现在/var/named/目录中定义magedu.com域的区域文件
注意:创建区域文件时注意其属主属组一定要是root:named否则可能出现无法解析的问题
node1]# touch /var/named/magedu.com.zone && chown named:root /var/named/magedu.com.zone node1]# vim /var/named/magedu.com.zone $TTL 86400 ;定义有效时长为一天 $ORIGIN magedu.com. ;定义全局域名,后续的@或缺省域名可以从此处继承 @ SOA ns1.magedu.com. admin.magedu.com. ( 2017032701;serial当前区域解析库的序列号,由日期+时间+版本号组成 2H;refresh区域刷新时间,此数值可以定义为分钟、小时、天、周,数值越小当前区域的数据保持也就越新,但对服务器的压力越大,可以根据自身需求定义此数值 10M;retry 重试时间,当前区域无法解析时DNS进行重新解析的时长 3D;expire区域过期时长 1D;minTTL 当DNS获得否定答案之后的某个时间之内,都会以此答案返回 ); magedu.com. IN NS ns1.magedu.com. magedu.com. IN NS ns2.magedu.com. magedu.com. IN MX 10 mx1.magedu.com. magedu.com. IN MX 20 mx2.magedu.com. mx1 IN A 192.168.0.10 mx2 IN A 192.168.0.10 ns1 IN A 192.168.0.10 ns2 IN A 192.168.0.110 www IN A 192.168.0.10 www IN A 192.168.0.110 cdn.magedu.com. IN NS ns3.mage.edu.com. * IN CNAME 192.168.0.10 * IN CNAME 192.168.0.110 ns3 IN A 192.168.0.120
node1]# vim /var/named/192.168.0.zone $TTL 86400 $ORIGIN 0.168.192.in-addr.arpa. @ IN SOA ns1.magedu.com. admin.magedu.com. ( 2017032701;serial 1H; refresh 5M; retry 3D; expire 1D; minTTL ) @ IN NS ns1.magedu.com. @ IN NS ns2.magedu.com. 10 IN PTR ns1.magedu.com. 110 IN PTR ns2.magedu.com. 10 IN PTR www.software.com. 110 IN PTR www.software.com.
主DNS配置完成,下边配置从服务器来进行负载均衡,以提高其可用性
4) B主机为从服务器,从服务器的配置比较简单,只需要在named.rfc1912.zones中定义好解析区域即可
node2]# vim /etc/named.rfc1912.zones zone "magedu.com" IN { type slaves; masters { 192.168.0.10; }; file "slave/magedu.com.zone"; }
将此区域定义在视图当中,其他的配置与主DNS服务器的配置相同,此处不做说明。
5) 从服务器设置完成之后,使用dig命令可以将主DNS的区域解析库传送给从服务器
node2]# dig -t axfr www.magedu.com @192.168.0.10
6) 主从服务器全部配置完成之后,接下来将配置cdn.magedu.com子域服务器的配置,C主机为cdn.magedu.com子域服务器,相关安全配置不再赘述,参照主DNS服务器配置。
node3]# vim /etc/named.rfc1912.zones zone "cdn.magedu.com" IN { type master; file "cdn.magedu.com.zone"; }; node3]# touch /var/named/cdn.magedu.com.zone && chown root:named /var/named/cdn.magedu.com.zone node3]# vim /var/named/cdn.magedu.zone $TTL 86400 ; $ORIGIN cdn.magedu.com. ; @ SOA ns.cdn.magedu.com. admin.cdn.magedu.com. ( 2017032701;serial 10M;retry 3D;expire 1D;minTTL ); IN NS ns.cdn.magedu.com. ns IN A 192.168.0.120 www IN A 192.168.0.120 * IN CNAME 192.168.0.120
7) 至此主从DNS以及子域服务器配置完成,可以使用dig命令来看是否成功。
node1]# dig -t NS cdn.magedu.com @192.168.0.10 node1]# dig -t axfr cdn.magedu.com @192.168.0.10
第四章、请描述一次完整的http请求处理过程;
一次完整的HTTP请求过程从TCP三次握手建立连接成功后开始,客户端向服务端发送HTTP请求,服务端接收请求后,解析 HTTP请求,处理完业务逻辑,最后返回一个HTTP的响应给客户端。下面说下具体流程。
1) 建立连接:客户端与服务器建立TCP连接,域名-->找到对应IP-->三次握手(syn,ack)后建立连接;
2) 发送请求:打开一个连接后,客户端把请求信息发送到服务器的相应端口上,完成请求动作提交;
3) 发送响应:服务器在处理完客户端请求之后,要向客户端发送响应消息;
4) 关闭连接:客户端和服务器端都可以关闭套接字来结束TCP/IP对话。
第五章、httpd所支持的处理模型有哪些,他们分别使用于哪些环境。
httpd所支持的事务处理模型有三种分别为prefork(多进程模型)、worker(多线程模型)、event(事件驱动模型)。
这三种模型各工作特性都不一样,下边简单说下其特性。
prefork:多进程模型,每个进程负责响应一个请求。prefork模型在工作时,由一个主进程负责生成n个子进程,即工作进程。每个工作进程响应一个用户请求,httpd启动时会预先生成多个空闲进程,随时等待请求连接,但受限于linux的特性,工作进程数上限为1024个,如果超出该数量,服务器性能会急剧降低。因而,prefork模型的最大并发连接数量为1024.由于每个工作进程相对独立,就算崩溃了,也不会对其它进程有明显影响。所以该模型的特点是稳定可靠,适合于并发量适中而又追求稳定的用户使用。
worker:多线程模型,每个线程响应一个请求。worker模型在工作时,主进程负责生成多个子进程,每个子进程负责生成多个线程,每个线程响应一个用户请求。同prefork模型相同httpd使用worker模型启动初始化时也会预先创建一些空闲线程来等待用户连接。如果生成进程数为m,线程数为n,则并发数可达到m*n个。但由于在linux中,原生不支持线程,且进程本身就足够轻量化,与线程的区别不是很大,因而,worker模型在linux环境中的实际性能表现与prefork相差无几。
event:事件驱动模型,每个线程响应n个用户请求。event模型工作时,由主进程生成m个子进程,每个单独的子进程可响应n个用户请求。因而event的并发数量可达到m*n个,同时因为event的子进程为一对多,节省大量CPU进程切换上下文的时间,也没有了linux系统的1024个进程限制,所以,event模型是三种模型中效率最高的一种,可以突破10K的限制(即并发数1W),对海量的系统特别适用。
第六章、建立httpd服务器(基于编译的方式进行),要求提供两个基于名称的虚拟主机;
(a) www1.stuX.com,页面文件目录为/web/vhosts/www1,错误日志为/var/log/httpd/www1.err,访问日志为/var/log/httpd/www1.access。
(b) www2.stuX.com,页面文件目录为/web/vhosts/www2,错误日志为/var/log/httpd/www2.err,访问日志为/var/log/httpd/www2.access。
(c) 为两个虚拟主机建立各自的主页文件index.html,内容分别为其对应的主机名。
(d) 通过www1.stuX.com/server-status输出httpd工作状态相关信息,且只允许提供账号密码访问(status:status)。
1. 编译安装httpd此前的文章中已经提到过本次仅给出安装命令,详细过程请见博客地址:http://goodjoe.blog.51cto.com/9173556/1902439
~]# groupadd -g 80 apache ~]# useradd -g apache -u 80 -s /sbin/nologin apache ~]# mkdir -p /web/vhosts/www{1,2} ~]# chmod -R apache:apache /web/hosts ~]# echo "www1.stu3.com" > /web/hosts/www1/index.html ~]# echo "www1.stu5.com" > /web/hosts/www1/index.html ~]# ./configure --prefix=/usr/local/apr ~]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr ~]# ./configure --prefix=/usr/local/httpd --sysconfdir=/etc/httpd --enable-so --enable-ssl --enable-cgi --enable-rerite --with-zlib --with-pcre --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork
2. 安装完成之后,创建两个虚拟主机
~]# vim /etc/httpd/httpd.conf #DocumentRoot "/usr/local/httpd/htdocs" #要启用虚拟机先要将中心主机注释掉 Include /etc/httpd/extra/httpd-vhosts.conf #将虚拟机那行的注释去掉,启用虚拟机 ~]# vim /etc/httpd/extra/httpd-vhosts.conf #DocumentRoot <VirtualHost *:80> ServerName www1.stu3.com DocumentRoot "/web/vhosts/www1" ErrorLog "/var/log/httpd/www1.err" CustomLog "/var/log/httpd/www1.access" combined <Directory "/web/vhosts/www1"> Options Indexes FollowSymLinks AllowOverride None <RequireAll> Require all granted </RequireAll> </Directory> </VirtualHost> <VirtualHost *:80> ServerName www2.stu5.com DocumentRoot "/web/vhosts/www2" ErrorLog "/var/log/httpd/www2.err" CustomLog "/var/log/httpd/www2.access" combined <Directory "/web/vhosts/www2"> Options Indexes FollowSymLinks AllowOverride None <RequireAll> Require all granted </RequireAll> </Directory> </VirtualHost>
3. 在stu3虚拟机中加入server-status查看虚拟机状态
<VirtualHost *:80> ServerName www1.stu3.com DocumentRoot "/web/vhosts/www1" ErrorLog "/var/log/httpd/www1.err" CustomLog "/var/log/httpd/www1.access" combined <Directory "/web/vhosts/www1"> Options Indexes FollowSymLinks AllowOverride None <RequireAll> Require all granted </RequireAll> </Directory> <Location "/server-status"> SetHandler server-status Options NONE AllowOverride NONE AuthType Basic AuthName "status www1.stu3.com" AuthUserfile "/etc/httpd/conf.d/.htpasswd" AuthGroupfile "/etc/httpd/conf.d/.htgroup" Require valid-user #授权.htpasswd文件中所有的用户允许访问该页面 Require group webadmin #授权htgroup文件中定义的组中的所有用户可以访问该页面 </Location> </VirtualHost>
设置完成之后,添加stu3用户可以访问此页面
~]# htpasswd -c -m /etc/httpd/conf.d/.htpasswd stu3 ~]# htpasswd -m /etc/httpd/conf.d/.htpasswd stu1 ~]# vim /etc/httpd/conf.d/.htgroup webadmin:stu1 #生成group组
4.所有配置均已完成,现在测试下配置是否成功
图示3
图示4
图示5
第七章、为第6题中的第2个虚拟主机提供https服务,使得用户可以通过https安全的访问此web站点;
(1) 要求使用证书认证,证书中要求使用的国家(CN)、州(HA)、城市(ZZ)和组(MageEdu)。
(2) 设置部门为Ops,主机名为www2.stuX.com,邮件为[email protected]。
在第二章中提到了私有CA的搭建以及客户端证书的申请与签发,现在为www2.stu5.com配置https服务,配置如下
1. 修改httpd.conf主配置文件,使httpd服务器支持https加密通信
~]# vim /etc/httpd/httpd.conf #此处是httpd-2.4版本,其他版本可能配置文件存储路径不同,但名称一致 LoadModule socache_shmcb_module modules/mod_socache_shmcb.so LoadModule ssl_module modules/mod_ssl.so LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
#将以上四个模块前的#号去掉,之后修改https的配置文件
2. 修改https的配置文件
~]# vim /etc/httpd/extra/httpd-ssl.conf <VirtualHost 192.168.30.10:443> #此处修改地址为监听IP地址,或者主机名 DocumentRoot "/web/vhosts/www1" ServerName www1.stu3.com ErrorLog "/var/log/httpd/ssl_error.log" TransferLog "/var/log/httpd/ssl_access.log" <Directory "/web/vhosts/www1"> Options None AllowOverride None <RequireAll> Require all granted </RequireAll> </Directory> SSLEngine on SSLCertificateFile "/etc/httpd/ssl/www1.stu3.com.crt" SSLCertificateKeyFile "/etc/httpd/ssl/httpd.key" </VirtualHost>
3. ssl文件配置完成后保存,重新加载httpd配置文件后测试
~]# httpd -t #测试配置文件是否有错误,避免重启或重新加载过程失败 ~]# service httpd reload
图示6
第八章、建立samba共享,共享目录为/data,要求描述完整过程
(1) 共享名为shared,工作组为mageedu。
(2) 添加组develop,添加用户gentoo,centos和ubuntu,其中gentoo和centos以develop为附加组,ubuntu不属于develop组,密码均为用户名。
(3) 添加samba用户gentoo,centos和ubuntu,密码均为"mageedu"。
(4) 此samba共享shared仅允许develop组具有写权限,其他用户只能以只读方式访问。
(5) 此samba共享服务仅允许来自于172.16.0.0/16网络的主机访问。
安装前先将前期环境搭好,测试系统为CentOS 7.2 版本,IP为192.168.30.10这台主机作为samba服务器向内网其他主机提供服务,samba服务所依赖的的端口有udp:137/138,tcp:139/445,所以先要将防火墙的这些端口放行以免后期出现不必要的麻烦(不建议动不动就将防火墙关闭)。
1、设置防火墙放行相应的端口,创建samba用户和用户组,最后创建共享目录并修改其目录权限
~]# iptables -A INPUT -d 192.168.30.10 -p udp -m multiport --dports 137,138 -j ACCEPT ~]# iptables -A INPUT -d 192.168.30.10 -p tcp -m multiport --dports 139,445 -m state --state NEW -j ACCEPT ~]# groupadd develop ~]# useradd -aG develop -s /sbin/nologin gentoo ~]# useradd -aG develop -s /sbin/nologin centos ~]# useradd -s /sbin/nologin ubuntu ~]# smbpasswd -a gentoo ~]# smbpasswd -a centos ~]# smbpasswd -a ubuntu ~]# mkdir /data ~]# chgrp develop /data ~]# chmod 2770 /data
2、安装samba和samba-client服务
~]# yum install samba samba-client -y 安装完成之后可以进行测试一下是否成功 ~]# systemctl start nmb.service #centos7与centos6相比,将nmb单独作为启动服务 ~]# systemctl start smb.service ~]# ss -tulnp
3、samba服务启动之后,接下来创建共享目录,对外提供服务
~]# vim /etc/samba/smb.conf [global] interfaces = 192.168.0.10/24 //samba服务监听IP地址 workgroup = magedu //当前samba服务器所属工作组 security = user //设定安全级别,samba服务有三种认证级别,share(匿名共享)、user(使用samba自我管理的用户名和密码进行登录访问,其中用户名必须是系统用户,密码则是使用smbpasswd管理的存储在passdb backend 指定的dbsam数据库中)、domain(使用外部服务器的密码,亦即 SAMBA 是客户端之意,如果设定这个项目, 你还得要提供password server = IP』的设定值才行)。 map to guest = bad user //实现匿名无须交互输入用户名和密码 guest account = smbuser //匿名用户映射为smbuser用户 passdb backend = tdbsam //指定samba用户密码存储位置及存储格式 [shared] //共享目录文件名 comment = "this is a common directory" //共享目录描述信息 path = /data //设定共享的目录 browseable = yes //共享目录是否可以被查看 public = yes //是否公开此目录 guest ok = yes //是否对匿名用户开放 read list = guest //只读用户列表 write list = @develop//对共享目录可写入用户列表 allow hosts = 172.16.0.0/16 //访问shared共享目录主机白名单
4、 测试samba共享
~]# smbclient -L 192.168.0.10 -Ucentos //使用samba客户端工具使用centos用户查看服务器上有哪些共享目录 Enter centos‘s password: Domain=[WORKGROUP] OS=[Windows 6.1] Server=[Samba 4.4.4] Sharename Type Comment --------- ---- ------- print$ Disk Printer Drivers shared Disk develop data dir IPC$ IPC IPC Service (Samba 4.4.4) centos Disk Home Directories ~]# smbclient //192.168.0.10/shared -Ucentos //连接samba服务器
在windows下使用资源管理器也可以访问共享目录
图示7
图示8
终章、搭建一套vsftp文件共享服务,共享目录为/ftproot,要求描述完整过程。
(1) 基于虚拟用户的访问形式。
(2) 匿名用户只允许下载,不允许上传。
(3) 禁锢所有的用户于其家目录中。
(4) 限制最大并发连接数为200。
(5) 匿名用户的最大传输速率512KB/s。
(6) 虚拟用户的账号存储在mysql数据库当中。
(7) 数据库通过NFS进行共享。
使用vsftp搭建ftp服务器需要做的前期工作跟之前讲到过的samba类似,无非是iptables防火墙放行相关端口,创建ftp账号、共享目录以及修改目录权限。下面说下具体操作过程,前提条件假定ftp服务器IP为192.168.0.10/24
1、vsftpd运行所需要的端口共分为两类,一类是命令操作,主要是向服务器发起请求比如,下载请求操作;另一类是数据连接操作,下载请求通过之后服务器就会通过其他随机端口来建立数据连接,进行数据传输操作。
~]# iptables -A INPUT -d 192.168.0.10 -p tcp -m multiport --dport 21,22,80,3306 -m state --state NEW -j ACCEPT ~]# yum install vsftpd -y ~]# systemctl start vsftpd.service ~]# ss -nat
安装完成之后,启动服务,此时在浏览器上输入ftp//192.168.0.10应该可以访问了。
2、 启动vsftp服务后,默认配置是匿名用户只能下载文件,现在更改下其他的配置信息
~]# vim /etc/vsftpd/vsftpd.conf chroot_local_user=YES #将所有用户禁锢在家目录中 anon_max_rate=512KB/s #限制匿名用户最大传输速率 max_clients=200 #限制最大连接并发数
3、本次使用mysql存储vsftpd访问服务的用户名和密码列表,并将mysql数据库存储在NFS文件中进行共享,下边进行NFS和mysql的安装与配置
~]# yum install nfs-utils -y #安装NFS文件系统 ~]# vim /etc/exports /mysql/data/ 192.168.0.0/24(rw,async,nohide,anonuid=27,anongid=27) ~]# service nfs start #启动nfs之前,首先要确保/etc/hosts文件内容配置是否正确,否则启动失败 ~]# yum -y install mysql-server pam_mysql ~]# vim /etc/my.cnf #修改mysql配置文件,如下 datadir=/mysql/data/mysql sockets=/mysql/data/mysql/mysql.socket innodb_file_per_table=on #数据库中每张表都使用独立的数据引擎 skip_name_resolve=on #禁用主机名反解 ~]# cp -a /var/lib/mysql /mysql/data/ #将mysql默认安装的数据库移动至/mysql/data目录中 ~]# service mysqld start ~]# mysql_secure_installition #运行此命令完成数据库安全初始化 ~]# mysql -uroot -p mariadb> GRANT SELECT ON vsftpd.* TO ‘vsftp‘@‘localhost‘ IDENTIFIED BY ‘vsftp123‘; mariadb> GRANT SELECT ON vsftpd.* TO ‘vsftp‘@‘127.0.0.1‘ IDENTIFIED BY ‘vsftp123‘; mariadb> CREATE DATABASE vsftpd; mariadb> use vsftpd; mariadb> create table users ( id int AUTO_INCREMENT NOT NULL, name char(20) binary NOT NULL, password char(48) binary NOT NULL, primary key(id) ); mariadb> insert into users(name,password) values(‘centos‘,password(‘centos‘)); mariadb> insert into users(name,password) values(‘gentoo‘,password(‘gentoo‘));
4. 创建vsftp认证文件
~]#vim /etc/pam.d/vsftpd.mysql #添加如下两行 auth required /lib64/security/pam_mysql.so user=vsftp passwd=vsftp123 host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2 account required /lib64/security/pam_mysql.so user=vsftp passwd=vsftp123 host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
5、建立虚拟用户映射的系统用户及对应的目录
~]# useradd -s /sbin/nologin -d /var/ftproot vuser ~]# chmod go+rx /var/ftproot
6、在vsftpd.conf配置文件中加入以下选项
~]# vim /etc/vsftpd/vsftpd.conf anonymous_enable=NO local_enable=YES write_enable=YES anon_upload_enable=NO anon_mkdir_write_enable=NO chroot_local_user=YES guest_enable=YES guest_username=vuser pam_service_name=vsftpd.mysql
7、配置完成之后重启或重新载入配置即可,但要使用每个虚拟用户有不同的使用权限,则需要为每个用户配置单独的配置文件。
~]# mkdir /etc/vsftpd/vusers_config/ ~]# touch /etc/vsftpd/vusers_config/{centos,gentoo} ~]# vim /etc/vsftpd/vusers_config/centos #配置centos用户可以上传文件,而gentoo则只可以下载文件。 anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES
8、至此所有的配置均结束,测试下吧。
图示9
图示10