L9 综合练习题

一、限制本地主机的web服务器在周一不允许访问;新请求的速率不能超过100个每秒;web服务器包含了admin字符串的页面不允许访问;web服务器仅允许响应报文离开本机;

iptables -I INPUT 1 -m state --state ESTABLISHED -j ACCEPT
iptables -I INPUT 2 -p tcp --dport 80 -m time --timestart 00:00:00 --timestop 23:59:59 --weekdays Mon -j DROP
iptables -I INPUT 3 -p tcp --dport 80 -m state --state NEW -m limit --limit 100/s --limit-burst 2 -j ACCEPT
iptables -I INPUT 4 -p tcp --dport 22 -j ACCEPT
iptables -P INPUT DROP
iptables -I OUTPUT 1 -m state --state ESTABLISHED -j ACCEPT
iptables -I OUTPUT 3 -p tcp --sport 80 -m string --algo kmp --string "admin" -j DROP
iptables -P OUTPUT DROP

wKiom1ZMJnnQ4m23AACYPtjFFyM930.png


二、在工作时间,即周一到周五的8:30-18:00,开放本机的ftp服务给172.16.0.0网络中的主机访问;数据下载请求的次数每分钟不得超过5个;

1,先加载模块
# modprobe ip_nat_ftp# lsmod | grep ftpip_nat_ftp              7361  0ip_nat                 20973  1 ip_nat_ftpip_conntrack_ftp       11569  1 ip_nat_ftpip_conntrack           53409  5 ip_nat_ftp,ip_nat,ip_conntrack_ftp,xt_connlimit,xt_state
 
iptables -I INPUT 1 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -I INPUT 2 -s 172.168.0.0/16 -p tcp -m multiport --dports 20:21  -m limit --limit 5/m -m time --timestart 08:30:00 --timestop 18:00:00 --weekdays 1,2,3,4,5 -j ACCEPT
iptables -I INPUT 3 -p tcp --dport 22 -j ACCEPT
iptables -P INPUT DROP

iptables -I OUTPUT 1 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -P OUTPUT DROP


三、开放本机的ssh服务给172.16.x.1-172.16.x.100中的主机,x为你的座位号,新请求建立的速率一分钟不得超过2个;仅允许响应报文通过其服务端口离开本机;

iptables -I INPUT 1 -m state --state ESTABLISHED -j ACCEPT
iptables -R INPUT 2 -m iprange --src-range  172.16.0.1/16-172.16.0.100/16 -p tcp --dport 22 -m state --state NEW -m limit --limit 2/m --limit-burst 2 -j ACCEPT
iptables -P INPUT DROP
iptables -I OUTPUT 1 -m state --state ESTABLISHED -j ACCEPT
iptables -P OUTPUT DROP

spacer.gifwKioL1ZMJweCrOA7AACOgGA_Fso571.png


四、拒绝TCP标志位全部为1及全部为0的报文访问本

第一个列表用作参数范围检查,第二个列表用作参数匹配(有则为1)
全部为0
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP             
#NONE 包(所有标识bit都没有设置)主要是扫描类的数据包
全部为1
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP              
#ALL包(所有的标注bit都被设置了)也是网络扫描的数据包


五、允许本机ping别的主机;但不开放别的主机ping本机;

iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A INPUT  -p icmp --icmp-type 0 -j ACCEPT
iptables -P INPUT DROP
iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
iptables -P OUTPUT DROP

wKioL1ZMJxTTFGClAACA5yUG8Ts738.png

spacer.gif

六、控制vsftpd仅允许172.16.0.0/255.255.0.0网络中的主机访问,但172.16.100.3除外;对所被被拒绝的访问尝试都记录在/var/log/tcp_wrapper.log日志文件中;

vim /etc/vsftpd/vsftpd.conf
tcp_wrappers=YES
[root@node1 ~]# ldd `which vsftpd` | grep wraplibwrap.so.0 => /lib64/libwrap.so.0 (0x00007f6c42524000)  #支持tcpwarp
两个配置文件 /etc/hosts.allow 、/etc/hosts.deny 这两个文件的关系为allow文件优先,若分析到的没有记录在allow文件当中,则以deny文件来判断。
vim /etc/hosts.allow
vsftpd: 172.16. EXCEPT 172.16.100.3
vim /etc/hosts.deny
vsftpd: ALL :spawn echo "`date` deny %c to %s vsftpd" >>/var/log/tcp_wrapper.log


七、脚本编程类(数组练习)

    1、写一个脚本:定义一个数组,数组元素为/var/log目录下所有以.log结尾的文件的名字;显示每个文件的行数;

#!/bin/bash
a=(`ls *.log`)
n=0
for i in ${a[*]}
do
        wc -l ${a[$n]}
        ((n+=1))
done

wKioL1ZMJ_KTNGlfAAAwriw0w8w657.png

    2、写一个脚本,生成10个随机数,并按从小到大进行排序;

#!/bin/bash
i=1
while [ $i -le 10 ]
do
        echo $RANDOM
        ((i+=1))
done
|sort -n


wKioL1ZMKDDhLr57AAAsmOnijX4349.png   

     3、写一个脚本,能从所有同学中随机挑选一个同学回答问题;进一步地:可接受一个参数,做为要挑选的同学的个数;


八、sudo练习


/etc/sudoers的通用格式为: 

user host=(run_as) [NOPASSWD:] command


user  host run_as  command 
user:一位或几位用户,在/etc/group中可以用一个%代替它,组对象的名称一定要用百分号%开头。 
host:一个或几个主机名; 
run_as:作为哪个用户运行,常见选项是root和ALL 
command:想让用户或组运行的一个或几个根级别命令。


Cmnd_Alias CMND_LVS:可以将命令集合为一个变量,之后直接引用。用户,主机都可以如此定义。


    1、授权centos用户可以运行fdisk命令完成磁盘管理,以及使用mkfs或mke2fs实现文件系统管理;

centos  ALL=(root)     NOPASSWD: /sbin/fdisk, /sbin/mke2fs, /sbin/mkfs


    2、授权gentoo用户可以运行逻辑卷管理的相关命令

Cmnd_Alias CMND_LVS = /sbin/lvm, /sbin/lvmchange, /sbin/lvmconf, /sbin/lvmdiskscan, /sbin/lvmdump, /sbin/lvmetad, /sbin/lvmsadc, /sbin/lvmsar
gentoo ALL=(root)       NOPASSWD: CMND_LVS



九、vsftpd及pam类

    1、实现基于虚拟用户认证的vsftpd功能;

    2、虚拟用户的账号及密码信息存储在mysql当中。

(1)安装包:

yum install g++ vsftpd mysql-server mysql-devel pam-devel -y

在PAM中默认是没有mysql认证模块的,所以要下载源码自己手动安装

[root@localhost ~]# tar -xf pam_mysql-0.7RC1.tar.gz -C /usr/src/

[root@localhost ~]# cd /usr/src/pam_mysql-0.7RC1

[root@localhost pam_mysql-0.7RC1]# ./configure �Cwith-pam=/lib64/security/  #文件需要导入64位的目录下

[root@localhost pam_mysql-0.7RC1]# make && make install


(2)配置mysql

vsftp数据库:vsftpdb

用户表:ftptb

mysql登录用户:vsftpduser 密码 123456

映射的虚拟用户:u1

root@localhost ~]# service mysqld start

[root@localhost ~]# mysql -u root -p

首先先创建vsftp的数据库

mysql> CREATE DATABASE vsftpddb;         ---ftp数据库

然后创建一个用户表

mysql> use vsftpddb

mysql> create table ftptb (            ---ftp用户表

-> id int AUTO_INCREMENT NOT NULL,

-> name varchar(20) NOT NULL UNIQUE KEY,

-> passwd varchar(20) NOT NULL,

-> primary key(id)

-> ); 

添加vsftpddb的数据库帐号

mysql> insert into users(name,passwd) values(‘u1’,password(’123456′)); \   --映射的虚拟用户

然后创建vsftpddb的数据库账户,为了安全,只授予查询权限

mysql> GRANT select on vsftpddb.* to vsftpduser@localhost identified by '123456';  ---mysql登录用户

mysql> GRANT select on vsftpddb.* to vsftpduser@127.0.0.1 identified by '123456' ;


(3)配置vsftpd

vim /etc/vsftpd/vsftpd.conf

anonymous_enable=YES

anon_other_write_enable=YES

local_enable=YES

write_enable=YES

local_umask=022

anon_upload_enable=YES

anon_mkdir_write_enable=YES

dirmessage_enable=YES

xferlog_enable=YES

connect_from_port_20=YES

xferlog_std_format=YES

listen=YES

userlist_enable=YES 

tcp_wrappers=YES

pam_service_name=vsftpd.mysql #主要修改这一行,指定使用vsftpd.mysql这个pam配置文件调用pam认证 

guest_enable=YES #开启来宾账户 

guest_username= mysqlftp #映射来宾账户,这个账户将会被映射为mysql数据库中的账户 

user_config_dir=/etc/vsftpd/vsftpd_user_conf #创建mysql每个虚拟用户的配置目录 


(4)配置pam文件

[root@localhost ~]# cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.mysql #复制原来的vsftp认证方法,在此基础上添加mysql认证

[root@localhost ~]# vim /etc/pam.d/vsftpd.mysql

auth required /lib64/security/pam_mysql.so user=vsftpduser passwd=123456 host=localhost db=vsftpddb table=ftptb usercolumn=name passwdcolumn=passwd crypt=2

account required /lib64/security/pam_mysql.so user=vsftpduser passwd=123456 host=localhost db=vsftpddb table=ftptb usercolumn=name passwdcolumn=passwd crypt=2

说明:

user 访问数据库用户名

passwd 访问数据库用户密码

host 数据库主机

db 数据库名

table 表名

usercolumn 用户列名

passwdcolumn 密码列名

crypt 密码验证机制;0 代表明文,1 代表DES 加密,2 代表Mysql的password()函数加密,3代表md5算法,4代表sha加密。


(5)创建虚拟用户

添加mysql用户认证的虚拟用户

[root@localhost ~]# useradd mysqlftp -d /var/ftp/pub/mysqlftp

修改mysql虚拟账户的权限

[root@localhost ~]# chown mysqlftp:mysqlftp -R /var/ftp/pub/mysqlftp

创建mysql虚拟账户配置文件夹

[root@localhost ~]# mkdir /etc/vsftpd/vsftpd_user_conf

在此文件夹下配置每个mysql虚拟账户的配置文件

[root@localhost vsftpd_user_conf]# touch u1

local_root=/var/ftp/pub/mysqlftp/u1    #其余配置可以自己按需求写,这里只限制了mysql虚拟用户的个人文件夹

在u1目录中创建一个文件验证结果

[root@localhost vsftpd_user_conf]# touch /var/ftp/pub/mysqlftp/u1/l.txt


六、高级应用类(中级班选做,高级班必做)

    1、一共3台服务器,请合理安排资源分配;

    2、通过Nginx的反向代理实现LNMP架构的负载均衡,后端服务内容为wordpress论坛,要求访问任何一台后端web服务器,都能获取一致的最新数据;

    3、后端nginx和php分离。

wKiom1ZNWUvzsifCAADWZZqbVpM067.png

Nginx日志记录客户端真实ip

在proxy上设置:(安装时需要添加--with-http_realip_module)
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;

set_real_ip_from ip;(这个ip填写的是proxy的ip)
real_ip_header X-Forwarded-For;

在web后端设置:(安装时需要添加--with-http_realip_module)
set_real_ip_from ip;(这个ip填写的是proxy的ip)
real_ip_header X-Forwarded-For;
在log_format里添加$remote_addr或者$http_x_forwarded_for参数。


 X-Forwarded-For:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项。它不是RFC中定义的标准请求头信息,
标准格式如下:
X-Forwarded-For: client1, proxy1, proxy2
从标准格式可以看出,X-Forwarded-For头信息可以有多个,中间用逗号分隔,
第一项为真实的客户端ip,剩下的就是曾经经过的代理或负载均衡的ip地址,经过几个就会出现几个。
当经过多个nginx代理时,其X-Forwarded-For头信息应该为客户端IP,Nginx1,Nginx2,、、、。
在默认情况下,Nginx并不会对X-Forwarded-For头做任何的处理,除非用户使用proxy_set_header 参数设置:
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
$proxy_add_x_forwarded_for变量包含客户端请求头中的"X-Forwarded-For",与$remote_addr用逗号分开,如果没有"X-Forwarded-For" 请求头,则此时$proxy_add_x_forwarded_for等于$remote_addr。



注意事项:

1,后端nginx真实IP记录;

2,php-fpm默认监听:lisent = 127.0.0.1:9000 需要修改为:lisent = 9000;

3,php-fpm默认使用apache用户,用户组,修改为nginx用户,组;(三台主机都使用nginx用户,uid,gid一致)


你可能感兴趣的:(练习)