这篇文章应该是有史以来,历时最长最纠结的一次,毫不夸张的讲总结到词穷的地步了。现在每次一到理论知识梳理的过程,总有种茶壶里的饺子,稍微懂点但有说不出来,哎!这辈子估计当不了老师了,话不多说还得撸起袖子接着写不是。

第一章、详细描述一次加密通讯的过程,结合图示最佳。

HTTPS在基于SSL建立会话前,会经历4次握手过程以获取会话密钥。流程如下:

wKioL1jcpUbQYUHiAADmbNIQiIg015.png

    图示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

wKiom1jcrVqTBjJ2AAB6R833tV0835.jpg

图示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 []:admin@mright.xyz #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 []:test@mright.xyz #CA管理员邮箱
~]# scp /etc/httpd/ssl/httpd.csr test@192.168.0.10:/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              = hello@12.com
    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  test@192.168.0.11:/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.所有配置均已完成,现在测试下配置是否成功

wKiom1jcsHjikrcVAAA8BjHiEKs952.jpg

图示3

wKioL1jcsQTTZSDCAAFIyhy7-Bw402.jpg

图示4

wKioL1jcsQXhR9nTAAGMJUPQNZQ354.jpg

图示5



第七章、为第6题中的第2个虚拟主机提供https服务,使得用户可以通过https安全的访问此web站点;

(1) 要求使用证书认证,证书中要求使用的国家(CN)、州(HA)、城市(ZZ)和组(MageEdu)。

(2) 设置部门为Ops,主机名为www2.stuX.com,邮件为admin@stuX.com。

在第二章中提到了私有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

wKioL1jcsL-DXwgIAAAkJ06Fb5s408.jpg

图示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下使用资源管理器也可以访问共享目录

wKiom1jcsgigzUq-AABNY4GR-2w506.jpg

图示7

wKiom1jcsiGxf6kdAAB6YfCbdME539.jpg

图示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、至此所有的配置均结束,测试下吧。

wKioL1jcswejQYInAAC7Gq66Fvw498.jpg

图示9

wKiom1jcszCB4xk2AABQlwZfEKY362.jpg图示10