一、限制本地主机的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
二、在工作时间,即周一到周五的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
四、拒绝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
六、控制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
2、写一个脚本,生成10个随机数,并按从小到大进行排序;
#!/bin/bash i=1 while [ $i -le 10 ] do echo $RANDOM ((i+=1)) done |sort -n
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分离。
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一致)