Linux Service and Security
Linux Service and Security大纲
OpenSSL(ssl/tls)
OpenSSH(ssh)
bind(dns)
web(http):httpd(apache),php,mariadb(mysql),LAMP,nginx(tengine,openresty),lnmp
dhcp,pxe
iptables
sudo,pam,nsswitch
2016/01/06
加密和解密技术基础(01)
资源子网:用户空间的协议,都可以有软件自己的协议,具体的软件
通信子网:
传输层协议:TCP,UDP,SCTP
port:进程地址,进程要向内核注册使用某端口(独占端口)
同一主机上的进程间通信:IPC,message queue,shm,semerphor
不同主机上的进程间通信:socket
Cip:port <--> Sip:port
套接字有三类??
cip:55673 <--> sip:80
监听模式:LISTEN(ip:port)
很多应用层的协议没有加解密的功能
http协议本身不具备加解密功能
应用层和传输层之间 半层协议
SSL : Secure Sockets Layer安全的套接字层
1、加解密
2、基于网络通信把密钥分发
http à ssl à https
安全的目标:
保密性:confidentiality
完整性:integrity
数据完整性
系统完整性
可用性:availability
常见的攻击类型:
威胁到保密性的攻击:窃听、通信量分析
威胁到完整性的攻击形式:更改、伪装、重放、否认
威胁到可用性的攻击形式:拒绝服务(DoS)
为了达到安全目标所用到的解决方案:
技术:解密和解密
服务:用于抵御攻击的服务,也即是为了上述安全目标而特地设计的安全服务
加密和解密:
传统加密方法:替代加密算法、置换加密方法
现代加密方法:现代块加密方法、
结合算法,转换为另外一种方式
服务:认证机制、访问控制机制
密码算法和协议
对称加密
非对称加密(公钥加密)
单向加密
认证协议
Linux系统: 上常用的工具
OpenSSL(ssl)、GPG(pgp)
OpenSSL由三部分组成:
第一部分:用于实现加密解密 : libencrypt库
第二部分:libssl库
第三部分:openssl命令行工具
加密算法和协议:
对称加密:加密和解密使用同一个密钥
DES: Data Encryption Standard
3DES: Triple DES
AES: Advanced Encryption Standard (128bits,192bits,256bits,384bits)
Blowfish
Twofish
IDEA
RC6
CST5
特性:
1、加密、解密使用同一个密钥
2、将原始数据分割成为固定大小的块,逐个进行加密
缺陷:
1、密钥过多
2、密钥分发困难
公钥加密:密钥分为公钥与私钥
公钥:从私钥中提取产生,可以公开给所有人(pub key)
私钥:通过工具创建,使用者自己留存,必须保证其私密性(secret key)
特点:用公钥加密的数据,只能使用与之配对的私钥解密,反之亦然
用途:
数字签名:主要在于让接收方确认发送方的身份
密钥交换:发送方用对方的公钥加密一个对称密钥(对称密钥是加密数据和特征码的),并发送给对方
数据加密
加密算法:RSA,DSA,ELGamal
DSS:Digital Signature Standard
DSA:Digital Signature Algorithm
单向加密:即提出数据指纹,只能加密,不能解密
特性:定长输出、雪崩效应
功能:保证完整性
算法:
md5:Message Digest5, 128bits
sha1: Secure Hash Algorithm 1, 160bits
sha224,sha256,sha384,sha512
密钥交换:IKE (Internet Key Exchange)
公钥加密
DH(Deffie-Hellman)两个大素数
双方协商生成p,g,使用明文交换的
A:p,g
B:p,g
双方私下各自生成的数x,y
A:x
A把p^x%g的结果发送给B
A用B发过来的(p^y%g)^x=p^yx%g
B:y
B把p^y%g的结果发送给A
B用A发过来的(p^x%g)^y=p^xy%g
PKI:Public Key Infrastructure
公钥基础设施:
签证机构:CA
注册机构:RA
证书吊销列表:CRL
证书存取库
数字证书格式:X.509 v1,v2,v3
X.509v3:定义了证书的结构以及认证协议标准
版本号
序列号
签名算法ID
发行者名称
有效期限
主体名称
主体公钥
发行者的唯一标识
主体的唯一标识
扩展
发行者的签名
..\..\..\document\SSL_handshake_with_two_way_authentication_with_certificates.svg
SSL:Secure sockets Layer
Netscape:1994
V1.0, V2.0, V3.0
TLS:Transport Layer Security
IETF:1999
V1.0, V1.1, V1,2
建议使用TLSV1.2
分层设计:
1、最底层:基础算法原语的实现,aes,rsa,md5
2、向上一层:各种算法的实现
3、再向上一层:组合算法实现的半成品
4、用各种组件拼装而成的各种成品密码学协议软件
协议的开源实现:OpenSSL
openssl使用详解(03)
回顾
技术:加密和解密,服务
加密算法和协议
对称加密:数据加密(保密性)
公钥加密:身份认证、密钥交换、数据加密(不常用,比对称加密要慢3个数量级)
单向加密:数据完整性
密钥交换:RSA, DH(迪菲-赫尔曼), ECDH(椭圆曲线DH), ECDHE(临时椭圆曲线DH)
SSL/TLS
SSL: 安全套接字层(ssl1.0, ssl2.0, ssl3.0)
TLS: 传输层安全(tls1.0, tls1.1, tls1.2(目前主流), tls1.3)
工具OpenSSL
libcrypto
libssl
openssl
SSL会话主要三步:
1、客户端向服务器端索要并验证证书
2、双方协商生成"会话密钥"
3、双方采用"会话密钥"进行加密通信
SSL Handshake Protocal
第一阶段:ClientHello:
发送自己支持的协议版本,比如tls1.2
客户端生成一个随机数,稍后用户生成"会话密钥"
支持的加密算法,比如AES、RSA、3DES
支持的压缩算法
第二阶段:ServerHello
确认使用的加密通讯协议版本,比如tls1.2
服务器端生成一个随机数,稍后用于生成"会话密钥"
确认使用的加密方法
发送服务器证书
(索要客户端证书)
第三阶段:
验证服务器证书,在确认无误后,取出其公钥(验证发证机构、证书完整性、证书的持有者、证书有效期、验证吊销列表)
发送以下信息给服务器端
发送一个随机数,用于服务器上的公钥加密
编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送
客户端握手结束通知
第四阶段
收到客户端发来的第三个随机数pre-master-key后,计算生成本次会话所用到的"会话密钥"
向客户端发送如下信息
编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送
服务端握手结束通知
sshPKI:公钥基础设施
签证机构:CA
注册机构:RA
证书吊销列表:CRL
证书存取库
OpenSSL
组件:
libcrypto,libssl主要开发者使用
openssl:多用途命令行工具
openssl众多子命令,分为三类
标准命令
消息摘要命令(dgst子命令)
加密命令(enc子命令)
标准命令:enc, ca, req, genrsa, ...
对称加密:
工具:openssl enc, gpg
支持的算法:3des,aes,blowfish,towfish
enc命令使用方法:
加密:~]# openssl enc -e -des3 -a -salt -in fstab -out fstab.ciphertext
解密:~]# openssl enc -d -des3 -a -salt -out fstab -in fstab.ciphertext
单向加密工具
主要用于取数据特征码
# openssl dgst FILE ...
# md5sum FILE ...
# sha1sum FILE ...
# sha224sum FILE ...
# sha384sum FILE ...
# sha512sum FILE ...
dgst命令
# openssl dgst -md5 /PATH/TO/SOMEFILE
[root@localhost ~]# md5sum fstab
36417d4122a5e7be47e4d7af793a7a81 fstab
[root@localhost ~]# openssl dgst -md5 fstab
MD5(fstab)= 36417d4122a5e7be47e4d7af793a7a81
生成用户密码工具
# passwd
# openssl passwd
# openssl passwd -1 -salt SALT
[root@localhost ~]# openssl passwd -1 -salt 12345678
Password:
$1$12345678$0ME5N6oDyoEAwUp7b5UDM/
生成随机数
# openssl rand
# openssl rand -base64 NUM //基于文本的随机数
[root@localhost ~]# openssl rand -base64 10
HF8LJsVGU5ABFQ== 有个固定的格式特征就是双等号==
# openssl rand -hex NUM //生成十六进制数格式的随机数
[root@localhost ~]# openssl rand -hex 10
48cb2f6a1faad637e126
用随机数代替salt的推荐方式
[root@localhost ~]# openssl passwd -1 -salt $(openssl rand -hex 4)
Password:
$1$a7b4fb18$s5kRvVoFXu6bjveBKDv0J0
Linux系统上的随机数生成器
/dev/random 仅从熵池返回随机数,随机数用尽,阻塞
/dev/urandom 从熵池返回随机数,随机数用尽,会利用软件生成伪随机数,非阻塞。伪随机数不安全
熵池中随机数的来源:
硬盘IO中断时间间隔
键盘IO中断时间间隔
公钥加密
加密解密: RSA, ELGamal
工具: openssl rsautl,gpg
数字签名: RSA, DSA, ELGamal
工具: openssl rsautl,gpg
密钥交换:DH
生成密钥
(1)生成私钥
# (umask 077;openssl genrsa -out /PATH/TO/PRIVATE_KEY_FILE NUM_BITS)
(2)从私钥中提取公钥
# openssl rsa -in /PATH/FROM/PRIVATE_KEY_FILE -pubout
1)显示于屏幕
[root@localhost ~]# openssl genrsa 1024
Generating RSA private key, 1024 bit long modulus
............................++++++
.++++++
e is 65537 (0x10001)
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQCYiuqY8Fmlh+00BrLQiUWWDVotbprL2vahs9FFy/lA+KydDbP8
IZdMk5MgBhVaMkGcXE04BjgVZvXDZo6MNrFOIC1u6ItQW4BlrtOsgMDLdEVirpq5
t6Bn4kV0tWxkM1GuUMcPJrBeVP7mJ+wmS14a4Cz8/hDATl5cr7emCbTwrwIDAQAB
AoGAGT9MytllDQetU+IT8H333XkCRui6iCkKjwLzDSlQbNd7wlbFRmLM5ui5/h/j
otUUlOuWAELPP4OWA6xSxZQ7ziALD5wXz2zEDPwREfPIfC/kiSsyU2oassRFxOLw
NARaiMVKwOVXO7Xv2U0b4UXRD4rU2iqhR2SDt1QFFrKBPBECQQDIuhVTeHhSKwy3
/kQLS5wb6PtsgNJ96zt0q5MYpRe8sft2LjLGZr6trZ9CWyEO1nLIv2xzo6aSv1jL
V2juVlvXAkEAwowpqy2GPtNb72XklHWKJyLErWEv+iXG5bevg7BD4hDu7CrgMn+l
JgqoOm5vnQC+riJ3XuU6ozcUg2/ScKQ26QJBAMf9HuJbVQYI/lMTcpgObSshpd8l
OpNam5JSn+weENhgPDozLUOfertwEQz73qP55cM9dcCBfKUZIE74eAN+52ECQQCo
2V2Q5AIPpQG11Yl+EEXHkbWBhUhOo1rtJW9/rAw+uNOkxdGwAnkjezxm+lKEwZC9
MczI38r0vWlgaj0K5nuBAkAM//e2dvooFn7gpz2DItR5Fng42KV+KOY43ajTYsOW
1ZqM3vgJqvHUQ4zQJ+H8ghU3W99s3M8pQG+lKwve5JwU
-----END RSA PRIVATE KEY-----
2)保存为文件1
[root@localhost ~]# openssl genrsa 1024 > /tmp/mykey.private
Generating RSA private key, 1024 bit long modulus
....++++++
.........................++++++
e is 65537 (0x10001)
3)保存为文件2
[root@localhost ~]# openssl genrsa -out /tmp/mykey.private 1024
Generating RSA private key, 1024 bit long modulus
........................................................++++++
........................++++++
e is 65537 (0x10001)
4)生成仅对自己有读取权限的密钥文件3
[root@localhost ~]# (umask 077;openssl genrsa -out /tmp/mykey.private 2048)
Generating RSA private key, 2048 bit long modulus
..............................+++
...+++
e is 65537 (0x10001)
5)提取公钥
[root@localhost ~]# openssl rsa -in /tmp/mykey.private -pubout
writing RSA key
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAq4/S/Mp0lHNO2MdO/XgL
Z4DevtZnfzixZMg9Aib7MvPaD9kxaAqSHeJFOSIAC5cIqXZTwkFkOM0VUEwSQT6N
rUggfUM1rNRr8BCD9z1Kk8IifNy8+7PsmD44nnb3jWTst8URsFweSy2tyAOs+ma2
XTER2dYv2J5i6DJQthMjGYlvM2OLzSOzBuTMYyNQ2ixUIkK3+ihklC7cK8p7d5ZC
am8c4btgsSyUMtBw+NztaTz7i57OoW0w8BmkMrk4QEeC6R42RzIifmhz2rV542L7
9n+Ib1+yf5QXDow/LttR97NkT5E6oBMEkTsZvtRkoFrdHk436hRgDWspblVG5HzB
gQIDAQAB
-----END PUBLIC KEY-----
CA
1、公共信任的CA
2、自建私有CA
建立私有CA工具
openssl
OpenCA
openssl命令
配置文件:/etc/pki/tls/openssl.cnf
构建私有CA
在确定配置为CA的服务器上生成一个自签证书,并为CA提供所需要的目录及文件即可
步骤:
(1)生成密钥
[root@localhost ~]# ls /etc/pki/CA/private/
[root@localhost ~]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)
Generating RSA private key, 4096 bit long modulus
.++
.......................................................................++
e is 65537 (0x10001)
(2)生成自签证书
命令会自动抽取公钥
生成自签证书一定要写上-x509选项
[root@localhost ~]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655
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]:MageEdu
Organizational Unit Name (eg, section) []:Ops
Common Name (eg, your name or your server's hostname) []:ca.magedu.com
Email Address []:caadmin@magedu.com
[root@localhost ~]# ls /etc/pki/CA/private/cakey.pem
/etc/pki/CA/private/cakey.pem
各选项解释
-new: 生成新签署请求
-x509: 生成自签格式证书,专用于创建私有CA时
-key: 生成请求时用到的私有文件路径
-out: 生成的请求文件路径:如果自签操作将直接生成签署过的证书
-days: 证书的有效时长,单位是day
(3)为CA提供所需的目录及文件
# mkdir /etc/pki/CA/{certs,crl,newcerts}
# touch /etc/pki/CA/{serial,index.txt}
# echo 01 > /etc/pki/CA/serial
至此自建CA已经搭建完成
要用到证书进行安全通信的服务器,需要向CA请求签署证书
步骤:(以httpd为例)
(1)用到证书的主机生成私钥
[root@localhost ~]# mkdir /etc/httpd/ssl
[root@localhost ~]# cd /etc/httpd/ssl/
[root@localhost ssl]# (umask 077; openssl genrsa -out /etc/httpd/ssl/httpd.key 2048)
Generating RSA private key, 2048 bit long modulus
..+++
.......................................+++
e is 65537 (0x10001)
(2)生成证书签署请求
[root@localhost ssl]# 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]:MageEdu
Organizational Unit Name (eg, section) []:Ops
Common Name (eg, your name or your server's hostname) []:www.magedu.com
Email Address []:webmaster@magedu.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[root@localhost ssl]# ls
httpd.csr httpd.key
(3)将证书通过可靠的方式发送给CA主机
这里用scp命令发送
[root@localhost ssl]# scp httpd.csr root@192.168.137.11:/tmp/
(4)在CA主机上签署证书
[root@localhost ~]# openssl ca -in /tmp/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 2 (0x2)
Validity
Not Before: Jan 7 18:00:38 2016 GMT
Not After : Jan 6 18:00:38 2017 GMT
Subject:
countryName = CN
stateOrProvinceName = Beijing
organizationName = MageEdu
organizationalUnitName = Ops
commonName = www.magedu.com
emailAddress = webmaster@magedu.com
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
63:CA:8E:98:14:1A:B0:A4:BC:F3:5C:D9:A0:A9:26:51:55:14:D8:DA
X509v3 Authority Key Identifier:
keyid:81:B6:92:BD:FD:87:9D:CD:DF:6E:FE:F9:A5:42:C9:59:F2:48:BE:5E
Certificate is to be certified until Jan 6 18:00:38 2017 GMT (365 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
[root@localhost ~]# ls /etc/pki/CA/certs/
httpd.crt
(5)把签好的证书通过安全途径给客户端
这里用scp命令演示
[root@localhost ~]# cd /etc/pki/CA/certs/
[root@localhost certs]# ls
httpd.crt
[root@localhost certs]# scp httpd.crt root@192.168.137.10:/etc/httpd/ssl/
至此httpd服务器的证书已建立完成
查看证书信息
[root@localhost ssl]# openssl x509 -in httpd.crt -noout -serial -subject
serial=01
subject= /C=CN/ST=Beijing/O=MageEdu/OU=Ops/CN=www\xC3\xA3.magedu.com/emailAddress=webmaster@magedu.com
吊销证书步骤
(1)客户端获取要吊销的证书的serial(在使用证书的主机上执行)
[root@localhost ssl]# openssl x509 -in httpd.crt -noout -serial -subject
serial=01
subject= /C=CN/ST=Beijing/O=MageEdu/OU=Ops/CN=www\xC3\xA3.magedu.com/emailAddress=webmaster@magedu.com
貌似是有错误,因为在填写信息时有Backspace按键
(2)CA主机吊销证书
先根据客户提交的serial和subject信息,对比其与本机数据库index.txt中存储的是否一致
吊销:
# openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
注意是在CA主机上执行的,其中的SERIAL要换成证书真正的序列号
[root@localhost ~]# openssl ca -revoke /etc/pki/CA/newcerts/01.pem
Using configuration from /etc/pki/tls/openssl.cnf
Revoking Certificate 01.
Data Base Updated
(3)生成吊销证书的吊销编号(第一次吊销证书时执行)
# echo 01 > /etc/pki/CA/crlnumber
(4)更新证书吊销里表
# openssl ca -gencrl -out thisca.crl
查看crl文件
# openssl crl -in /PATH/FROM/CRL_FILE.crl -noout -text
# openssl crl -in /etc/pki/CA/thisca.crl -noout -text
博客作业:加密解密技术基础、PKI及创建私有CA
这是一个灌输鸡汤的时刻(04)
1万个小时
加密类型及相关算法(以前的笔记)
完整性、机密性、身份验证
发送方用自己的私钥加密 能保证 发送方的身份验证
发送方用对方的公钥加密 能保证 数据的机密性
对称加密:
DES:Data Encryption Standard,56bit
3DES:
AES:Advanced Encryption Standard,高级加密标准
AES128、AES192、AES256、AES512
Blowfish:
单向加密(定长输出):
MD4
MD5:128
SHA1:160
SHA224、SHA256、SHA384
CRC-32:循环冗余校验码(非加密算法、不提供安全性)
公钥加密(加密/签名):
RSA:机密、签名
DSA:只能签名(公开使用)
ElGamal:商业加密
openssl:
工具:
OpenSSL:SSL的开源实现
libcrpto:通用加密库,提供了各种加密函数
libssl:TLS/SSL的实现
基于会话的、实现了身份验证,数据机密性和会话完整性的TLS/SSL库
openssl;多用途命令行工具
实现私有证书颁发机构
子命令可用 openssl ? 查看
使用例子:
加密:openssl enc -des3 -salt -a -in inittab -out inittab.des3
解密:openssl enc -des3 -d -salt -a -in inittab.des3 -out inittab
提取特征码(指纹)
# openssl dgst -md5 inittab
# md5sum inittab
# sha1sum inittab
生成密码串
# openssl passwd -1
生成私钥
# (umask 077;openssl genrsa -out server1024.key 1024)
从私钥中提取公钥
# openssl rsa -in server1024.key -pubout [-out server.pubkey]
生成自签证书
# openssl req -new -x509 -key server1024.key -out server.crt -days 365
查看证书信息
# openssl x509 -text -in server.crt
客户机向CA申请证书
1、客户机生成自己的私钥
2、客户机生成证书签署请求
openssl req -new -key httpd.key -out httpd.csr
##注意,私有证书中,国家地区名称、组织单位名称及以上信息,一定要和CA一样,不然就不会签了
3、CA签署证书
openssl ca -in httpd.csr -out httpd.crt -days 365
CA目录结构
/etc/pki/CA/certs/:客户端证书放置位置
/etc/pki/CA/crl/:客户端证书吊销列表
/etc/pki/CA/index.txt:给那些人发了证书的记录
/etc/pki/CA/newcerts/:刚新生成的证书放置目录
/etc/pki/CA/cacert.pem:CA自己的证书
/etc/pki/CA/serial:当前证书的序列号
/etc/pki/CA/crlnumber:证书撤销列表的号码
/etc/pki/CA/crl.pem:
/etc/pki/CA/private/cakey.pem:CA自己的私钥
PKI:Public Key Infrastructure PKI的核心就是CA
CA:Certificate Authority 证书权威机构
SSL:Secure Socket Layer 安全的套接字层
TLS:Transport Layer Security 传输层安全 (国际标准化组织的)
目前比较流行的证书存储格式是x509
x509:公钥、有效期限、证书的合法拥有者、证书该如何被使用(什么用途)、CA的信息、使用CA私钥签名了的校验码
PKI:TLS/SSL:x509
PKI:OpenGPG(另一种实现架构)
CRL(证书吊销列表):里面包含此前曾发出去的仍未过期的但由于各种原因已经被撤销了的证书,比如私钥泄露等。
Alice和Bob建立通信
(这一步是Alice获取签名证书的过程)
Alice首先生成自己的私钥。为了能够让Bob认可自己的身份,Alice首先向第三方公认机构(CA)提交自己的公钥和其他身份认证信息,由CA做公正。CA把Alice的公钥和身份信息,还有CA自己的身份信息作为整体一起计算出特征码,再用CA自己的私钥加密该特征码(即为签名),并把签名结果附加在整体数据后面,形成由CA认可了的Alice的证书。
(这一步主要是Bob获取Alice的公钥)
接着,Bob先向Alice发送会话请求,然后双方互相协商要使用哪一种加密协议(SSLv2、SSLv3、TLSv1)、哪一种对称加密算法等,协商完,Alice向Bob发送证书,Bob利用CA自签证书(需要通过可靠途径获得)中CA的公钥解密Alice的证书特征码,如果能解密,就说明Alice发来的证书是由自己可信的CA签署的,是可信的,接下来,通过特征码再验证数据的完整性。数据完整性验证通过,再看是不是自己认可的证书颁发机构发的,如果是,再去查看这个证书颁发机构所提供的CRL(证书吊销列表)中此证书有没有被吊销,如果存在,也要拒绝使用此证书,如果不存在,证书验证成功,Alice的公钥获取成功。
接着,Bob会生成一个随机的密钥(对称密钥),用Alice的公钥加密后传递给Alice,然后Alice就可以用这个对称密钥与Bob进行加密的会话了。
这时在没有CA的情况下,Alice和Bob通信过程,这样难以防止"中间人"攻击
1、Alice加密发送过程
1) Alice先用单向加密提取要发生数据的特征码
2) Alice再用自己的私钥加密这段特征码,并将结果附加在数据后面
3) Alice生成一个临时的对称密钥,并使用对称密钥加密这整段数据
4) Alice获取到Bob的公钥,并使用对方的公钥加密刚临时的对称密钥,再附加到整个后面
5) Alice将整个结果发送给Bob
2、Bob解密过程
1) Bob用自己的私钥解密对称密钥
2) 再用对称密钥解密这整段内容
3) 用对方的公钥解密特征码,能解密,Alice的身份得到验证
4) Bob再用同样的单向加密算法计算出这段数据的特征码,再与对方发送的特征码比较,如果相同,数据完整性得到验证
2016/01/11
http协议及web服务基础(01)
Web Service 之http基础原理
Web Service
应用层协议:http,https
实现某类具体应用:
工作模式也是C/S架构
web服务也需要监听到一个套接字上,众所周知的80端口
由IANA来授权端口
传输层协议常见有:TCP,UDP,SCTP
0-1023: 众所周知,永久地分配给固定的应用使用,特权端口
1024-41951: 亦为注册端口,但要求不是特别严格,分配给程序注册为某应用使用;3306/tcp, 11211/tcp
41952+: 客户端程序随机使用的端口,动态端口,或私有端口;其范围定义在/proc/sys/net/ipv4/ip_local_range
BSD Socket:IPC的一种实现,允许位于不同主机(也可以是同一主机)上的进程之间进行通信
内核为应用程序提供了 Socket API (封装了内核中的socket通信相关的系统调用)
SOCK_STREAM:TCP套接字
SOCK_DGRAM:UDP套接字
SOCK_RAW:raw套接字裸套接字
根据套接字所使用的地址格式:Socket Domain
AF_INET: Address Family,Ipv4
AF_INET6: ipv6
AF_UNIX: 同一主机上的不同进程间基于socket套接字通信使用的一种地址,Unix_SOCK
TCP协议的特性
建立连接:三次握手
将数据打包成段:校验和CRC32
确认、重传及超时机制
排序:基于逻辑序号
流量控制:基于滑动窗口算法的,取决于对方的接收缓冲大小
拥赛控制:慢启动和拥赛避免算法
TCP FSM time_wait=2msl
http:hyper text transfer protocol,应用层协议,80/tcp,文本协议
html(hyper text mark language,编程语言,超文本标记语言
<html>
<head>
</head>
<body>
<h1></h1>
<p>blabla...<a href=http://www.magedu.com/download.html>bla...</a></p>
<h2></h2>
</body>
</html>
css: Cascading Style Sheet
js: JavaScript,客户端脚本,运行时,需要客户先下载,在客户端运行
协议版本:
http/0.9: 原型版本,功能简陋
http/1.0: cache,MIME,method.
MIME: Multipurpose Internet Mail Extesion
method: GET, POST, HEAD, PUT, DELETE, OPTIONS
http/1.1: 增强了缓存功能
google的spdy
http/2.0: 借鉴spdy 更多看rfc文档
工作模式:
http请求报文:http request
http响应报文:http response
一次http事务:一次请求<-->响应
Web资源:web resource
静态资源(无须服务端做出额外处理): .jpg, .png, .gif, .html, .txt, .js, .css, .mp3, .avi
动态资源(服务端需要通过执行程序做出处理,发送给客户端的是程序运行的结果): .php, .jsp
注意:一个页面中展示的资源可能有多个,每个资源都需要单独请求
资源的标识机制:URL
Uniform Resource Locator: 用于描述服务器某特定资源的位置
例如:http://www.sina.com.cn/index.html
Scheme://Server[:Port][/PATH/TO/SOME_RESOURCE]
(2)接收请求:接收来自于网络上的主机请求报文中对某特定资源的一次请求的过程
(3)处理请求:对请求报文进行解析,获取客户端请求的资源及请求方法等相关信息
web服务基础(02)
单进程I/O模型:启动一个进程处理用户请求,这意味着,一次只能处理一个请求,多个请求被串行响应
多进程I/O结构:并行启动多个进程,每个进程响应一个请求,缺点就是会损耗CPU大量时间在进程间切换
复用的I/O结构:一个服务器进程响应n个客户端请求,一对多。它又分为两种情况:
事件驱动(event-driven):一个进程直接驱动n个请求,不用启动线程
复用的多个进程I/O结构:启动多个(m)个进程,每个进程生成(n)个线程
<method><URL><VERSION> //<请求方法是什么><请求的是哪个资源><是用http协议的哪个版本>
web服务器,即存放了web资源的主机,负责向请求者提供对方请求的静态资源,或动态资源运行生成的结果,这些资源通常应该放置于本地文件系统某路径下,此路径称为DocRoot。映射为URL的请求根。
http://www.magedu.com/images/logo.jpg
web服务器的资源路径映射方式有:
(a)docroot
(b)alias
(c)虚拟主机的docroot
(d)用户家目录的docroot
http请求处理中的连接模式有两种:
保持连接(长连接): keep-alive
时间:
数量:
非保持连接(短连接):
http服务器程序:(只能处理静态内容)
httpd(apache)
nginx 俄国人研发
lighttpd 德国人研发
应用程序服务器:(主要处理动态内容)
IIS: 编程语言有.Net
tomcat: 编程语言有.jsp
www.netcraft.com,调研和统计,web服务器各应用程序的市场占有量
httpd安装和使用:
ASF: apache software foundation
httpd: apache
a patchy server=apache
httpd
httpd的特性
(1)高度模块化:core+modules
(2)DSO:dynamic shared object
(3)MPM:Multipath processing Modules (多道处理模块)
1)prefork: 多进程模型,每个进程响应一个请求
一个主进程:负责生成子进程及回收子进程,负责创建套接字,负责接收请求,并将其派发给某子进程进行处理
n个子进程:每个子进程处理一个请求,只负责处理,不接受请求
工作模型:会预先生成几个空闲进程,随时等待用于响应用户请求,最大空闲和最小空闲
2)worker:多进程多线程模型,每个线程处理一个用户请求
一个主进程:负责生成子进程负责创建套接字,负责接收请求,并将其派发给某子进程进行处理
多个子进程:每个子进程负责生成多个线程
每个线程:负责响应用户请求
并发响应数量:m*n
m:子进程数量
n:每个子进程所能创建的最大线程数量
3)event:事件驱动模型,多进程模型,每个进程响应多个请求
一个主进程:负责生成子进程,负责创建套接字,负责接收请求,并将其派发给某子进程进行处理
子进程:基于事件驱动机制直接响应多个请求
httpd-2.2: event仍为测试使用模型
httpd-2.4: event可生产环境中使用
httpd的程序版本
httpd-1.3: 官方已经停止维护
httpd-2.0:
httpd-2.2:
httpd-2.4: 目前最新稳定版
httpd的功能特性
CGI: Common Gateway Interface 通用网关接口
虚拟主机: IP, PORT, FQDN
反向代理
负载均衡
路径别名
丰富的用户认证机制
basic: 基本认证
digest: 摘要认证
支持第三方模块
...
安装httpd:
rpm包:CentOS 发行版中直接提供
编译安装:定制新功能,或其它原因,相当不建议
CentOS 6:
程序环境:
配置文件:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
服务脚本:
/etc/rc.d/init.d/httpd
脚本配置文件:/etc/sysconfig/httpd
主程序文件:要用哪种模型,就用哪个主程序,在脚本配置文件/etc/sysconfig/httpd中配置
/usr/sbin/httpd
/usr/sbin/httpd.event
/usr/sbin/httpd.worker
日志文件目录:/var/log/httpd/
access_log: 访问日志
error_log: 错误日志
站点文件目录:/var/www/html/
模块文件目录路径:/usr/lib64/httpd/modules/
服务控制和启动:
# chkconfig httpd on|off
# service {start|stop|restart|status|configtest|reload} httpd
CentOS 7: httpd-2.4
程序环境:
配置文件:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
模块相关的配置文件:/etc/httpd/conf.modules.d/*.conf
systemd unit file:
/usr/lib/systemd/system/httpd.service
主程序文件:/usr/sbin/httpd
httpd-2.4支持MPM的动态切换
日志文件目录:/var/log/httpd/
access_log: 访问日志
error_log: 错误日志
站点文档目录:/var/www/html/
模块文件目录路径:/usr/lib64/httpd/modules/
服务控制:
# systemctl enable|disable httpd.service
# systemctl {start|stop|restart|status} httpd.service
httpd基础配置详解(03)
回顾:
并发服务响应模型
单进程模型
多进程模型
复用的I/O的模型
多线程模型
事件驱动
复用的多进程多线程模型
MPM
prefork: 多进程模型,一个进程响应一个请求
worker: 一个主进程生成多个子进程,多个子进程生成多个线程,一个线程响应一个请求
event: 事件驱动模型,一个进程响应n个请求
Web Server(2)
httpd 2.2的常用配置
主配置文件:/etc/httpd/conf/httpd.conf
辅助配置文件:/etc/httpd/conf.d/*.conf
主配置文件有三段组成
### Section 1: Global Environment //全局配置段
### Section 2: 'Main' server configuration //中心主机配置
### Section 3: Virtual Hosts //虚拟主机配置
配置格式:
directive value
directive: 不区分字符大小写
value: 为路径时,是否区分字符大小写,取决于文件系统
先备份配置文件:
# cp -v httpd.conf{,.backup}
[root@localhost ~]# cd /etc/httpd/conf/
[root@localhost conf]# cp -v httpd.conf{,.backup}
`httpd.conf' -> `httpd.conf.backup'
常用配置:
1、修改监听的IP和PORT,
Listen [IP:]PORT
(1)省略IP表示0.0.0.0 //本机正常配置可使用的所有IP
(2)Listen指令可重复出现多次
Listen 80
Listen 8080
(3)修改监听socket(IP或PORT)只有重启服务进程方可生效,通常配置修改后只需reload即可
2、持久连续
Persistent Connection: tcp连续建立后,每个资源获取完成后不全断开连接,而是继续等待其它资源请求的进行
如何断开?
数量限制
时间限制
副作用: 对并发访问量较大的服务器,长连接机制会使得后续某些请求无法得到正常响应
折中办法: 使用较短的持久连接时长,以及较少的请求数量
配置:
KeepAlive On|Off //如果长连接关闭,则一次请求以后就连接关闭
KeepAlive Timeout 15 //单位:秒
MaxKeepAliveRequests 100 //一次长连接时的最大请求次数
测试方法:
telnet WEB_SERVER_IP PORT [回车]
GET /URL HTTP/1.1 [回车]
Host: WEB_SERVER_IP [回车][回车] //连按两下回车
演示效果:
[root@localhost ~]# cd /var/www/html/
[root@localhost html]# vim test.html
<h1>Test Site</h1>
[root@localhost html]# ls
test.html
[root@localhost html]# cd
[root@localhost ~]# telnet 192.168.137.100 80
Trying 192.168.137.100...
Connected to 192.168.137.100.
Escape character is '^]'.
GET /test.html HTTP1.1
Host: 192.168.137.100
HTTP/1.1 200 OK
Date: Tue, 12 Jan 2016 08:35:26 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Tue, 12 Jan 2016 08:14:50 GMT
ETag: "e0101-13-5291ea5c14602"
Accept-Ranges: bytes
Content-Length: 19
Connection: close
Content-Type: text/html; charset=UTF-8
<h1>Test Site</h1>
Connection closed by foreign host.
3、MPM
httpd-2.2版本不支持同时编译多个MPM模块,所以只能编译选定要使用的那个。CentOS 6的rpm包为此专门提供了三个应用程序文件,分别用于实现对不同的MPM机制的支持。
httpd(默认的prefork模型)
httpd.worker
httpd.event
确认现在使用的是哪个程序文件的方法
默认使用的程序文件为/usr/sbin/httpd, 其为prefork的MPM模块
[root@localhost ~]# ps aux | grep httpd
root 3193 0.0 0.8 183856 4236 ? Ss 14:35 0:00 /usr/sbin/httpd
apache 3563 0.0 0.5 183992 2688 ? S 16:25 0:00 /usr/sbin/httpd
apache 3564 0.0 0.5 183992 2904 ? S 16:25 0:00 /usr/sbin/httpd
apache 3565 0.0 0.6 183992 3156 ? S 16:25 0:00 /usr/sbin/httpd
apache 3566 0.0 0.6 183992 3152 ? S 16:25 0:00 /usr/sbin/httpd
apache 3567 0.0 0.6 183992 3156 ? S 16:25 0:00 /usr/sbin/httpd
apache 3568 0.0 0.6 183992 3248 ? S 16:25 0:00 /usr/sbin/httpd
apache 3569 0.0 0.6 183992 3244 ? S 16:25 0:00 /usr/sbin/httpd
apache 3570 0.0 0.6 183992 3136 ? S 16:25 0:00 /usr/sbin/httpd
root 3644 0.0 0.1 103308 852 pts/1 S+ 16:50 0:00 grep httpd
查看httpd程序的模块列表
1)查看静态编译的核心模块
# httpd -l
[root@localhost ~]# /usr/sbin/httpd -l
Compiled in modules:
core.c
prefork.c
http_core.c
mod_so.c //支持动态模块装卸载的模块接口
2)查看静态编译及动态编译的模块
# httpd -M
[root@localhost ~]# /usr/sbin/httpd -M
...
3)更换使用httpd程序,以支持其他MPM机制
先最好停止httpd服务
再修改/etc/sysconfig/httpd文件
HTTPD=/usr/sbin/httpd.{worker,event}
然后重启服务生效
[root@localhost ~]# service httpd stop
Stopping httpd: [ OK ]
[root@localhost ~]# vim /etc/sysconfig/httpd
...
HTTPD=/usr/sbin/httpd.worker
...
[root@localhost ~]# service httpd start
Starting httpd: [ OK ]
[root@localhost ~]# ps aux | grep httpd
root 3976 0.0 0.8 186136 4168 ? Ss 17:26 0:00 /usr/sbin/httpd.worker
apache 3979 0.0 0.6 530396 3348 ? Sl 17:26 0:00 /usr/sbin/httpd.worker
apache 3980 0.0 0.6 530396 3368 ? Sl 17:26 0:00 /usr/sbin/httpd.worker
apache 3982 0.0 0.6 595932 3360 ? Sl 17:26 0:00 /usr/sbin/httpd.worker
root 4210 0.0 0.1 103308 852 pts/1 S+ 18:07 0:00 grep httpd
脚本配置文件原理。。。
#!/bin/bash
#
[ -f /tmp/useradd.conf ] && source /tmp/useradd.conf
username=${username:-testuser}
echo $username
<IfModule prefork.c>
StartServers 8 //服务器刚启动时,就启动多少个进程
MinSpareServers 5 //最少空闲进程数,如果少于这个数,主控进程就再启动进程够这个数量
MaxSpareServers 20 //最大空闲进程数量
ServerLimit 256 //允许启动最大在线进程数量=MaxClients+空闲数量,ServerLimit >= MaxClients
MaxClients 256 //最大允许启动多少个进程去响应用户请求,最大并发响应的数量
MaxRequestsPerChild 4000 //每个进程最多处理多少个请求,处理到4000个后,把该进程销毁
</IfModule>
<IfModule worker.c>
StartServers 4 //刚开始启动多少个服务子进程
MaxClients 300 //
MinSpareThreads 25 //最少空闲线程数
MaxSpareThreads 75 //最大空闲线程数
ThreadsPerChild 25 //每个进程可以生成多少个线程
MaxRequestsPerChild 0 //无限制
</IfModule>
PV,UV
PV:Page View //页面浏览量
UV:User View
1个进程1秒处理5个请求,假设都是静态请求
256*5=1280 //满载,1秒钟可以响应的请求数量
1280*60*60*24=110592000 //满载,1天可以响应的请求数量
1个页面中有100个资源
110592000/100=1105920 //相当于1天可以响应的页面访问量,也就是PV
这是平均值,是不科学的。
实际要按峰值来构建服务器,还要考虑其他因素,比如网络服务器的带宽
1个请求需要10KB
1秒钟需要产生的流量1280*10KB=12800KB/1024=12.5MB
换算成比特(bit)12.5MB*8=100Mbit
这个带宽流量只是资源数据的大小,还不包含各种网络协议的报头首部等数据
4、DSO (动态共享模块)
配置指定实现模块加载
LoadModule <mod_name> <mod_path>
任何模块如果不想用,可以直接注释掉即可
模块文件路径可使用相对路径,相对于ServerRoot(默认/etc/httpd,又符号链接到其他位置)
[root@localhost ~]# ls -l /etc/httpd
total 8
drwxr-xr-x. 2 root root 4096 Jan 12 18:21 conf
drwxr-xr-x. 2 root root 4096 Jan 3 20:27 conf.d
lrwxrwxrwx. 1 root root 19 Jan 3 20:27 logs -> ../../var/log/httpd
lrwxrwxrwx. 1 root root 29 Jan 3 20:27 modules -> ../../usr/lib64/httpd/modules
lrwxrwxrwx. 1 root root 19 Jan 3 20:27 run -> ../../var/run/httpd
5、定义"Main server"的文档页面路径
中心主机默认的根目录
DocumentRoot "/var/www/html"
文档路径映射
DoucumentRoot指定的路径为URL路径的起始位置,相当于站点URL的根路径
(FileSystem)/web/host1/index.html –> (URL)/index.html
从文件系统路径映射到了URL路径
6、站点访问控制常见机制
可基于两种机制指明对哪些资源进行何种访问控制
(1)文件系统路径
1)对一个目录及子目录的各种访问控制
<Directory "路径">
...[各种控制指令]
</Directory>
2)针对单个文件实现访问控制的
<File "">
...
</File>
3)对被正则表达式模式匹配到的各文件实现的访问控制
<FileMatch "PATTERN">
...
</FileMatch>
(2)URL路径
1)
<Location "">
...
</Location>
2)
<LocationMatch "">
...
</LocationMatch>
<Dircetory "">中"基于源地址"实现访问控制
(a)Options : 用于控制这个目录所制定路径下的各种资源的被访问模式或方式
后跟1个或多个以空白字符分隔的"选项"列表
Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
其中常用的有:
Indexes: 指定的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户
FollowSymLinks: 允许跟踪符号链接所指向的源文件
None:所有都没有
All:全部都有
(b)AllowOverride 会极大降低性能,一般不建议使用
与访问控制相关的哪些指令可以放在.htaccess文件(每个目录下都可以有一个)中,
.htaccess文件内设定的指令优先级权限高于当前目录所设定的
Options FileInfo AuthConfig Limit
All:所有都可以放进去
None:所有都不放进去
(c)Order和allow,deny
order: 定义生效次序,写在后面的表示默认法则。
allow deny 做白名单
deny allow 做黑名单
Allow from,允许哪些地址的主机来访问页面的
Deny from,拒绝哪些地址的主机来访问页面的
来源地址的格式:
IP
NetAddr:
172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.0
Order allow,deny //只有明确指明的才能访问,其他不能访问。白名单机制
Order deny,allow //只有明确指明的才能被禁止,其他都能访问。黑名单机制
Deny from 192.168.137.11
Allow from 192.168.137.100
主机192.168.137.11测试结果
[root@localhost ~]# curl http://192.168.137.100/test.html
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /test.html
on this server.</p>
<hr>
<address>Apache/2.2.15 (CentOS) Server at 192.168.137.100 Port 80</address>
</body></html>
主机192.168.137.100测试结果
[root@localhost ~]# curl http://192.168.137.100/test.html
<h1>Test Site</h1>
7、定义站点主页面
DirectoryIndex index.html index.html.var
当用户没有明确指明URL时,它就返回由本指令设定的默认页面,默认页面也使用相对路径
dw vim的快捷键
8、定义路径别名
定义格式:
Alias /URL/ "/PATH/TO/SOMEDIR/"
Alias /download/ "/www/htdocs/"
正常情况下: DocumentRoot "/www/htdocs"
URL路径: http://www.magedu.com/download/bash-4.4.2-3.el6.x86_64.rpm
文件系统路径: /www/htdocs/download/bash-4.4.2-3.el6.x86_64.rpm
定义别名后: Alias /download/ "/rpms/pub/"
URL路径: http://www.magedu.com/download/bash-4.4.2-3.el6.x86_64.rpm
对应文件系统的路径: /rpms/pub/bash-4.4.2-3.el6.x86_64.rpm
而http://www.magedu.com/images/logo.png
仍然对应/www/htdocs/images/logo.png
httpd基础配置详解(04)
Possible values include: debug, info, notice, warn, error, crit, alert, emerg.
日志级别,级别越高,对应的事务的严重程度就越高,同样意味着事件数量就越少
一般日志级别有7个,当我们定义了一个级别时,就会有这个级别以及比这个级别还要高的级别的日志都要作记录
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined //定义combined的记录格式
CustomLog logs/access_log combined //用combined定义的格式记录日志
(可参考官网格式说明地址http://httpd.apache.org/docs/2.2/mod/mod_log_config.html)
%l:远程登录的用户名,Remote User,通常为一个减号("-")
%u:远程用户Remote user (from auth; may be bogus if return status(%s)is 401);非为登录访问时,其为一个减号
%r:First line of request,即表示请求报文的首行;记录了此次请求的"方法","URL"以及协议版本
%b:响应报文的大小,单位是字节,不包含响应报文的http首部
%{referer}i:请求报文中首部"referer"的值,即从哪个页面中的超链接跳转至当前页面的
%{User-Agent}i:请求报文中首部"User-Agent"的值,即发出请求的应用程序
[root@localhost ~]# tail -2 /var/log/httpd/access_log
192.168.137.11 - - [12/Jan/2016:21:10:02 +0800] "GET /test.html HTTP/1.1" 403 292 "-" "curl/7.29.0"
WWW-Authenticate: 响应码为401,拒绝客户端请求,并说明要求客户端提供账号和密码
Authorization:客户端用户填入账号和密码后再次发送请求报文,认证通过时,则服务器发送响应的资源
digest: 消息摘要认证,客户端不直接发送自己的密码,而是用自己的密码加密一段数据发送给服务器,服务器再用存储的密码解密,如果能解密,就认证通过。
安全域:需要用户认证后方能访问的路径,应该通过名称对其进行标识,以便于告知用户认证的原因
AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE"
Require user username1 username2 ...
[root@localhost ~]# mkdir /web/host1/admin -vp
mkdir: created directory `/web'
mkdir: created directory `/web/host1'
mkdir: created directory `/web/host1/admin'
[root@localhost ~]# vim /web/host1/admin/index.html
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
<Directory "/web/host1/admin">
AuthName "Admin Realm, show something."
AuthUserFile "/etc/httpd/conf/.htpasswd"
[root@localhost ~]# service httpd reload
[root@localhost ~]# service httpd configtest
# htpasswd [options] /PATH/TO/HTTPD_PASSWD_FILE username
-c : 自动创建此处指定的文件,因此,仅应用在此文件不存在时使用,即第一次创建时使用
[root@localhost ~]# htpasswd -c -m /etc/httpd/conf/.htpasswd tom
htpasswd: password verification error
[root@localhost ~]# htpasswd -c -m /etc/httpd/conf/.htpasswd tom
[root@localhost ~]# htpasswd -m /etc/httpd/conf/.htpasswd jerry
Adding password for user jerry
[root@localhost ~]# htpasswd -m /etc/httpd/conf/.htpasswd obama
Adding password for user obama
[root@localhost ~]# htpasswd -D /etc/httpd/conf/.htpasswd obama
Deleting password for user obama
[root@localhost ~]# htpasswd -m /etc/httpd/conf/.htpasswd obama
Adding password for user obama
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
<Directory "/web/host1/admin">
AuthName "Admin Realm, show something."
AuthUserFile "/etc/httpd/conf/.htpasswd"
[root@localhost ~]# service httpd reload
AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE"
AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE"
Require group grpname1 grpname2 ...
GRP_NAME: username1 username2 ...
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
<Directory "/web/host1/admin">
AuthName "Admin Realm, show something."
AuthUserFile "/etc/httpd/conf/.htpasswd"
AuthGroupFile "/etc/httpd/conf/.htgroup"
[root@localhost ~]# vim /etc/httpd/conf/.htgroup
[root@localhost ~]# htpasswd -m /etc/httpd/conf/.htpasswd blair
Adding password for user blair
[root@localhost ~]# service httpd reload
根据http信息中的Host来判定:www.magedu.com
注意:一般虚拟主机不要与中心主机混用,因此,要使用虚拟主机,得先禁用"main"主机
禁用方法:注释中心主机的"DocumentRoot"指令即可。
DocumentRoot "/www/a.com/htdocs"
DocumentRoot "/www/b.net/htdocs"
DocumentRoot "/www/c.org/htdocs"
DocumentRoot "/www/a.com/htdocs"
<VirtualHost 172.16.100.6:808>
DocumentRoot "/www/b.net/htdocs"
<VirtualHost 172.16.100.6:8080>
DocumentRoot "/www/c.org/htdocs"
NameVirtualHost 172.16.100.6:80
DocumentRoot "/www/a.com/htdocs"
DocumentRoot "/www/b.net/htdocs"
DocumentRoot "/www/c.org/htdocs"
LoadModule status_module modules/mod_status.so
2016/01/13
http协议进阶(01)
Options Indexes FollowSymlinks
%{Referer}i: 引用Referer首部的值,当前页面的访问入口
Alias /URL/ "/path/to/somdir/"
http://www.magedu.com:80/bbs/index.php,
https://
URL的基本语法:
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
params:参数,类似于表单的数据
http://www.magedu.com/bbs/hello;gender=f
query:
http://www.magedu.com/bbs/item.php?username=tom&title=abc
frag:
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html-single/Installation_Guide/index.html#ch-Boot-x86
相对URL: 同站内的引用
绝对URL:跨站引用
http协议:
http/0.9, http/1.0, http/1.1, http/2.0
http协议: stateless 是无状态的
服务器无法持续追踪访问者来源
目前应用广泛的解决方案:
cookie机制,当某客户端,访问某服务器时,服务器发送给客户端一些数据,唯一的标识,客户端浏览器进程把它保存起来,每个cookie都有一个作用范围,客户端在第二次访问这个站点时,它会把这个数据发送给服务器,从而验证了身份
有胖cookie和瘦cookie的概念: 胖cookie会记录用户大量隐私
session机制
http的事务: 即是一次请求和响应的过程
请求: request
响应: response
报文语法格式
request报文:
<method> <request-URL> <version>
<headeres>
<entity-body>
response报文
<version> <status> <reason-phrase>
<headers>
<entity-body>
method: 请求方法,标明客户端希望服务器对资源执行的动作
GET、HEAD、POST 比较安全的方法
version:
HTTP/<major>.<minor>
status:
统一都是3位数字,如200,301,404,502,响应状态码,用于标记请求处理过程中发生的情况
reason-phrase:
用来说明状态码所标记的状态的简要描述,原因短语
headers:
用来标记请求报文的属性的
每个请求或响应报文可包含任意个首部,每个首部都有首部名称,后面跟一个冒号,而后跟上一个可选空格,接着是一个值
entity-body:
有用的数据块,请求报文的实体可能为空
请求时附加的数据或响应时附加的数据
展开说明
method(方法)
GET:从服务器获取一个资源:
HEAD:头首之意,只从服务器获取文档的响应首部,而不是响应内容的
POST:向服务器发送要处理的数据,有危险
PUT:跟get相反的方法,将请求的主体部分存储在服务器上,非常危险
DELETE:请求删除服务器上指定的文档
TRACE:跟踪源到服务器上经由路由器的节点,追踪请求到达服务器中间经过的代理服务器
OPTIONS:请求服务器对某个资源访问的方法,请求服务器返回对指定资源支持使用的请求方法
协议查看或分析的工具
tcpdump、tshark、wireshark
status(状态码)
1xx: 100-101,信息提示
2xx: 200-206,成功类的信息
3xx: 300-305,重定向类状态码
4xx: 400-415,错误类信息,客户端错误
5xx: 500-505,错误类信息,服务器端错误
常用的状态码:
200:成功响应,请求的所有数据通过响应报文的entity-body部分发送:OK
301:请求的资源被移动到其他位置去了,请求的URL指向的资源已经被删除,但在响应报文中通过首部Location指明了资源现在所处的新位置,永久重定向:Moved Permanently
302: 与301相似,但在响应报文中通过Location指明资源现在所处临时新位置,Found
304:客户端发出了条件式请求,但服务器上的资源未曾发生改变,则通过响应此响应状态码通知客户端: Not Modified
401: 需要输入账号和密码认证方能访问资源:Unauthorized
403:请求被禁止,Forbidden
404:服务器无法找到客户端请求的资源:Not Found
500:服务器内部错误:Internal Server Error
502:代理服务器从后端服务器收到了一条伪响应:Bad Gateway,可用trace方法追踪代理服务器节点
headers:
格式:
Name: Value
首部的分类
通用首部
请求首部
响应首部
实体首部
扩展首部
展开说明
通用首部: 请求和响应报文中都能用
Date:报文的创建时间
Connection: 连接方式,如keep-alive,close
Via: 显示报文经由的中间节点
Cache-Control:控制缓存
Pragma:
请求首部:
Accept: 通知服务器自己可接受的媒体类型,MIME的类型
Accept-Charset: 接受的字符集
Accept-Encoding: 接受哪些种编码格式,如gzip
Accept-Language:接受的语言
信息型首部
Client-IP: 客户端IP地址
Host: 请求的服务器名称和端口号
Referer: 包含了当前正在请求的资源的上一级资源
User-Agent: 客户端代理
条件式首部
Expect
If-Modified-Since: 自从指定的时间之后,请求的资源是否发生过修改
If-Unmodified-Since:
If-None-Match: 本地缓存中存储的文档的Etag标签是否与服务器文档的ETag不匹配
If-Match:
安全请求首部
Authorization:向服务器发送认证信息,如账号和密码
Cookie:客户端向服务器发送Cookie 1,2两个版本
Cookie2:
代理请求首部
Proxy-Authorization:向代理服务器认证
响应首部
信息性:
Age:只占用资源的年龄,响应持续时长
Server:服务器程序软件名称和版本
协商首部:某资源有多种表示方法时使用
Accept-Ranges:服务器可接受的请求范围类型
Vary:服务器查看的其他首部列表
安全响应首部
Set-Cookie:向客户端设置Cookie
Set-Cookie2:
WWW-Authentiate:来自服务器的对客户端的质询认证表单
实体首部
Allow:列出对此实体可使用的请求方法
Location:告诉客户端真正的实体位于何处,重定向时使用
Content-Encoding:内容的编码格式
Content-Language:
Content-Length:主体的长度
Content-Location:实体真正所处位置
Content-Type:主体的对象类型
缓存相关
Etag:实体的扩展标签
Expires:实体的过期时间
Last-Modified:最后一次修改的时间
httpd-2.2应用进阶(02)
http rfc
http 权威指南
httpd-2.2的常见配置(2)
服务器遇到自己不理解的首部时,会通通忽略
MIME类型:major/minor, image/png, image/gif
14、curl命令
curl是基于URL语法在命令行方式下工作的文件传输工具,它支持FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE及LDAP等协议。curl支持HTTPS认证,并且支持HTTP的POST、PUT等方法, FTP上传, kerberos认证,HTTP上传,代理服务器, cookies, 用户名/密码认证, 下载文件断点续传,上载文件断点续传, http代理服务器管道( proxy tunneling), 甚至它还支持IPv6, socks5代理服务器,,通过http代理服务器上传文件到FTP服务器等等,功能十分强大。
用法:curl [options] [URL...]
curl的常用选项:
-A/--user-agent <string> 设置用户代理发送给服务器
-basic 使用HTTP基本认证
--tcp-nodelay 使用TCP_NODELAY选项
-e/--referer <URL> 来源网址
--cacert <file> CA证书 (SSL)
--compressed 要求返回是压缩的格式
-H/--header <line>自定义首部信息传递给服务器
-I/--head 只显示响应报文首部信息
--limit-rate <rate> 设置传输速度
-u/--user <user[:password]>设置服务器的用户和密码
-0/--http1.0 使用HTTP 1.0
另一个工具:elinks
用法:elinks [OPTION]... [URL]...
-dump: 不进入交互式模式,而直接将URL的内容输出至标准输出
15、user/group
指定以哪个用户的身份运行httpd服务进程
User apache
Group apache
suexec: 用另外用户的身份运行程序
16、使用mod_deflate模块压缩页面优化传输速度
适用场景:
(1) 节约带宽,额外消耗CPU;同时,可能有些较老浏览器不支持;
(2) 压缩适于压缩的资源,例如文件文件;
SetOutputFilter DEFLATE
# mod_deflate configuration
# Restrict compression to these MIME types
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/css
# Level of compression (Highest 9 - Lowest 1)
DeflateCompressionLevel 9
# Netscape 4.x has some problems. //对某些浏览器过滤
BrowserMatch ^Mozilla/4 gzip-only-text/html
# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4\.0[678] no-gzip
# MSIE masquerades as Netscape, but it is fine
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
16、https, http over ssl
http over ssl = https 443/tcp
ssl: v3
tls: v1
https://
SSL会话的简化过程
(1) 客户端发送可供选择的加密方式,并向服务器请求证书
(2) 服务器端发送证书以及选定的加密方式给客户端
(3) 客户端取得证书并进行证书验正:
如果信任给其发证书的CA:
(a) 验正证书来源的合法性;用CA的公钥解密证书上数字签名
(b) 验正证书的内容的合法性:完整性验正
(c) 检查证书的有效期限
(d) 检查证书是否被吊销
(e) 证书中拥有者的名字,与访问的目标主机要一致
(4) 客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换
(5) 服务器用此密钥加密用户请求的资源,响应给客户端
注意:SSL会话是基于IP地址创建;所以单IP的主机上,仅可以使用一个https虚拟主机;
回顾几个术语:PKI,CA,CRL,X.509 (v1, v2, v3)
配置httpd支持https:
(1) 为服务器申请数字证书;
测试:通过私建CA发证书
(a) 创建私有CA
(b) 在服务器创建证书签署请求
(c) CA签证
(2) 配置httpd支持使用ssl,及使用的证书
# yum -y install mod_ssl
配置文件:/etc/httpd/conf.d/ssl.conf
DocumentRoot
ServerName
SSLCertificateFile
SSLCertificateKeyFile
在/etc/httpd/conf.d/ssl.conf配置文件中有个历史遗留的待解决的问题:
<VirtualHost _default_:443>
(3) 测试基于https访问相应的主机;
# openssl s_client [-connect host:port] [-cert filename] [-CApath directory] [-CAfile filename]
在这里只演示web服务器创建证书签署请求,接着配置httpd支持使用ssl的过程
首先在WEB服务器上生成密钥
[root@localhost ~]# cd /etc/httpd
[root@localhost httpd]# ls
conf conf.d logs modules run
[root@localhost httpd]# mkdir ssl
[root@localhost httpd]# cd ssl
[root@localhost ssl]# (umask 077;openssl genrsa -out httpd.key 1024)
Generating RSA private key, 1024 bit long modulus
.......++++++
...................................++++++
e is 65537 (0x10001)
生成证书签署请求
[root@localhost ssl]# openssl req -new -key httpd.key -out httpd.csr
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]:MageEdu
Organizational Unit Name (eg, section) []:Ops
Common Name (eg, your name or your server's hostname) []:www.magedu.com
Email Address []:webadmin@magedu.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[root@localhost ssl]# ls
httpd.csr httpd.key
发送CA签署
[root@localhost ssl]# scp httpd.csr root@192.168.137.11:/tmp
The authenticity of host '192.168.137.11 (192.168.137.11)' can't be established.
RSA key fingerprint is 52:13:1f:b5:d4:cf:c8:58:17:9d:53:95:05:cf:7a:9e.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.137.11' (RSA) to the list of known hosts.
root@192.168.137.11's password:
httpd.csr 100% 704 0.7KB/s 00:00
CA端签署证书
[root@localhost ~]# openssl ca -in /tmp/httpd.csr -out /etc/pki/CA/certs/httpd_100.crt
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 4 (0x4)
Validity
Not Before: Jan 13 12:28:56 2016 GMT
Not After : Jan 12 12:28:56 2017 GMT
Subject:
countryName = CN
stateOrProvinceName = Beijing
organizationName = MageEdu
organizationalUnitName = Ops
commonName = www.magedu.com
emailAddress = webadmin@magedu.com
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
1B:8B:69:E3:89:4F:44:24:D2:B2:AD:79:7F:82:FF:83:9C:4C:55:5A
X509v3 Authority Key Identifier:
keyid:81:B6:92:BD:FD:87:9D:CD:DF:6E:FE:F9:A5:42:C9:59:F2:48:BE:5E
Certificate is to be certified until Jan 12 12:28:56 2017 GMT (365 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
[root@localhost ~]# cd /etc/pki/CA/certs/
[root@localhost certs]# ls
httpd_100.crt httpd.crt
把证书给WEB服务器
[root@localhost certs]# scp httpd_100.crt root@192.168.137.100:/etc/httpd/ssl
The authenticity of host '192.168.137.100 (192.168.137.100)' can't be established.
RSA key fingerprint is 78:9c:70:d0:e2:b9:5b:f1:d4:f3:1b:f7:34:f6:08:1e.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.137.100' (RSA) to the list of known hosts.
root@192.168.137.100's password:
httpd_100.crt 100% 5128 5.0KB/s 00:00
WEB服务器安装SSL模块
[root@localhost ssl]# ls
httpd_100.crt httpd.csr httpd.key
[root@localhost ssl]# yum -y install mod_ssl
...
备份ssl.conf
[root@localhost ~]# cd /etc/httpd/conf.d
[root@localhost conf.d]# cp ssl.conf ssl.conf.bak
修改正确路径,一般修改下面的四项
[root@localhost ~]# vim /etc/httpd/conf.d/ssl.conf
...
SSLCertificateFile /etc/httpd/ssl/httpd_100.crt
SSLCertificateKeyFile /etc/httpd/ssl/httpd.key //
DocumentRoot "/web/host1/"
ServerName www.magedu.com
...
检查语法,无误后重载配置或重启服务
[root@localhost ~]# httpd -t
Syntax OK
[root@localhost ~]# service httpd restart
Stopping httpd: [ OK ]
Starting httpd: [ OK ]
这时,所有配置经完成。在基于https协议浏览时,需要手动导入CA证书,一般为cacert.pem文件,可以改为证书标准后缀*.crt
在浏览器测试
用上面的命令行工具测试
[root@localhost ~]# openssl s_client -connect www.magedu.com:443 -CAfile /etc/pki/CA/cacert.pem
CONNECTED(00000003)
depth=1 C = CN, ST = Beijing, L = Beijing, O = MageEdu, OU = Ops, CN = ca.magedu.com, emailAddress = caadmin@magedu.com
verify return:1
depth=0 C = CN, ST = Beijing, O = MageEdu, OU = Ops, CN = www.magedu.com, emailAddress = webadmin@magedu.com
verify return:1
---
Certificate chain
0 s:/C=CN/ST=Beijing/O=MageEdu/OU=Ops/CN=www.magedu.com/emailAddress=webadmin@magedu.com
i:/C=CN/ST=Beijing/L=Beijing/O=MageEdu/OU=Ops/CN=ca.magedu.com/emailAddress=caadmin@magedu.com
---
Server certificate
-----BEGIN CERTIFICATE-----
...[密文字符串]...
-----END CERTIFICATE-----
subject=/C=CN/ST=Beijing/O=MageEdu/OU=Ops/CN=www.magedu.com/emailAddress=webadmin@magedu.com
issuer=/C=CN/ST=Beijing/L=Beijing/O=MageEdu/OU=Ops/CN=ca.magedu.com/emailAddress=caadmin@magedu.com
---
No client certificate CA names sent
Server Temp Key: ECDH, prime256v1, 256 bits
---
SSL handshake has read 1714 bytes and written 375 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 1024 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : TLSv1.2
Cipher : ECDHE-RSA-AES256-GCM-SHA384
Session-ID: E2277F73538510B2F343B167AA42426F9DB4552618B6AF46291BDD76E44832E2
Session-ID-ctx:
Master-Key: 46603F227F38A8510A757442C218FF3284D47D37469D3584EBF2C17E3570A8C4A792D0EB4443539A18CD212D4E2F35F4
Key-Arg : None
Krb5 Principal: None
PSK identity: None
PSK identity hint: None
TLS session ticket lifetime hint: 300 (seconds)
TLS session ticket:
0000 - 16 b8 8d 42 49 eb 70 7f-1b 5c bc cd 98 10 21 05 ...BI.p..\....!.
0010 - c9 09 10 32 2e da 73 e7-6b de ca 1d 0b 42 c7 83 ...2..s.k....B..
0020 - c4 79 e6 e4 dc 0c 5f 1f-70 dd c9 89 78 f2 45 f4 .y...._.p...x.E.
0030 - ad 36 2a d0 0d 6c 6b 8a-0b d1 81 ce ad 65 cc 84 .6*..lk......e..
0040 - 45 84 eb ff fd c3 26 f2-82 9f 0e 52 70 4a 59 21 E.....&....RpJY!
0050 - 0e 5d 7d 27 e9 ed ae da-b6 0d d3 62 64 29 60 54 .]}'.......bd)`T
0060 - c4 49 c5 cf 3f 73 a7 79-e9 ee 9a 44 2f 02 c5 26 .I..?s.y...D/..&
0070 - 67 08 7a b5 fb 0b 04 9f-75 53 6d 75 c3 a2 60 3e g.z.....uSmu..`>
0080 - b9 9c 99 37 15 7f a1 67-7f 77 d4 37 4b 7d 87 2a ...7...g.w.7K}.*
0090 - be ee 00 cf d4 06 89 ac-b1 95 07 17 94 6a 03 26 .............j.&
00a0 - e6 94 5c e6 3f 77 07 2b-2e fd 8f 96 d0 9a da eb ..\.?w.+........
00b0 - 9e 51 da f9 98 5c 56 a0-d0 ed 1e fb 96 d1 cf e7 .Q...\V.........
Start Time: 1452694967
Timeout : 300 (sec)
Verify return code: 0 (ok)
---
GET /admin/test.html HTTP/1.1
Host: www.magedu.com
HTTP/1.1 200 OK
Date: Wed, 13 Jan 2016 14:23:04 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Wed, 13 Jan 2016 14:21:16 GMT
ETag: "14-16-52937e2116c2c"
Accept-Ranges: bytes
Content-Length: 22
Connection: close
Content-Type: text/html; charset=UTF-8
<h1>Good Morning</h1>
closed
18、http自带的工具程序
htpasswd: basic认证基于文件实现时,用到的账号密码文件生成工具
apachectl: httpd自带的服务控制脚本,支持start和stop
# apachectl stop|start
apxs: 由httpd-devel包提供,扩展httpd使用第三方模块的工具
rotatelogs: 日志滚动工具,有两个维度,时间、体积
access.log à
access.log, access.1.logà
access.log, access.1.log, access.2.logà
...
suexec: 访问某些有特殊权限配置的资源时,临时切换至指定用户身份运行
ab: apache bench 压测工具
19、httpd的压力测试工具
文本行工具:
ab, webbench, http_load, seige
图形化工具
jmeter, loadrunner
其中
tcpcopy: 是网易开源的,复制生产环境中的真实请求,并将之保存下来
ab命令的用法
# ab [OPTIONS] URL
-n: 总请求数
-c: 模拟的并行数
-k: 以持久连接模式 测试
注意:一般c模拟的并行数要小于等于n总请求数
示例:
[root@localhost ~]# ab -c 100 -n 1000 http://172.16.100.6/index.html
...[测试结果]...
基于OpenSSL的https服务配置 (以前的笔记)
记得先设置SELinux 、iptables
1)、要想使用Web服务器支持SSL功能,首先要安装SSL模块
用命令httpd -M 查看是否安装mod_ssl模块,如没有,用yum安装即可
[root@localhost ~]# httpd -M
[root@localhost ~]# yum -y install mod_ssl
2)、提供CA,这时需要再提供一台主机做CA,IP 地址192.168.10.25 。要想做CA,首先要生成自签证书。使用openssl genrsa格式先生成密钥,输出保存在/etc/pki/CA/private/cakey.pem ,2048位,600权限其他人不允许访问。
[root@localhost ~]# cd /etc/pki/CA
[root@localhost CA]# (umask 077;openssl genrsa -out private/cakey.pem 2048)
生成自签证书,先修改默认配置信息,保存退出
[root@localhost ~]# cd /etc/pki/tls
[root@localhost tls]# vim openssl.cnf
countryName_default = CN
stateOrProvinceName_default = Gansu
localityName_default = Lanzhou
0.organizationName_default = School
organizationalUnitName_default = Tech
接着生成自签证书
[root@localhost ~]# cd /etc/pki/CA
[root@localhost CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3655
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) [CN]:
State or Province Name (full name) [Gansu]:
Locality Name (eg, city) [Lanzhou]:
Organization Name (eg, company) [School]:
Organizational Unit Name (eg, section) [Tech]:
Common Name (eg, your name or your server's hostname) []:ca.e.com
Email Address []:admin@e.com
接着更改路径
[root@localhost ~]# cd /etc/pki/tls
[root@localhost tls]# vim openssl.cnf
dir = /etc/pki/CA # TSA root directory
创建目录和文件
[root@localhost CA]# mkdir certs crl newcerts
[root@localhost CA]# touch index.txt
[root@localhost CA]# echo 01 > serial
[root@localhost CA]# ls
cacert.pem certs crl index.txt newcerts private serial
至此CA已经能用了。
3)、返回到Web服务器
生成自己的密钥
[root@localhost ~]# cd /etc/httpd
[root@localhost httpd]# mkdir ssl
[root@localhost httpd]# ls
conf conf.d logs modules run ssl
[root@localhost httpd]# cd ssl/
[root@localhost ssl]# (umask 077; openssl genrsa 1024 > httpd.key)
Generating RSA private key, 1024 bit long modulus
...................++++++
................++++++
e is 65537 (0x10001)
生成证书颁发请求
[root@localhost ssl]# openssl req -new -key httpd.key -out httpd.csr
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) []:Gansu
Locality Name (eg, city) [Default City]:Lanzhou
Organization Name (eg, company) [Default Company Ltd]:School
Organizational Unit Name (eg, section) []:Tech
Common Name (eg, your name or your server's hostname) []:www.a.com #该证书是谁使用,就写谁的域名(拥有者)
Email Address []:www@a.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[root@localhost ssl]# ls
httpd.csr httpd.key
把证书送到CA
[root@localhost ssl]# scp httpd.csr 192.168.10.25:/tmp
root@192.168.10.25's password:
httpd.csr 100% 680 0.7KB/s 00:00
4)、回到CA , 开始签署证书
签署过程
[root@localhost ~]# openssl ca -in /tmp/httpd.csr -out /tmp/httpd.crt -days 3655
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: Nov 7 09:56:39 2015 GMT
Not After : Nov 9 09:56:39 2025 GMT
Subject:
countryName = CN
stateOrProvinceName = Gansu
organizationName = School
organizationalUnitName = Tech
commonName = www.a.com
emailAddress = www@a.com
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
AB:BB:38:69:02:5A:AD:39:F4:34:77:A8:88:D1:0E:0A:F3:F9:94:F4
X509v3 Authority Key Identifier:
keyid:8B:31:A3:0F:82:84:0E:7A:07:EC:0C:34:47:57:69:B5:68:2F:2C:0A
Certificate is to be certified until Nov 9 09:56:39 2025 GMT (3655 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
查看证书签署结果
[root@localhost ~]# cd /etc/pki/CA
[root@localhost CA]# cat index.txt
V 251109095639Z 01 unknown /C=CN/ST=Gansu/O=School/OU=Tech/CN=www.a.com/emailAddress=www@a.com
[root@localhost CA]# cat serial
02
此时,证书已经签好(官方登记成功)了
5)、到Web服务器取回已经签好的自己的证书
操作如下
[root@localhost ssl]# scp 192.168.10.25:/tmp/httpd.crt ./
root@192.168.10.25's password:
httpd.crt 100% 3784 3.7KB/s 00:00
[root@localhost ssl]# ls
httpd.crt httpd.csr httpd.key
至此,证书已取回成功
6)、再到CA ,因为刚才是在/tmp 临时目录操作的,为避免被别人获取,应该把证书相关的文件删除
[root@localhost CA]# ls
cacert.pem certs crl index.txt index.txt.attr index.txt.old newcerts private serial serial.old
[root@localhost CA]# ls newcerts/
01.pem
[root@localhost CA]# cd /tmp
[root@localhost tmp]# ls /tmp
httpd.crt httpd.csr
[root@localhost tmp]# rm -f httpd.c*
7)、配置Web服务器使用此证书
操作如下,主要是配置ssl.conf 文件,这里只列出了需要修改的行
[root@localhost ~]# cd /etc/httpd/conf.d/
[root@localhost conf.d]# ls
manual.conf nagios.conf php.conf README ssl.conf virtual.conf welcome.conf
[root@localhost conf.d]# cp ssl.conf ssl.conf.bak
[root@localhost conf.d]# vim ssl.conf
<VirtualHost 192.168.10.100:443>
<VirtualHost _default_:443> //这是CentOS 7上httpd-2.4版本默认监听地址
ServerName www.a.com
DocumentRoot "/www/a.com"
SSLCertificateFile /etc/httpd/ssl/httpd.crt
SSLCertificateKeyFile /etc/httpd/ssl/httpd.key
## crt: 证书
## crl: 证书吊销列表
检查语法-->重启httpd服务-->查看443端口是否监听
[root@localhost conf.d]# httpd -t
Syntax OK
[root@localhost conf.d]# service httpd restart
Stopping httpd: [ OK ]
Starting httpd: [ OK ]
[root@localhost conf.d]# netstat -tnlp |grep :443
tcp 0 0 :::443 :::* LISTEN 2354/httpd
8)、客户端安装CA自签证书
如果不能配置DNS 服务器,而客户机是 Windows 系统,可以在Windows 安装目录下的 system32\drivers\etc 目录中找到hosts 文件(Linux的hosts 文件在 /etc 目录),然后添加以下内容,就可以保证本客户机使用的www.a.com 域名指向192.168.10.100
192.168.10.100 www.a.com
用传输工具,在CA 服务器上把CA自签证书复制过来,修改后缀为 .crt 后再安装。
CA 服务器:/etc/pki/CA/cacert.pem --> 客户机
9)、建立安全的连接传输
在浏览器中输入 协议为 https://www.a.com 即可。至此,基本的配置已完成。
httpd-2.4基本应用(03)
回顾:
http协议基础,httpd2.2的基础配置
http协议:请求<-->响应
request:
<method> <URL> <version>
<HEADER>
<entity>
response
<version> <status code> <reason phrase>
<HEADERS>
<entity>
请求方法:GET, HEAD, POST, PUT, DELETE, OPTIONS, TRACE, ...
httpd-2.2基本配置
mod_deflate 模块:页面压缩之后再传输的
User/Group
https(tcp/443)的实现
命令工具:curl,ab
课外作业:理解ab命令执行结果所输出信息的意义
httpd的基本应用(3)
httpd-2.4
新特性:
(1)MPM支持运行为DSO机制,以模块形式按需加载
(2)event MPM生产环境可用
(3)异步读写机制
(4)支持每模块及每目录的单独日志级别定义
(5)每请求相关的专用配置
(6)增强版的表达式分析器
(7)毫秒级持久连接时长定义
(8)基于FQDN的虚拟主机也不再需要NameVirtualHost指令
(9)新指令,AllowOverrideList
(10)支持用户自定义变量
(11)更低的内存消耗
新模块:
(1)mod_proxy_fcgi //Fastcgi
(2)mod_proxy_scgi //SCGI
//(3)mod_proxy_express
(3)mod_remoteip //基于IP的访问控制
安装httpd-2.4
依赖于apr-1.4+, apr-util-1.4+, [apr-iconv]
apr: apache portable runtime(虚拟机)
在CentOS 6编译安装:
默认安装的是:apr-1.3.9, apr-util-1.3.9
开发环境包组:Development Tools, Server Platform Development
开发程序包:pcre-devel
编译安装步骤:
(1)apr-1.4+
# ./configure --prefix=/usr/local/apr
# make && make install
(2)apr-util-1.4+
# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
# make && make install
(3)httpd-2.4
# ./configure --prefix=/usr/local/apache24 --sysconfdir=/etc/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork
# make && make install
各配置选项简单说明
--prefix=?? //指明程序安装目录
--sysconfdir=?? //指明程序配置文件目录
--enable-so //支持DSO机制
--enable-ssl //支持SSL功能
--enable-cgi //支持CGI功能
--enable-rewrite //支持URL重写
--enable-zlib //提供压缩库,可以让页面压缩后发送和接收
--with-pcre //支持perl扩展的正则表达式模式,提供更强大的模式分析
--with-apr=/usr/local/apr //指明依赖的模块
--with-apr-util=/usr/local/apr-util //指明依赖的模块
--enable-modules=most //有三种方式给定,most|all|[模块列表]
--enable-mpms-shared=all //把三个模块都编译出来
--with-mpm=prefork //指明默认工作模块
--with-?? //依赖于哪些程序包的
--without-?? //不依赖于哪些程序包的
--enable-?? //启用哪些特性
--disable-?? //启用或禁用哪些特性的
不写 "=" 也就是不指明,它会到默认位置找
CentOS 6演示编译安装httpd服务过程
先将rpm包安装的程序停止运行,再确保开机不会自动启动
[root@localhost ~]# service httpd stop
Stopping httpd: [ OK ]
[root@localhost ~]# chkconfig httpd off
1安装开发环境
[root@localhost ~]# yum -y groupinstall "Development Tools" "Server Platform Development"
...
[root@localhost ~]# yum -y install pcre-devel
...
2准备程序包,并编译安装
1)编译安装apr
[root@localhost ~]# ls -l
total 6456
-rw-r--r--. 1 root root 813976 Mar 18 2014 apr-1.5.0.tar.bz2
-rw-r--r--. 1 root root 695303 Mar 18 2014 apr-util-1.5.3.tar.bz2
-rw-r--r--. 1 root root 5031834 Dec 16 2014 httpd-2.4.10.tar.bz2
[root@localhost ~]# tar xf apr-1.5.0.tar.bz2
[root@localhost ~]# cd apr-1.5.0
[root@localhost apr-1.5.0]# ./configure --prefix=/usr/local/apr
...
[root@localhost apr-1.5.0]# make && make install
..
2)编译安装apr-util
[root@localhost apr-1.5.0]# cd
[root@localhost ~]#
[root@localhost ~]# tar xf apr-util-1.5.3.tar.bz2
[root@localhost ~]# cd apr-util-1.5.3
[root@localhost apr-util-1.5.3]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
...
[root@localhost apr-util-1.5.3]# make && make install
...
3)编译安装httpd
[root@localhost ~]# tar xf httpd-2.4.10.tar.bz2
[root@localhost ~]# cd httpd-2.4.10
[root@localhost httpd-2.4.10]# ./configure --prefix=/usr/local/apache24 --sysconfdir=/etc/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork
...
[root@localhost httpd-2.4.10]# make -j 2 && make install
...
3安装后目录介绍
/usr/local/apache24/
bin //二进制程序目录
build //编译安装的相关文件
├── config.nice //编译时configure的配置选项
└── [...]
error //错误页面的目录
htdocs //网页文档存放目录
icons //图标
include //头文件目录
...
/etc/httpd24/
├── httpd.conf //配置文件
└── [...]
4导出环境变量
此时启动方法可用绝对路径 +start 的命令
[root@localhost ~]# /usr/local/apache24/bin/apachectl start
再或者将这个程序文件加入环境变量
注意:一定要添加在最左边,要比原有rpm包安装的bin程序先执行
[root@localhost ~]# export PATH=/usr/local/apache24/bin:$PATH
[root@localhost ~]# echo $PATH
/usr/local/apache24/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
编辑配置文件使永久生效
[root@localhost ~]# vim /etc/profile.d/httpd.sh
export PATH=/usr/local/apache24/bin:$PATH
5导出头文件
[root@localhost ~]# ln -sv /usr/local/apache24/include /usr/include/httpd
`/usr/include/httpd/include' -> `/usr/local/apache24/include'
6导出库文件(这里并没有导出,可能是其他原因,但方法是正确的)
[root@localhost ~]# vim /etc/ld.so.conf.d/httpd.conf
/usr/local/apache24/lib
[root@localhost ~]# ldconfig -v //系统重新生成缓存
7实现脚本启动
1)自带的服务控制脚本:apachectl(同样需要加入环境变量)
2)如果要实现开机自动启动,可直接复制现有httpd-2.2的脚本控制文件副本,进行修改即可
[root@localhost ~]# cd /etc/rc.d/init.d
[root@localhost init.d]# cp httpd httpd24
[root@localhost init.d]# vim httpd24
...
#if [ -f /etc/sysconfig/httpd ]; then
# . /etc/sysconfig/httpd
#fi
#apachectl=/usr/sbin/apachectl
apachectl=/usr/local/apache24/bin/apachectl
#httpd=${HTTPD-/usr/sbin/httpd}
httpd=${HTTPD-/usr/local/apache24/bin/httpd}
#pidfile=${PIDFILE-/var/run/httpd/httpd.pid}
pidfile=${PIDFILE-/usr/local/apache24/logs/httpd.pid}
#lockfile=${LOCKFILE-/var/lock/subsys/httpd}
lockfile=${LOCKFILE-/var/lock/subsys/httpd24}
...
3)配置开机自启动
[root@localhost init.d]# chkconfig --add httpd24
[root@localhost init.d]# chkconfig --list httpd24
httpd24 0:off 1:off 2:off 3:off 4:off 5:off 6:off
[root@localhost init.d]# chkconfig --level 35 httpd24 on
[root@localhost init.d]# chkconfig --list httpd24
httpd24 0:off 1:off 2:off 3:on 4:off 5:on 6:off
4)查看运行状态
[root@localhost init.d]# service httpd24 status
httpd (pid 32677) is running...
至此,手动修改的控制脚本已经完成。
在CentOS 7安装:
直接通过yum安装
# yum install httpd
配置文件:
/etc/httpd/conf/httpd.conf //主配置文件
/etc/httpd/conf.modules.d/*.conf //模块配置文件
/etc/httpd/conf.d/*.conf //配置文件的组成部分
配置应用:
(1)切换使用的MPM
编辑配置文件/etc/httpd/conf.modules.d/00-mpm.conf,启用要启用的MPM相关的LoadModule指令即可
(2)基于IP的访问控制
允许所有主机访问:Require all granted
拒绝所有主机访问:Require all deny
控制特定的IP访问
Require ip IPADDR: 授权指定来源的主机访问
Require not ip IPADDR:拒绝
控制特定的主机访问
Require host HOSTNAME:授权指定来源的主机访问
Require not host HOSTNAME:拒绝
HOSTNAME:
FQDN:特定主机
domin.tld : 指定域名下的所有主机
示例:
允许所有主机访问
<RequireAll>
Require all granted
Require not ip 172.16.100.2
</RequireAll>
(3)虚拟主机
httpd-2.4基于FQDN的虚拟主机也不再需要NameVirutalHost指令
<VirtualHost *:80>
ServerName wordpress.stu1.com
DocumentRoot "/web/vhosts/wordpress"
Errorlog /web/vhosts/wordpress/logs/error_log //好像要给全路径
CustomLog /web/vhosts/wordpress/logs/access_log common //好像要给全路径
<Directory "/web/vhosts/wordpress">
Options None
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
只有明确授权才能被访问
注意:任意目录下的页面只有显式授权才能被访问
(4)ssl
(5)KeepAliveTimeout #ms
毫秒级持久连接时长定义
练习题:分别使用httpd-2.2和httpd-2.4实现;
1、建立httpd服务,要求:
(1)提供两个基于名称的虚拟主机:
www1.stuX.com,页面文件目录为/web/vhosts/www1;错误日志为/var/log/httpd/www1/error_log,访问日志为/var/log/httpd/www1/access_log;
www2.stuX.com,页面文件目录为/web/vhosts/www2;错误日志为/var/log/httpd/www2/error_log,访问日志为/var/log/httpd/www2/access_log;
(2)通过www1.stuX.com/server-status输出其状态信息,且要求只允许提供账号的用户访问;
(3)www1不允许192.168.1.0/24网络中的主机访问;
2、为上面的第2个虚拟主机提供https服务,使得用户可以通过https安全的访问此web站点;
(1)要求使用证书认证,证书中要求使用国家(CN),州(Beijing),城市(Beijing),组织为(MageEdu);
(2)设置部门为Ops, 主机名为www2.stuX.com
lamp基础应用入门(04)
LAMP
a: apache(httpd)
m: mysql,mariadb
p: php,perl,python
WEB资源类型:
静态资源:原始形式与响应内容一致
动态资源:原始形式通常为程序文件,需要在服务器端执行之后,将执行结果返回给客户端
客户端技术:javascript
服务器端技术:php,jsp
application/x-http-php
CGI: Common Gateway Interface
可以让一个客户端,从网页浏览器向执行在网络服务器上的程序请求数据,CGI描述了客户端和服务器程序之间传输的一种标准
响应用户的请求,管理后端的应用程序进程
程序=指令+数据
数据模型:
层次模型
网状模型
关系型模型:表(行+列)
关系型模型:IngreSQL, Oracle, Sybase, Infomix, DB2(IBM), SQL Server,MySQL, PostgreSQL, MariaDB
指令:代码文件
数据:数据存储系统、文件
请求流程:
Client --(httpd)--> httpd –-(cgi)--> application server (program file) –-(mysql) --> mysql
php:脚本编程语言、嵌入到html中的嵌入式web程序开发语言
基于zend编译成opcode(二进制格式的字节码,重复运行,可省略编译环境)
关于PHP
一、PHP简介
PHP是通用服务器端脚本编程语言,其主要用于web开发以实现动态web页面,它也是最早实现将脚本嵌入HTML源码文档中的服务器端脚本语言之一。同时,php还提供了一个命令行接口,因此,其也可以在大多数系统上作为一个独立的shell来使用。
Rasmus Lerdorf于1994年开始开发PHP,它是初是一组被Rasmus Lerdorf称作"Personal Home Page Tool" 的Perl脚本, 这些脚本可以用于显示作者的简历并记录用户对其网站的访问。后来,Rasmus Lerdorf使用C语言将这些Perl脚本重写为CGI程序,还为其增加了运行Web forms的能力以及与数据库交互的特性,并将其重命名为"Personal Home Page/Forms Interpreter"或"PHP/FI"。此时,PHP/FI已经可以用于开发简单的动态web程序了,这即是PHP 1.0。1995年6月,Rasmus Lerdorf把它的PHP发布于comp.infosystems.www.authoring.cgi Usenet讨论组,从此PHP开始走进人们的视野。1997年,其2.0版本发布。
1997年,两名以色列程序员Zeev Suraski和Andi Gutmans重写的PHP的分析器(parser)成为PHP发展到3.0的基础,而且从此将PHP重命名为PHP: Hypertext Preprocessor。此后,这两名程序员开始重写整个PHP核心,并于1999年发布了Zend Engine 1.0,这也意味着PHP 4.0的诞生。2004年7月,Zend Engine 2.0发布,由此也将PHP带入了PHP 5时代。PHP5包含了许多重要的新特性,如增强的面向对象编程的支持、支持PDO(PHP Data Objects)扩展机制以及一系列对PHP性能的改进。
二、PHP Zend Engine
Zend Engine是开源的、PHP脚本语言的解释器,它最早是由以色列理工学院(Technion)的学生Andi Gutmans和Zeev Suraski所开发,Zend也正是此二人名字的合称。后来两人联合创立了Zend Technologies公司。
Zend Engine 1.0于1999年随PHP 4发布,由C语言开发且经过高度优化,并能够做为PHP的后端模块使用。Zend Engine为PHP提供了内存和资源管理的功能以及其它的一些标准服务,其高性能、可靠性和可扩展性在促进PHP成为一种流行的语言方面发挥了重要作用。
Zend Engine的出现将PHP代码的处理过程分成了两个阶段:首先是分析PHP代码并将其转换为称作Zend opcode的二进制格式(类似Java的字节码),并将其存储于内存中;第二阶段是使用Zend Engine去执行这些转换后的Opcode。
三、PHP的Opcode
Opcode是一种PHP脚本编译后的中间语言,就像Java的ByteCode,或者.NET的MSL。PHP执行PHP脚本代码一般会经过如下4个步骤(确切的来说,应该是PHP的语言引擎Zend):
1、Scanning(Lexing) —— 将PHP代码转换为语言片段(Tokens)
2、Parsing —— 将Tokens转换成简单而有意义的表达式
3、Compilation —— 将表达式编译成Opocdes
4、Execution —— 顺次执行Opcodes,每次一条,从而实现PHP脚本的功能
扫描-->分析-->编译-->执行
四、php的加速器
基于PHP的特殊扩展机制如opcode缓存扩展也可以将opcode缓存于php的共享内存中,从而可以让同一段代码的后续重复执行时跳过编译阶段以提高性能。由此也可以看出,这些加速器并非真正提高了opcode的运行速度,而仅是通过分析opcode后并将它们重新排列以达到快速执行的目的。
常见的php加速器有:
1、APC (Alternative PHP Cache)
遵循PHP License的开源框架,PHP opcode缓存加速器,目前的版本不适用于PHP 5.4。项目地址,http://pecl.php.net/package/APC。
源于Turck MMCache,早期的版本包含了一个PHP encoder和PHP loader,目前encoder已经不在支持。项目地址, http://eaccelerator.net/。
快速而且稳定的PHP opcode缓存,经过严格测试且被大量用于生产环境。项目地址,http://xcache.lighttpd.net/
4、Zend Optimizer和Zend Guard Loader
Zend Optimizer并非一个opcode加速器,它是由Zend Technologies为PHP5.2及以前的版本提供的一个免费、闭源的PHP扩展,其能够运行由Zend Guard生成的加密的PHP代码或模糊代码。 而Zend Guard Loader则是专为PHP5.3提供的类似于Zend Optimizer功能的扩展。项目地址,http://www.zend.com/en/products/guard/runtime-decoders
NuSphere的一款开源PHP加速器,它支持装载通过NuSphere PHP Encoder编码的PHP程序文件,并能够实现对常规PHP文件的执行加速。项目地址,http://www.nusphere.com/products/phpexpress.htm
PHP的源码在结构上非常清晰。其代码根目录中主要包含了一些说明文件以及设计方案,并提供了如下子目录:
1、build —— 顾名思义,这里主要放置一些跟源码编译相关的文件,比如开始构建之前的buildconf脚本及一些检查环境的脚本等。
2、ext —— 官方的扩展目录,包括了绝大多数PHP的函数的定义和实现,如array系列,pdo系列,spl系列等函数的实现。 个人开发的扩展在测试时也可以放到这个目录,以方便测试等。
3、main —— 这里存放的就是PHP最为核心的文件了,是实现PHP的基础设施,这里和Zend引擎不一样,Zend引擎主要实现语言最核心的语言运行环境。
4、Zend —— Zend引擎的实现目录,比如脚本的词法语法解析,opcode的执行以及扩展机制的实现等等。
5、pear —— PHP 扩展与应用仓库,包含PEAR的核心文件。
6、sapi —— 包含了各种服务器抽象层的代码,例如apache的mod_php,cgi,fastcgi以及fpm等等接口。
7、TSRM —— PHP的线程安全是构建在TSRM库之上的,PHP实现中常见的*G宏通常是对TSRM的封装,TSRM(Thread Safe Resource Manager)线程安全资源管理器。
8、tests —— PHP的测试脚本集合,包含PHP各项功能的测试文件。
9、win32 —— 这个目录主要包括Windows平台相关的一些实现,比如sokcet的实现在Windows下和*Nix平台就不太一样,同时也包括了Windows下编译PHP相关的脚本。
httpd:接收用户的web请求,静态资源则直接响应,动态资源为php脚本,对此类资源的请求交由php来运行
CentOS 6: httpd,php,mysql-server,php-mysql
CentOS 7: httpd,php,php-mysql,mariadb-server
# systemctl start httpd.service
# systemctl start mariadb.service
mysql> GRANT ALL PRIVILEGES ON db_name.tbl_name TO username@host IDENTIFIED BY 'password';
$conn = mysql_connect('172.16.100.67','testuser','testpass');
实践作业:部署lamp,以虚拟主机安装wordpress,phpwind,discuz;
MariaDB [(none)]> GRANT ALL ON wpdb.* TO wpuser@'192.168.137.%' IDENTIFIED BY 'wppass';
MariaDB [(none)]> CREATE DATABASE wpdb;
2016/01/15
lamp组合深入介绍(01)
动态资源:Client--http--httpd-cgi--application server
动态资源:Client--http--httpd--libphp5.so()
动态资源:Client--http--httpd--libphp5.so(php模块)--mysql(驱动)--MySQL server
Scanning--Parsing--Compilation--Execution
sendfile64()静态文件不再经过用户空间,直接在内核空间处理返回给用户
(1)Modules:程序包: httpd, php, php-mysql, mariadb-server
(2)FastCGI:程序包: httpd, php-fpm, php-mysql, mariadb-server
httpd, php, php-mysql, mysql-server
配置文件:/etc/php.ini,/etc/php.d/*.ini
配置文件在php解释器启动时被读取,因此,对配置文件的修改如何生效??
php.ini的核心配置选项文档:http://php.net/manual/zh/ini.core.php
php.ini配置选项列表:http://php.net/manual/zh/ini.list.php
SQL接口:Structured Query Language
ANSI: SQL标准,SQL-86, SQL-89, SQL-92, SQL-99, SQL-03, ...
DML: Date Manapulating Language
DBMS:DataBase Management System
mariadb基础应用(02)
事务(Transaction):组织多个操作为一个整体,要么全部都执行,要么全部都不执行
外键约束:一个表中字段要填入的数据要取决于另外表一张表中某字段有没有这个数据
常识约束:比如年龄不能为负数,或大于200等等,是合理取值区间中的值
后选键:能唯一标识的员工字段,员工工号、身份证号,能拿来当主键使用
设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
约束:constraint,向数据表插入的数据要遵守的限制规则
主键:一个或多个字段的组合,填入主键的数据,必须不同于已存在的数据,不能为空
外键:一个表中某字段中的数据能插入的数据,取决于另外一张表中的数据
唯一键:一个或多个字段的组合,填入唯一键中的数据,必须不同于已存在的数据,可以为空
索引:将表中的某一个或某些字段抽取出来,将其单独组织一个独特的数据结构中
逻辑层:描述DATABASE存储什么数据,以及数据间存在什么样的关系
插件式存储引擎:存储管理器有多种实现版本,彼此间的功能和特性可能略有区别;用户可根据需要灵活选择
# tar xf mariadb-VERSION.tar.xz -C /usr/local
# ln -sv mariadb-VERSION mysql
# cp support-files/my-large.cnf /etc/mysql/my.cnf
# scripts/mysql_install_db --user=mysql --datadir=/mydata/data
# cp support-files/mysql.server /etc/init.d/mysqld
OV Vendor提供mariadb rpm包安装的服务的配置文件查找次序:
/etc/mysql/my.cnf -> /etc/my.cnf -> --default-extra-file=/PATH/TO/CONF_FILE -> ~/.my.cnf
/etc/my.cnf -> /etc/mysql/my.cnf -> --default-extra-file=/PATH/TO/CONF_FILE -> ~/.my.cnf
# cp support-files/my-large.cnf /etc/my.cnf
[root@localhost ~]# useradd -r mysql
anaconda-ks.cfg mariadb-5.5.46-linux-x86_64.tar.gz
[root@localhost ~]# tar xf mariadb-5.5.46-linux-x86_64.tar.gz -C /usr/local/
[root@localhost ~]# cd /usr/local
[root@localhost local]# ln -sv mariadb-5.5.46-linux-x86_64 mysql
'mysql' -> 'mariadb-5.5.46-linux-x86_64'
[root@localhost local]# cd mysql
[root@localhost mysql]# chown -R root:mysql ./*
[root@localhost mysql]# mkdir -pv /mydata/data
mkdir: created directory '/mydata'
mkdir: created directory '/mydata/data'
[root@localhost mysql]# chown mysql:mysql /mydata/data
[root@localhost mysql]# mv /etc/my.cnf /etc/my.cnf.libs
[root@localhost mysql]# cp support-files/my-large.cnf /etc/my.cnf
[root@localhost mysql]# vim /etc/my.cnf
[root@localhost mysql]# scripts/mysql_install_db --user=mysql --datadir=/mydata/data
[root@localhost mysql]# cp support-files/mysql.server /etc/init.d/mysqld
[root@localhost mysql]# chkconfig --add mysqld
[root@localhost mysql]# service mysqld start
[root@localhost ~]# vim /etc/profile.d/mysqld.sh
export PATH=/usr/local/mysql/bin:$PATH
[root@localhost ~]# source /etc/profile.d/mysqld.sh
mariadb的核心DDL语句(03)
数据库、表、索引、视图、存储过程、存储函数、触发器、事件调度器、用户和权限
DML:INSERT, DELETE,UPDATE,SELECT
Unix Sock:/var/lib/mysql/mysql.sock,/tmp/mysql.sock
-hHOST:远程主机(即mysql服务器) 地址,默认为localhost;
-p[PASSWORD]:USERNAME所表示的用户的密码,默认为空。
注意: mysql的用户账号由两部分组成:'USERNAME'@'HOST'; 其中HOST用于限制此用户可通过哪些远程主机连接当前的mysql服务。
-Ddb_name: 连接到服务器端之后,设定其此处指明的数据库为默认库。
-e'SQL COMMAND;': 连接至服务器并让其执行此命令后直接返回。
[root@localhost ~]# mysql -uroot -p -Dmysql
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 4
Server version: 5.5.46-MariaDB-log MariaDB Server
Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
[root@localhost ~]# mysql -e 'SHOW DATABASES;'
用于确定:数据存储格式、能参与运算种类、可表示的有效的数据范围
MariaDB [(none)]> SHOW CHARACTER SET;
INT(TINYINT,SMALLINT,MEDIUMIN,INT,BIGINT)
DDL: 数据定义语言,主要用于管理数据库组件,例如表、索引、视图、用户、存储过程
DML:数据操纵语言,主要用于管理表中的数据,实现数据的增、删、改、查
INSERT, DELETE, UPDATE, SELECT
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name;
[DEFAULT] CHARACTER SET [=] charset_name
[DEFAULT] COLLATE [=] collation_name
ALTER {DATABASE | SCHEMA} [db_name]
[DEFAULT] CHARACTER SET [=] charset_name
[DEFAULT] COLLATE [=] collation_name
DROP {DATABASE | SCHEMA} [IF EXISTS] db_name
CREATE TABLE [IF NOT EXISTS] tbl_name (create_defination) [table_options]
索引:KEY|INDEX [index_name] (col1, col2,...)
mysql> SHOW TABLES STATUS [LIKE 'tbl_name']
MariaDB [(none)]> show databases;
MariaDB [(none)]> CREATE DATABASE mydb;
Query OK, 1 row affected (0.00 sec)
Query OK, 0 rows affected (0.05 sec)
MariaDB [mydb]> DESC students;
+--------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+---------------------+------+-----+---------+-------+
| id | int(10) unsigned | NO | | NULL | |
| name | char(30) | NO | | NULL | |
| age | tinyint(3) unsigned | YES | | NULL | |
| gender | enum('f','m') | YES | | NULL | |
+--------+---------------------+------+-----+---------+-------+
MariaDB [mydb]> DROP TABLE students;
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.04 sec)
MariaDB [mydb]> DESC students;
+--------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+---------------------+------+-----+---------+-------+
| id | int(10) unsigned | NO | PRI | NULL | |
| name | char(30) | NO | PRI | NULL | |
| age | tinyint(3) unsigned | YES | | NULL | |
| gender | enum('f','m') | YES | | NULL | |
+--------+---------------------+------+-----+---------+-------+
MariaDB [mydb]> DROP TABLE students;
Query OK, 0 rows affected (0.01 sec)
Query OK, 0 rows affected (0.01 sec)
MariaDB [mydb]> DESC students;
+--------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+---------------------+------+-----+---------+-------+
| id | int(10) unsigned | NO | PRI | NULL | |
| name | char(30) | NO | | NULL | |
| age | tinyint(3) unsigned | YES | | NULL | |
| gender | enum('f','m') | YES | | NULL | |
+--------+---------------------+------+-----+---------+-------+
ALTER [ONLINE | OFFLINE] [IGNORE] TABLE tbl_name [alter_specification [, alter_specification] ...]
添加:ADD [COLUMN] col_name data_type [FIRST | AFTER col_name ]
ALTER TABLE students ADD class VARCHAR(100) NOT NULL;
ALTER TABLE students ADD class VARCHAR(100) NOT NULL AFTER name;
ALTER TABLE students ADD class VARCHAR(100) NOT NULL FIRST;
ALTER TABLE students DROP class;
CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST|AFTER col_name]
MODIFY [COLUMN] col_name column_definition [FIRST | AFTER col_name]
添加:ADD {PRIMARY|UNIQUE|FOREIGN} KEY (col1, col2,...)
添加:ADD {INDEX|KEY} [index_name] (col1, col2,...)
删除:DROP {INDEX|KEY} index_name
查看表上的索引的信息:mysql> SHOW INDEXES FROM tbl_name;
删除:DROP TABLE [IF EXISTS] tbl_name [, tbl_name] ...
mariadb的核心DDL和DML语句(04)
创建:CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [BTREE|HASH] ON tbl_name (col1, col2,,...)
删除:DROP INDEX index_name ON tbl_name
DML: INSERT, DELETE, UPDATE, SELECT
INSERT [INTO] tbl_name [(col1,...)] {VALUES|VALUE} (val1, ...),(...),...
(2) SELECT col1, col2, ... FROM tbl_name;
(3) SELECT col1, ... FROM tbl_name WHERE clause;
(4) SELECT col1, ... FROM tbl_name [WHERE clause] ORDER BY col_name, col_name2, ... [ASC|DESC];
DELETE FROM tbl_name [WHERE where_condition] [ORDER BY ...] [LIMIT row_count]
(1) DELETE FROM tbl_name WHERE where_condition
(2) DELETE FROM tbl_name [ORDER BY ...] [LIMIT row_count]
host:此用户访问当前mysql服务器时,允许其通过哪些主机远程创建连接
创建用户账号:CREATE USER 'username'@'host' [IDENTIFIED BY 'password'];
删除用户账号:DROP USER 'user'@'host' [, user@host] ...
GRANT priv_type,... ON [object_type] db_name.tbl_name TO 'user'@'host' [IDENTIFIED BY 'password'];
db_name.routine_name:指定库上的存储过程或存储函数
SHOW GRANTS FOR 'user'@'host';
回收权限:REVOKE priv_type, ... ON db_name.tbl_name FROM 'user'@'host';
注意:MariaDB服务进程启动时,会读取mysql库的所有授权表至内存中
(1) GRANT或REVOKE命令等执行的权限操作会保存于表中,MariaDB此时一般会自动重读授权表,权限修改会立即生效
(2) 其它方式实现的权限修改,要想生效,必须手动运行FLUSH PRIVILEGES命令方可
加固mysql服务器,在安装完成后,运行mysql_secure_installation命令,是一些安全的向导设置。
[root@localhost ~]# mysqladmin -u root -p password
2016/01/18
php-fpm及lamp编译安装(01)
DML:INSERT, DELETE, UPDATE, SELECT
DATE, TIME, DATETIME, TIMESTAMP
PHP-5.3.2-:默认不支持fpm机制,需要自行打补丁并编译安装
httpd-2.2: 默认不支持fcgi协议,需要自行编译此模块
解决方案:编译安装httpd-2.4, php-5,3,3+
服务配置文件: /etc/php-fpm.conf, /etc/php-fpm.d/*.conf
php环境配置文件: /etc/php.ini, /etc/php.d/*.ini
static: 固定数量的子进程,pm.max_children
创建session目录,并确保运行php-fpm进程的用户对此目录有读写权限
# chown apache.apache /var/lib/php/session
(1) 配置httpd,添加/etc/httpd/conf.d/fcgi.conf配置文件,内容类似:
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/var/www/html/$1
127.0.0.1: 是安装了php-fpm主机提供服务的监听地址
/var/www/html/$1: 是提供php-fpm主机的文件系统路径地址,$1是被模式匹配的内容资源
DocumentRoot /apps/vhosts/b.net //httpd服务器的静态页面的文件系统
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/apps/vhosts/b.net/$1
<Directory "/apps/vhosts/b.net">
如果mariadb不打算用通用二进制格式,则只需提供mariadb-devel开发包
在编译安装php时,一定要查看httpd的mpm模块是哪个?如果是进程式的prefork,php编译出来的是进程式的模块的php5,
如果httpd的mpm是work或event模型,php5应该编译成php5-zts模块。这两者是不通用的
如果是prefork模型,并且再编译了php,此时如果把prefork换成worker或event是不可以的,因为php不兼容,
php以模块化方式编译成httpd的模块时,它以httpd的mpm类型相关,
进程式的mpm和线程式的mpm它们所使用的php模块是互不兼容的
注意:任何一个程序包被编译操作依赖到时,需要安装此程序包的"开发"组件,其包名一般类似于name-devel-VERSION
# yum install pcre-devel apr-devel apr-util-devel openssl-devel
# yum install libxml2-devel libmcrypt-devel
(--enable-maintainer-zts)支持worker和event,线程模式。
(--with-apxs2=/usr/local/apache24/bin/apxs)编译成httpd的模块
# ./configure --enable-xcache --with-php-config=/usr/bin/php-config
注意:任意一个程序包被编译操作依赖到时,需要安装此程序包的"开发组件",其包名一般类似
lamp组合的其它话题(02)
# ./configure --enable-xcache --with-php-config=/usr/bin/php-config
博客作业一: CentOS 7, lamp(php-fpm)
(2)一个虚拟主机用于提供phpMyAdmin,另一个虚拟主机用于提供wordpress
博客作业二: CentOS 7, lamp(php-fpm)
(2)一个虚拟主机用于提供phpMyAdmin,另一个虚拟主机用于提供wordpress
博客作业三: CentOS 6, lamp(编译安装,模块或php-fpm)
(2)一个虚拟主机用于提供phpMyAdmin,另一个虚拟主机用于提供wordpress
[root@localhost ~]# httpd -M | grep fcgi
[root@localhost ~]# cat /etc/httpd/conf.modules.d/00-proxy.conf | grep fcgi
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
[root@localhost ~]# vim /etc/httpd/conf.d/fcgi.conf
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/web/vhosts/mysql/$1
[root@localhost ~]# vim /var/www/html/index.php
[root@localhost ~]# systemctl start php-fpm.service
[root@localhost ~]# systemctl start httpd.service
给视频的MINI linux 制作
POST --> BootSequence(BIOS) --> BootLoader --> Kernel (ramdisk) --> rootfs --> /sbin/init
运行系统初始化脚本:/etc/rc.d/rc.sysinit
POST --> BootSequence(BIOS) --> BootLoader --> Kernel (ramdisk) --> rootfs --> /sbin/systemd
[ -d $target ] || mkdir /mnt/sysroot
for lib in $(ldd $1 | grep -o "[^[:space:]]*/lib[^[:space:]]*"); do
[ -d $target$libdir ] || mkdir -p $target$libdir
[ -f $target$lib ] || cp $lib $target$lib
while [ "$command" != 'quit' ]; do
if ! which $command &> /dev/null; then
read -p "No such command, enter again: " command
command=$(which --skip-alias $command)
[ -d $target$cmnddir ] || mkdir -p $target$cmnddir
[ -f $target$command ] || cp $command $target$command
read -p "Another command(quit): " command
# make M=drivers/net/ethernet/intel/e1000/
2016/01/20
openssh的基本应用(01)
客户端用自己的私钥加密一段数据,然后发送给远程服务器,远程服务器如果能用客户的公钥解密,用户身份得到验证
超级守护进程: xinetd,服务器托管者,用于托管其他瞬时守护进程,自己是独立守护进程
配置文件:/etc/xinetd.conf, /etc/xinetd.d/*
windows: xshell, securecrt, sshseclureshellclient, putty;
用户提供一对儿密钥,私钥保留在客户端,公钥保留于远程服务器端的用户家目录下
sshd: 配置文件/etc/ssh/sshd_config
# ssh root@172.16.100.68 'ifconfig'
常用选项:
ssh [-l user] host [COMMAND]
-l user: 以指定的用户登录远程主机
-p port: 远程服务器监听的端口,为了安全,一定不能使用22号默认端口。
-X: 支持x11转发
-Y: 支持信任的x11转发
X: 协议,x-window,C/S
11: 是协议版本号
X11转发的作用: 在本地显示远程主机上的图形窗口
前提: 本地是X图形界面,或者提供了x server
-o StrictHostKeyChecking=no
接收的所有认可的服务器列表
~/.ssh/known_hosts
ssh远程连接服务器时的配置选项,定义在/etc/ssh/ssh_config配置文件中
HOST pattern
OPTION1 VALUE
OPTION2 VALUE
...
删除保留的认可的主机
ssh支持的用户认证方式:
基于口令的认证
基于密钥的认证:
(1)在本地主机生成一对儿密钥
ssh-keygen [-q] [-b bits] [-t type] [-f output_keyfile] [-P passphrase]
-t {rsa|ecdsa|dsa}: 公钥加密算法类型
-b bits: 指明密钥长度
-P passphrase: 私钥加密密码
-f output_keyfile: 是生成密钥的保存位置
(2)在本地主机上,将公钥复制到要登录的远程主机的某用户的家目录下的特定文件中(~/.ssh/authorized_keys)
ssh-copy-id [-i [identity_file]] [-p port] [-o ssh_option] [user@]hostname
(3)测试
ssh user@host
基于密钥的认证配置过程
在本地主机生成一对儿密钥
[root@localhost ~]# ssh-keygen -t rsa -P '' -f /root/.ssh/id_rsa
Generating public/private rsa key pair.
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
bd:67:3c:3e:20:18:4b:a1:ce:e5:66:38:72:46:74:a3 root@localhost.localdomain
The key's randomart image is:
+--[ RSA 2048]----+
| |
| . + |
| . + o |
| E + . |
| + = +S . |
| . B * . .o |
| + + ...= |
| +.. |
| .. |
+-----------------+
在本地主机上,将公钥复制到要登录的远程主机的某用户的家目录下的特定文件中
[root@localhost ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.16.1.22
The authenticity of host '172.16.1.22 (172.16.1.22)' can't be established.
ECDSA key fingerprint is ce:d0:f8:4a:e8:34:46:d1:f5:17:65:58:75:1b:94:da.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@172.16.1.22's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@172.16.1.22'"
and check to make sure that only the key(s) you wanted were added.
测试登录
[root@localhost ~]# ssh root@172.16.1.22
Last login: Tue Feb 2 18:06:32 2016 from 192.168.137.1
[root@localhost ~]# exit
logout
Connection to 172.16.1.22 closed.
ssh基本应用(02)
scp命令:基于ssh连接完成复制
scp [options] SRC... DEST/
scp [options] SRC DEST
存在两种使用情形:
PULL: scp [options] [user@]host:/PATH/TO/SOMEFILE /PATH/TO/SOMEFILE
PUSH: scp [options] /PATH/TO/SOMEFILE [user@]host:/PATH/TO/SOMEFILE
常用选项:
-r: 递归复制
-p: 保持原文件的权限信息
-q: 静默模式
-P PORT: 指明远程主机ssh协议监听的端口
sftp命令:
ftp: file transfer protocol, 明文
安全的文件传输机制
ftps: ftp over ssl
sftp: ftp over ssh
sftp:
C/S架构
S: 由sshd服务进程管理,是sshd的一个子系统,在CentOS系统上的openssh上,默认为启动状态
C: 即sftp
连接至远程主机: sftp user@host
sftp> help
sshd(服务器端)
配置文件: /etc/ssh/sshd_config
格式: 配置指令 值
常用指令:
Port 22
ListenAddress 0.0.0.0
Protocol 2 : 定义协议版本为2,第一版不安全
PermitRootLogin yes : 是否允许管理员远程登录
mysql的会话应该是: 短连接,其实长短链接都支持,
只要是服务器,并同时支持多个用户连接的,应该考虑
改为no
手册页:
man sshd_config
man sshd
man ssh_config
man ssh
限制可登录的用户(配置文件)
白名单:
AllowUsers user1 user2 user3 ...
AllowGroups grp1 grp2 ...
黑名单:
DenyUsers user1 user2 ...
DenyGroups grp1 grp2 ...
CentOS 6:
服务脚本: /etc/rc.d/init.d
CentOS 7:
Systemd Unit File: /usr/lib/systemd/system/sshd.service
ssh服务的最佳实践:
1、不要使用默认端口
2、禁止使用protocol version 1
3、限制可登录的用户
4、设定空闲会话超时时长
5、利用防火墙设置ssh的访问策略
6、仅监听特定的IP地址
7、基于口令认证时,使用强密码策略
# 不使用易猜测的密码
8、使用基于密钥的认证
9、禁止使用空密码
10、禁止root用户直接登录
11、限制ssh的访问频度和并发在线数
12、做好日志,经常分析
/var/log/secure
ssh协议的另一个实现: dropbear
轻量化的实现方案,多用于嵌入式环境中
常用工具:
dbclient: ssh协议客户端程序
dropbearkey: 主机密钥生成工具
dropbearkey -t <type> -f <filename> [-s bits]
/etc/dropbear/
服务端程序:
dropbear
-p [IP:]PORT
-F: 前台
-E: 将日志发往错误输出
dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key -s 2048
dropbearkey -t dss -f /etc/dropbear/dropbear_dss_host_key
dropbear -p [ip:]port -F -E
rsyslog日志系统(03)
rsyslog
日志:历史事件日志
历史事件:
时间,事件
事件级别(日志级别): 事件的关键性程度
事件: 系统引导启动、应用程序启动、尤其是服务类应用程序运行过程中的一些事件
系统日志服务:
syslog:
syslogd: system系统各应用程序日志
klogd: kernel日志
事件格式较为简单时,可统一由syslog进行记录
事件产生的日期时间 主机 进程[pid] :事件内容
支持C/S架构: 可通过UDP或TCP协议提供日志记录服务
rsyslog:
syslogd
klogd
特性:
多线程:并发性更好
UDP, TCP, SSL, TLS, RELP
存储日志信息于MySQL, PGSQL, Oralce等数据管理系统
强大的过滤器,可实现过滤日志信息中任何部分的内容
自定义输出格式
elk stack: elasticsearch,强大的日志搜索引擎
logstash,收集日志,并导入到elasticsearch
kibana,更加美观的展示出来
rsyslog日志收集器重要术语:
facility: 设施,从功能或程序上对日志收集进行分类
auth,跟认证相关的日志信息
authpriv,
cron,
daemon,
kern,
lpr,打印系统相关
mail,
mark,
news,
security,安全相关
user,
uucp,
local0-local7,用户自定义到某一系统使用
syslog
priority: 优先级,日志级别
debug,
info,
notice,
warn(warning),
err(error),
crit(critical),
alert,
emerg(panic)
指定级别:
*: 所有级别
none: 没有级别
priority: 此级别及更高级别的日志信息
=priority:仅此级别
facility.priority /var/log/messages
程序环境:
主程序:rsyslogd
主配置文件:/etc/rsyslog.conf, /etc/rsyslog.d/*.conf
服务脚本(CentOS 6):/etc/rc.d/init.d/rsyslog
Unit File(CentOS 7): /usr/lib/systemd/system/rsyslog.service
配置文件格式:rsyslog.conf
MOUDULES
GLOBAL DRICTIVES
RULES
RULES:
facility.priority target
target:
文件路径:记录日志事件于指定的日志文件中,通常应该在/var/log目录下,文件路径前的"-"表示异步写入
用户:将日志通知给指定用户,用户是通过将信息发送给登录到系统上的用户的终端进行的
*: 所有用户
日志服务器:@host, 把日志送往指定的服务器主机
host: 即日志服务器地址,必须要监听在tcp或udp协议514端口上提供服务;
管道: |COMMAND
文件记录的日志的格式:
事件产生的日期时间 主机 进程(pid): 事件内容
其他日志记录二进制格式:/var/log/wtmp, /var/log/btmp
/var/log/wtmp: 当前系统上成功登录的日志信息
查看该日志的专用命令: last
/var/log/btmp: 当前系统尝试登录系统失败的日志
查看该日志的专用命令: lastb
lastlog命令:显示当前系统每一个用户最近一次的登录时间
/var/log/dmesg: 记录系统引导过程中的日志信息
也可以使用dmesg命令进行查看
rsyslog服务器:
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
配置记录日志于mysql中:
(1)于MySQL服务器: 准备好MySQL服务器,创建用户,授权对Syslog数据库的全部访问权限
(2)于rsyslog主机: 安装rsyslog-mysql程序包
(3)于rsyslog主机: 通过导入createDB.sql脚本创建依赖到的数据库及表
# mysql -uUSERNAME -hHOST -pPASSWORD < /usr/share/doc/rsyslog-mysql-VERSION/createDB.sql
(4) 配置rsyslog使用ommysql模块
#### MODULES ####
$ModLoad ommysql
#### RULES ####
facility.priority :ommysql:DBHOST,DB,DBUSER,DBUSERPASS
注意: 重启rsyslog服务
(5) 安装loganalyzer
(a) 配置webserver, 支持php
# yum install httpd php php-mysql php-gd
# service httpd start
(b) loganalyzer
# cp -r loganalyzer-3.6.5/src /var/www/html/loganalyzer
# cp loganalyzer-3.6.5/contrib/*.sh /var/www/html/loganalyzer
# cd /var/www/html/loganalyzer
# chmod +x *.sh
# ./configure.sh
# ./secure.sh
# chmod 666 config.php
(5)web展示接口: loganalyzer
(a)配置lamp组合
httpd, php, php-mysql, php-gd
(b)安装loganalyzer
# tar xf loganalyzer-3.6.5.tar.gz
# cp -r loganalyzer-3.6.5/src /var/www/html/loganalyzer/
# cd /var/www/html/loganalyzer/
# chmod +x *.sh
# ./configure.sh
# ./secure.sh
# chmod 666 config.php
通过URL访问
http://HOST/loganalyzer
nsswitch和pam简介(04)
nsswitch & pam
名称解析:
name: id
认证服务:
nsswitch: name service switch
以database为中心
通用框架,与各种类型存储进行交互的公共实现
实现: /usr/lib64/libnss*, /lib64/libnss*
框架: libnss
驱动: libnss_file
为每一种用到解析库的应用通过配置定义其位置
/etc/nsswitch.conf
db: store1 store2 ...
例如:
passwd: files
hosts: files dns
解析库:
文件、关系型数据管理系统(MySQL)、NIS、LDAP、DNS
每种存储中查找的结果状态
STATUS => success | notfound | unavail | tryagain
对应于每种状态参数的行为
ACTION => return | continue
例如:
host: files nis [NOTFOUND=return] dns
getent命令:
# getent database [key]
主要从ns库中查找
pam:pluggable authentication module
主要是提供安全认证的
以应用程序为中心
认证库:存储
多种类型的存储: 文件(默认在文件中)、关系型数据管理系统(MySQL)、LDAP、NIS
pam: 也是一种通用框架,提供了与各种类型存储进行交互的公共实现,以及多种辅助类的功能:
它的文件放置位置/lib64/security/*.so
配置文件: 为了各种调用了pam的应用提供其专用配置
通用配置文件: /etc/pam.conf 可为每一种调用pam完成认证功能的应用程序提供配置
专用配置文件: /etc/pam.d/* 通常专用于为某种特定的应用程序提供配置
通常每个应用使用一个单独的配置文件,每行定义一种检查规则
配置文件格式:
通用配置文件:
application type control module-path module-arguments
专用配置文件:
type control module-path module-arguments
type:检查的功能类别
auth: 账号的认证和授权
account:与账号管理相关的非认证功能
password:用户修改密码时密码检查规则
session:用户获取到服务之前或使用服务完成之后要进行的一些附加性操作
control:同一种功能的多个检查之间如何进行组合;
control有两种实现机制:
1、简单实现:使用一个关键词来定义;例如sufficient,required, requisite;
2、使用一或多个"status=action"形式的组合表示
简单机制:
required 必须通过检查,否则,即为失败,无论成功还是失败,都需要继续由后续同种功能的其它模块检查
requisite 一票否决,检测失败就直接返回失败,检测成功,则由由后续同种功能的其它模块进行检查
sufficient 一票通过,检测成功就直接返回成功,检测失败,则由由后续同种功能的其它模块进行检查
optional 可选的,参考性控制机制
include 调用其它配置文件中的同种功能的检测机制
复杂机制:
[status1=action1,status2=action2,....]
status:返回状态,
action: 采取的行为,比如ok, done, die, ignore, bad, reset, ...
module-path: 模块文件路径
相对路径:相对于/lib64/security/目录而言。: 此目录下的模块引用时可使用相对路径;
绝对路径: 可位于任何可访问路径
module-arguments: 模块的专用参数
模块示例:
(1) pam_shells.so
(2) pam_limits.so 资源限制
在用户级别实现对其可使用的资源的限制,例如可打开的文件数量,可运行的进程数量,可用内存空间。
修改限制的实现方式:
(1)ulimit命令
(2)配置文件: /etc/security/limits.conf, /etc/security/limits.d/*.conf
模块通过读取配置文件完成用户对系统资源的使用控制
配置文件: 每行一个定义:
<domain> <type> <item> <value>
<domain>: 应用于哪些对象
username 用户
@group 组
*: 所有用户 统配机制
<type>: 限制的类型
soft: 软限制,普通用户自己可以修改,可以超出,但最大不能超出硬限制
hard: 硬限制,由root用户设定,且通过kernel强制生效
-: 二者同时限定
<item>: 限制的资源类型
nofile: 所能够同时打开的最大文件数量,默认是1024
nproc: 所能够同时运行的进程的最大数量,默认是1024
msqqueue: 使用的POSIX消息队列能够占用的最大内存空间;
sigpending: 所能够使用的最大信号数量;
<value>
例如:nginx - nofile 30000
nginx用户能同时打开的最大文件数量是三万个
ulimit命令: 只能用于调整软限制
-n # : 最多的打开的文件描述个数
-u # : 最大用户进程数
-S 使用'soft' (软)资源限制
-H 使用'hard'(硬)资源限制
课外作业:分开实现
(1) 限制centos用户只能够在worktime通过ssh远程连接本机。时间限定
(2) 限制只有distro组内的用户可通过ssh连接到本机。
2016/01/22
01
运维
1、资源的合理分配
2、标准化,制定规则,数据的正常存储和高效传输
3、自动化,服务的可用性和性能
资源利用率
脚本可以提高保证
脚本,
结果导向
主要用到的场景是公司内部使用,
FTP
早期三大网络应用之一ftp(40年) http mail
ftp file transfer protocol
文件传输协议
C/S模型
客户端 服务器
FTP采用双TCP连接方式
控制连接 使用TCP端口号21
数据连接 使用TCP端口号20
新起的连接需要重新建立三次握手的
控制端口加+1
[root@localhost ~]# yum -y install vsftpd
[root@localhost ~]# whereis vsftpd
vsftpd: /usr/sbin/vsftpd /etc/vsftpd /usr/share/man/man8/vsftpd.8.gz
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
把虚拟用户映射到本地用户
首先建立文本文件 包含账号信息的
然后把文本文件的格式转换成能让安全机制认识的文件
让ftp支持这种认证机制 pam
/etc/pam.d/vsf
匿名用户
本地用户
虚拟用户
NFS
但现在用的也不多了
上规模的都用分布式文件系统
文件共享服务
网络文件系统,只能在
至少存储6份
把一个目录通过本机共享出去,这个目录的权限是
监听2049端口
最好自己写挂载脚本,,如果服务端出问题了,也能正常启动
dns服务器能解析两个地址,提供健康检测,如果不能检测,要把dns记录删除,再reload
提供wEB服务,
通过共享挂载 提供wordpress服务
mysql每天要有一次备份
~]# yum install nfs-utils portmap
samba
日志信息
把日志收集好
系统盘
数据盘
系统日志
服务日志
app日志
2016/01/23
包过滤防火墙基础(01)
iptables: 包过滤型的防火墙
Firewall:防火墙,隔离工具:工作于主机或网络边缘,对于进出本主机或本网络的报文根据事先定义的检查规则作匹配检测,对于能够被规则匹配到的报文作出相应处理的组件
主机防火墙
网络防火墙
软件防火墙(软件逻辑)
硬件防火墙(硬件和软件逻辑)
Identification Fragment ID 拆封标记
URG 紧急指针表示 Urgent Pointer,有效,紧急发送的
RST 重置 有风险
Checksum 重新校验与该位做对比
OpenBSD号称最安全的系统
ipfw(firewall framework)
kernel 2.2 ipchains(firewall framework)内核空间写规则的工具
kernel 2.4 iptables(netfilter)
netfilter: kernel
iptables: rules nutil
hook function(钩子函数)
input
output
forword
frerouting
postrouting
每个门称为链
链(内置):
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUING
功能:
filter: 过滤,防火墙
nat: network address translation,用于修改源IP或目标IP,也可以改端口;
mangle: 拆解报文,做出修改,并重新封装起来。
raw: 关闭nat表上启用的连接追踪机制
以功能划分
功能<--链
raw: PREROUTING, OUTPUT
mangle: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
nat:
CentOS 6: PREROUTING, OUTPUT, POSTROUTING
CentOS 7: PREROUTING, INPUT, OUTPUT, POSTROUTING
filter: INPUT, FORWARD, OUTPUT
报文流向:
流入本机: PREROUTING --> INPUT
由本机流出: OUTPUT --> POSTROUTING
转发: PREROUTING --> FORWARD --> POSTROUTING
路由功能发生的时刻
报文进入本机后:
判断目标主机是?
报文离开本机之前:
判断经由哪个接口送往下一站?
iptables基础应用(02)
iptables/netfilter
规则:
组成部分:根据规则匹配条件来尝试匹配报文,一旦匹配成功,就由规则定义的处理动作作出处理
匹配条件:
基本匹配条件
扩展匹配条件(/usr/lib64/xtables/小写字母.so)
处理动作:
基本处理动作
扩展处理动作(/usr/lib64/xtables/大写字母.so)
自定义处理机制
iptables的链:内置链和自定义链。自定义链可以类型分组,以便好管理
内置链:对应于hook function
自定义链接:用于内置链的扩展和补充,可实现更灵活的规则管理机制。
添加规则时的考量点:
(1)要实现哪种功能:判断添加到哪个表上。
(2)报文流经的路径:判断添加到哪个链上。
链: 链上的规则次序,即为检查的次序,因此,隐含一定的应用法则
(1)同类规则(访问同一应用),匹配范围小的放上面。
(2)不同类的规则(访问不同应用),匹配到报文频率较大的放在上面。
(3)将那些可由一条规则描述的多个规则合并起来。
(4)设置默认策略。做白名单更加安全
iptables命令:
iptables [-t table] {-A|-C|-D} chain rule-specification
ip6tables [-t table] {-A|-C|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name
rule-specification = [matches...] [target]
match = -m matchname [per-match-options]
target = -j targetname [per-target-options]
规则格式:iptables [-t table] chain [-m matchname [per-match-options]] -j targetname [per-target-options]
-t table:
raw, mangle, nat, [filter]
COMMAND:
链管理:
-N: new, 自定义一条新的规则链。
-X: delete, 删除自定义的规则链。
-P: Policy, 设置默认策略,对filter表中的链而言,其默认策略有:
ACCEPT: 接受
DROP: 丢弃
REJECT: 拒绝
-E: 重命名自定义链,引用计数不为0的自定义链不能够被重命名,也不能被删除
规则管理:
-A: append, 追加规则
-I: insert, 插入规则,要指明位置,省略时表示第一条
-D: delete, 删除
(1)指明规则序号
(2)指明规则本身
-R: replace, 替换指定链上的指定规则
(1)指明规则序号
(2)指明规则本身
-F: flush, 清空指定的规则链
-Z: zero, 置零
iptables的每条规则都有两个计数器
(1)匹配到的报文的个数
(2)匹配到的所有报文的大小之和
查看:
-L: list, 列出指定链上的所有规则 CentOS 7上nat链上多了一个
-n: number, 以数字格式显示地址和端口号
-v: verbose, 详细信息
-vv, -vvv
-x: exactly, 显示计数器结果的精确值
--line-numbers: 显示规则的序号
chain:
PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
匹配条件
基本匹配条件:无需加载任何模块,由iptables/netfilter自行提供
[!] -s, --source address[/mask][,...] : 检查报文中的源ip地址是否符合此处指定的地址或范围
[!] -d, --destination address[/mask][,...] : 检查报文中的目标ip地址是否符合此处指定的地址或范围
[!] -p, --protocol protocol
protocol: tcp,udp,udplite,icmp,icmpv6,esp,ah,sctp,mh or "all"
[!] -i, --in-interface name : 数据报文流入的接口,只能应用于数据报文流入的环节,只能应用于PREROUTING,INPUT和FORWARD链
[!] -o, --out-interface name : 数据报文流出的接口,只能应用于数据报文流出的环节,只能应用于FORWARD,OUTPUT和POSTROUTING链
扩展匹配条件:需要加载扩展模块,方可生效的-m
隐式扩展: 不需要手动加载扩展模块,因为它们是对协议的扩展,所以,但凡使用-p指明了协议,就表示已经指明了要扩展的模块
tcp:
[!] --source-port,--sport port[:port] : 匹配报文的源端口,可以是端口范围
[!] --destination-port,--dport port[:port] : 匹配报文的目标端口,可以是端口范围
[!] --tcp-flags mask comp
mask is the flags which we should examine, written as a comma-separated list, 例如SYN,ACK,FIN,RST
comp is a comma-separated list of flags which must be set, 例如SYN
例如 "--tcp-flags SYN,ACK,FIN,RST SYN" 表示,要检查的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0
[!] --syn : 用于匹配第一次握手,相对于 "--tcp-flags SYN,ACK,FIN,RST SYN"
udp
[!] --source-port,--sport port[:port] : 匹配报文的源端口,可以是端口范围
[!] --destination-port,--dport port[:port] : 匹配报文的目标端口,可以是端口范围
icmp
[!] --icmp-type {type[/code]|typename}
echo-request: 8 请求报文
# iptables -A INPUT -d 172.16.100.67 -p icmp --icmp-type 8 -j DROP
echo-reply: 0 响应报文
显式扩展: 必须要手动加载扩展模块,[-m matchname [per-match-options]]
处理动作:
-j targetname [per-target-options]
ACCEPT
DROP
REJECT
RETURN:返回调用链
REDIRECT:端口重定向
LOG: 记录日志
MARK: 做防火墙标记
DNAT: 目标地址转换
SNAT: 源地址转换
MASQUERADE: 地址伪装
...
自定义链:
防火墙(服务):
CentOS 6:
service iptables {start|stop|restart|status}
start: 读取事先保存的规则,并应用到netfilter上。
stop: 清空netfilter上的规则,以及还原默认策略等。
status: 显示生效的规则。
restart: 清空netfilter上的规则,再读取事先保存的规则,并应用到netfilter上。
默认的规则文件: /etc/sysconfig/iptables
CentOS 7:
systemctl start|stop|restart|status| firewalld.service
systemctl disable firewalld.service
systemctl stop firewalld.service
课后作业:开放本机web服务器给非192.168.0.0/24网络中的主机访问
禁止本机被非172.16.0.0/16网络中的主机进行ping请求
开放本机的DNS 服务给所有主机
# iptables -t filter -F INPUT
# iptables -t filter -A INPUT -s 172.16.100.6 -d 172.16.100.67 -p tcp --dport 22 -j DROP
# iptables -L -nv
# iptables -t filter -R INPUT 1 -s 172.16.100.6 -d 172.16.100.67 -p icmp -j REJECT
iptables扩展匹配(03)
回顾:iptables/netfilter
netfilter: kernel framework
ipatbles: 编写规则的CLI
四表: filter, nat, mangle, raw
五链: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
iptables [-t table] SUBCOMMAND [chain] [匹配条件] [-j TARGET]
SUBCOMMAND:
链: -N, -X, -E, -P
规则: -A, -I, -D, -R, -F, -Z
查看: -L
-n, -v, -x, --line-number
匹配条件:
基本匹配: -s, -d, -p, -i, -o
扩展匹配:
隐式扩展: [-m]
tcp: --dport, --sport, --tcp-flags, --syn
udp: --dport, --sport
icmp: --icmp-type
echo-request, 8
echo-reply, 0
显式扩展: -m
小写字母规则扩展
iptables(2)
显式扩展: 必须显式地指明使用的扩展模块进行的扩展
使用帮助:
CentOS 6: man iptables
CentOS 7: man iptables-extensions
1、multiport扩展
以离散方式定义多端口匹配,最多指定15个端口
[!] --source-ports,--sports port[,port|,port:port]... : 指定多个源端口
[!] --destination-ports,--dports port[,port|,port:port]... : 指定多个目标端口
[!] --ports port[,port|,port:port]... : 指明多个端口
示例
# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp -m multiport --dports 22,80 -j ACCEPT
任何drop的规则,可以事先写一个脚本,定义一个时间后恢复正常策略
2、iprange扩展
指明连续的(但一般不指整个网络)ip地址范围
[!] --src-range from[-to] : 源IP地址
[!] --dst-range from[-to] : 目标IP地址
示例
# iptables -A INPUT -d 172.16.100.67 -p tcp --dport 80 -m iprange --src-range 172.16.100.5-172.16.100.10 -j DROP
3、string扩展
对报文中的应用层数据做字符串模式匹配检测,不是正则表达式中的模式,而是使用专用的算法
--algo {bm|kmp} : 字符串匹配检测算法
bm = Boyer-Moore, kmp = Knuth-Pratt-Morris
[!] --string pattern : 要检测的字符串模式
[!] --hex-string pattern : 要检测的字符串模式,16进制格式
示例
# iptables -A INPUT -p tcp --dport 80 -m string --algo bm --string 'GET /index.html' -j LOG
# iptables -A OUPUT -s 172.16.100.67 -d 172.16.0.0/16 -p tcp --sport 80 -m string --algo bm --string "string" -j REJECT
4、time扩展
根据将报文到达的时间与指定的时间范围进行匹配,彼此间是与逻辑,都要 匹配才可以
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
[!] --monthdays day[,day...]
[!] --weekdays day[,day...]
--kerneltz : 使用内核上的时区,而非UTC
示例
# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -j DROP
5、connlimit扩展
根据每客户端IP做并发连接数数量匹配
--connlimit-upto n : 连接的数量小于等于n时匹配
--connlimit-above n : 连接的数量大于n时匹配
示例
# iptables -A INPUT -d 172.16.100.67 -p tcp --dport 21 -m connlimit --connlimit-above 2 -j REJECT
6、limit扩展
基于收发报文的速率做匹配
令牌桶过滤器
峰值速率,
--limit rate[/second|/minute|/hour|/day]: 平均速率
--limit-burst number : 峰值数量
示例
# iptables -I INPUT -d 172.16.100.67 -p icmp --icmp-type 8 -m limit --limit 3/minut --limit-burst 5 -j ACCEPT
# iptables -I INPUT 2 icmp -j REJECT
默认扩展策略
7、state扩展,连接追踪
根据 "连接追踪机制" 去检查连接的状态
源IP、目标IP、什么时间、什么协议都已可以记录
contrack机制: 追踪本机上的请求和响应之间的关系,状态有如下几种
NEW: 新发出请求,连接追踪模板中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求
ESTABLISHED: NEW状态之后,连接追踪模板中为其建立的条目失败之前期间内所进行的通信状态
RELATED: 相关联的连接,如ftp协议中的命令连接与数据连接之间的关系
INVALID: 无效的连接
对于一个生产线的负载均衡器来说,这时绝对不允许的
[!] --state state
示例
# iptables -A INPUT -d 172.16.100.67 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTANLISHED -j ACCEPT
# iptables -A OUTPUT -s 172.16.100.67 -p tcp -m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT
调整连接追踪功能所能够容纳的最大连接数量:
/proc/sys/net/nf_contrack_max
[root@localhost ~]# cat /proc/sys/net/nf_conntrack_max
15220
已经追踪到的并记录下来的连接:
/proc/net/nf_conntrack
[root@localhost ~]# cat /proc/net/nf_conntrack
ipv4 2 tcp 6 299 ESTABLISHED src=192.168.137.11 dst=192.168.137.1 sport=22 dport=53551 src=192.168.137.1 dst=192.168.137.11 sport=53551 dport=22 [ASSURED] mark=0 secctx=system_u:object_r:unlabeled_t:s0 zone=0 use=2
不同的协议的连接追踪时长:
/proc/sys/net/netfilter/*
iptables规则管理(04)
iptables的链接跟踪表最大容量为/proc/sys/net/ipv4/ip_conntrack_max,链接碰到各种状态的超时后就会从表中删除,当模板满载时,后续的连接可能会超时
所以解决方法一般有两个:
(1) 加大 ip_conntrack_max 值
vi /etc/sysctl.conf
net.ipv4.ip_conntrack_max = 393216
net.ipv4.netfilter.ip_conntrack_max = 393216
(2): 降低 ip_conntrack timeout时间
vi /etc/sysctl.conf
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 300
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120
iptables -t nat -L -n
如何开放被动模式的ftp服务?
(1)装载ftp连接的追踪的专用模块
# modproble nf_conntrack_ftp
(2)放行命令连接(假设Server地址为172.16.100.67):
# iptables -A INPUT -d 172.16.100.67 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -s 172.16.100.67 -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT
(3)放行数据连接(假设Server地址为172.16.100.67):
# iptables -A INPUT -d 172.16.100.67 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
# iptables -I OUPUT -s 172.16.100.67 -m state --state ESTABLISHED -j ACCEPT
规则优化:
服务器端规则设定: 任何不允许的访问,应该在请求到达时给予拒绝
(1)可安全放行,所有入站的状态为ESTABLISHED状态的连接
(2)可安全放行,所有出站的状态为ESTABLISHED状态的连接
(3)谨慎放行入站的新请求
(4)有特殊目的的限制访问,要于放行规则之前加以拒绝
如何使用自定义链:
自定义链: 需要被调用才能生效,自定义链最后需要定义返回规则
返回规则使用的target叫做RETURN
规则的有效期限:
使用iptables命令定义的规则,手动删除之前,其生效期限为kernel存活期限
保存规则:
保存规则至指定的文件
CentOS 6:
# service iptables save #将规则保存至/etc/sysconfig/iptables文件中
# iptables-save > /PATH/TO/SOME_RULES_FILE
CentOS 7:
# iptables-save > /PATH/TO/SOME_RULES_FILE
重新载入预存文件中的规则:
# iptables-restore < /PATH/FROM/SOME_RULES_FILE
CentOS 6
# service iptables restart
自动生效规则文件中的规则
(1)用脚本保存各iptables命令,让此脚本开机后自动运行
/etc/rc.d/rc.local文件中添加脚本路径
/PATH/TO/SOME_SCRIPT_FILE
(2)用规则文件保存各规则,开机时自动载入此规则文件中的规则
/etc/rc.d/rc.local文件添加:
iptables-restore < /PATH/FROM/IPTABLES_RULES_FILE
CentOS 7:
引入了新的iptables前端管理工具firewalld,其管理工具有: firewall-cmd, firewalld-config
Target
ACCEPT, DROP, REJECT, RETURN
LOG, SNAT, DNAT, REDIRECT, MASQUERADE, ...
LOG:
--log-level level
--log-prefix prefix
FORWARD
modproble
练习:INPUT和OUTPUT默认策略为DROP;
1、限制本地主机的web服务器在周一不允许访问;新请求的速率不能超过100个每秒;web服务器包含了admin字符串的页面不允许访问;web服务器仅允许响应报文离开本机;
iptables
2、在工作时间,即周一到周五的8:30-18:00,开放本机的ftp服务给172.16.0.0网络中的主机访问;数据下载请求的次数每分钟不得超过5个;
3、开放本机的ssh服务给172.16.x.1-172.16.x.100中的主机,x为你的座位号,新请求建立的速率一分钟不得超过2个;仅允许响应报文通过其服务端口离开本机;
4、拒绝TCP标志位全部为1及全部为0的报文访问本机;
5、允许本机ping别的主机;但不开放别的主机ping本机;
练习:判断下述规则的意义:
# iptables -N clean_in
# iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP
# iptables -A clean_in -d 172.16.255.255 -p icmp -j DROP
# iptables -A clean_in -p tcp ! --syn -m state --state NEW -j DROP
# iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP
# iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP
# iptables -A clean_in -d 172.16.100.7 -j RETURN
# iptables -A INPUT -d 172.16.100.7 -j clean_in
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A OUTPUT -o lo -j ACCEPT
# iptables -A INPUT -i eth0 -m multiport -p tcp --dports 53,113,135,137,139,445 -j DROP
# iptables -A INPUT -i eth0 -m multiport -p udp --dports 53,113,135,137,139,445 -j DROP
# iptables -A INPUT -i eth0 -p udp --dport 1026 -j DROP
# iptables -A INPUT -i eth0 -m multiport -p tcp --dports 1433,4899 -j DROP
# iptables -A INPUT -p icmp -m limit --limit 10/second -j ACCEPT
以前练习的笔记
#清除条目
[root@localhost ~]# iptables -F
#通行 SSH 服务
[root@localhost ~]# iptables -A INPUT -d 192.168.137.100 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
[root@localhost ~]# iptables -A OUTPUT -s 192.168.137.100 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
#设置默认动作为禁止
[root@localhost ~]# iptables -P INPUT DROP
[root@localhost ~]# iptables -P OUTPUT DROP
#通行 HTTP 服务
[root@localhost ~]# iptables -A INPUT -d 192.168.137.100 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
[root@localhost ~]# iptables -A OUTPUT -s 192.168.137.100 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
#通行 ICMP
[root@localhost ~]# iptables -A INPUT -d 192.168.137.100 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT
[root@localhost ~]# iptables -A OUTPUT -s 192.168.137.100 -p icmp --icmp-type 0 -m state --state ESTABLISHED -j ACCEPT
#查看规则条目
[root@localhost ~]# iptables -L -n -v --line-numbers
#优化条目
[root@localhost ~]# iptables -I OUTPUT -s 192.168.137.100 -m state --state ESTABLISHED -j ACCEPT
#查看规则条目
[root@localhost ~]# iptables -L -n -v --line-numbers
Chain INPUT (policy DROP 3 packets, 234 bytes)
num pkts bytes target prot opt in out source destination
1 5160 349K ACCEPT tcp -- * * 0.0.0.0/0 192.168.137.100 tcp dpt:22 state NEW,ESTABLISHED
2 15 1562 ACCEPT tcp -- * * 0.0.0.0/0 192.168.137.100 tcp dpt:80 state NEW,ESTABLISHED
3 15 900 ACCEPT icmp -- * * 0.0.0.0/0 192.168.137.100 icmp type 8 state NEW,ESTABLISHED
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 117 32484 ACCEPT all -- * * 192.168.137.100 0.0.0.0/0 state ESTABLISHED
2 2575 288K ACCEPT tcp -- * * 192.168.137.100 0.0.0.0/0 tcp spt:22 state ESTABLISHED
3 13 1048 ACCEPT tcp -- * * 192.168.137.100 0.0.0.0/0 tcp spt:80 state ESTABLISHED
4 7 420 ACCEPT icmp -- * * 192.168.137.100 0.0.0.0/0 icmp type 0 state ESTABLISHED
#删除无用条目
[root@localhost ~]# iptables -D OUTPUT 2
[root@localhost ~]# iptables -D OUTPUT 2
[root@localhost ~]# iptables -D OUTPUT 2
[root@localhost ~]# iptables -L -n -v --line-numbers
Chain INPUT (policy DROP 1 packets, 229 bytes)
num pkts bytes target prot opt in out source destination
1 5305 358K ACCEPT tcp -- * * 0.0.0.0/0 192.168.137.100 tcp dpt:22 state NEW,ESTABLISHED
2 15 1562 ACCEPT tcp -- * * 0.0.0.0/0 192.168.137.100 tcp dpt:80 state NEW,ESTABLISHED
3 15 900 ACCEPT icmp -- * * 0.0.0.0/0 192.168.137.100 icmp type 8 state NEW,ESTABLISHED
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 201 41672 ACCEPT all -- * * 192.168.137.100 0.0.0.0/0 state ESTABLISHED
#通行本地回环地址
[root@localhost ~]# iptables -A INPUT -i lo -j ACCEPT
[root@localhost ~]# iptables -A OUTPUT -o lo -j ACCEPT
#通行 ftp 服务
#确保添加 ip_nat_ftp ip_conntrack_ftp 模块
[root@localhost ~]# vim /etc/sysconfig/iptables-config
#更改-保存-退出
IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"
#保存规则1
[root@localhost ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
#保存读取规则2
[root@localhost ~]# iptables-save > /etc/sysconfig/iptables.2015120901
[root@localhost ~]# iptables-restore < /etc/sysconfig/iptables.2015120901
#重启iptables 脚本
[root@localhost ~]# service iptables restart
iptables: Flushing firewall rules: [ OK ]
iptables: Setting chains to policy ACCEPT: filter [ OK ]
iptables: Unloading modules: [ OK ]
iptables: Applying firewall rules: [ OK ]
iptables: Loading additional modules: ip_nat_ftp ip_conntra[ OK ]
[root@localhost ~]# iptables -I INPUT -d 192.168.137.100 -p tcp -m state --state RELATED,ESTABLISHED
#待续
#修改条目
[root@localhost ~]# iptables -R OUTPUT 1 -s 192.168.137.100 -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@localhost ~]# iptables -L -vn --line-numbers
Chain INPUT (policy DROP 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 748 49028 ACCEPT tcp -- * * 0.0.0.0/0 192.168.137.100 state RELATED,ESTABLISHED
2 1522 107K ACCEPT tcp -- * * 0.0.0.0/0 192.168.137.100 tcp dpt:22 state NEW,ESTABLISHED
3 0 0 ACCEPT tcp -- * * 0.0.0.0/0 192.168.137.100 tcp dpt:80 state NEW,ESTABLISHED
4 0 0 ACCEPT icmp -- * * 0.0.0.0/0 192.168.137.100 icmp type 8 state NEW,ESTABLISHED
5 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 1084 178K ACCEPT all -- * * 192.168.137.100 0.0.0.0/0 state RELATED,ESTABLISHED
2 0 0 ACCEPT all -- * lo 0.0.0.0/0 0.0.0.0/0
#继续优化条目
#直接修改配置文件
[root@localhost ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
[root@localhost ~]# vim /etc/sysconfig/iptables
*filter
:INPUT DROP [40:4346]
:FORWARD ACCEPT [0:0]
:OUTPUT DROP [0:0]
-A INPUT -d 192.168.137.100/32 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -d 192.168.137.100/32 -p tcp -m tcp --dport 22 -m state --state NEW -j ACCEPT
-A INPUT -d 192.168.137.100/32 -p tcp -m tcp --dport 80 -m state --state NEW -j ACCEPT
-A INPUT -d 192.168.137.100/32 -p icmp -m icmp --icmp-type 8 -m state --state NEW -j ACCEPT
-A INPUT -d 192.168.137.100/32 -p tcp -m tcp --dprot 21 -m state --state NEW -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A OUTPUT -s 192.168.137.100/32 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
COMMIT
#重载入
[root@localhost ~]# service iptables reload
[root@localhost ~]# iptables -L -vn --line-numbers
Chain INPUT (policy DROP 45 packets, 4887 bytes)
num pkts bytes target prot opt in out source destination
1 1650 109K ACCEPT tcp -- * * 0.0.0.0/0 192.168.137.100 state RELATED,ESTABLISHED
2 1522 107K ACCEPT tcp -- * * 0.0.0.0/0 192.168.137.100 tcp dpt:22 state NEW,ESTABLISHED
3 0 0 ACCEPT tcp -- * * 0.0.0.0/0 192.168.137.100 tcp dpt:80 state NEW,ESTABLISHED
4 0 0 ACCEPT icmp -- * * 0.0.0.0/0 192.168.137.100 icmp type 8 state NEW,ESTABLISHED
5 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 1623 265K ACCEPT all -- * * 192.168.137.100 0.0.0.0/0 state RELATED,ESTABLISHED
2 0 0 ACCEPT all -- * lo 0.0.0.0/0 0.0.0.0/0
#多端口匹配优化
[root@localhost ~]# iptables -I INPUT 2 -d 192.168.137.100 -p tcp -m multiport --destination-ports 21,22,80 -m state --state NEW -j ACCEPT
#删除无用的条目
[root@localhost ~]# iptables -D INPUT 3
[root@localhost ~]# iptables -D INPUT 3
[root@localhost ~]# iptables -D INPUT 3
[root@localhost ~]# iptables -D INPUT 3
[root@localhost ~]# iptables -L -vn
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
693 45132 ACCEPT tcp -- * * 0.0.0.0/0 192.168.137.100 state RELATED,ESTABLISHED
0 0 ACCEPT tcp -- * * 0.0.0.0/0 192.168.137.100 multiport dports 21,22,80 state NEW
0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
451 90976 ACCEPT all -- * * 192.168.137.100 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 ACCEPT all -- * lo 0.0.0.0/0 0.0.0.0/0
#连接数限制
#连接数不大于2时,通行
[root@localhost ~]# iptables -A INPUT -d 192.168.137.100 -p tcp --dport 80 -m connlimit ! --connlimit-above 2 -j ACCEPT
或
[root@localhost ~]# iptables -A INPUT -d 192.168.137.100 -p tcp --dport 80 -m connlimit --connlimit-above 2 -j DROP
#第一次请求峰值允许为6个,其后每分钟只允许5个ping 请求
iptables -A INPUT -d 192.168.137.100 -p icmp --icmp-type 8 -m limit --limit 5/minute --limit-burst 6 -j ACCEPT
#限制字符串
-m string --algo {bm|kmp} --string "STRING"
iptables -I OUTPUT -s 192.168.137.100 -m string --algo kmp --string "h7n9" -j REJECT
#IP地址范围段
-m iprange
-src-range
-dst-range
-s, -d
-s IP, NET
172.16.0.0/16, 172.16.100.3-172.16.100.100
iptables -A INPUT -p tcp -m iprange --src-range 172.16.100-172.16.100.100 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
2016/01/24
iptables网络防火墙及nat(01)
回顾: iptables/netfilter
显式扩展、保存恢复规则
显式扩展:
multiport, iprange, string, time, connlimit, limit, state
state: conntrack
保存模板/proc/net/nf_conntrack
保存数设定/proc/sys/net/nf_conntrack_max
NEW,ESTABLISHED,RELATED(nf_conntrack_ftp),INVALID,UNTRACKED
保存和恢复规则:
iptables-save
iptables-restore
iptables(3)
查看转发功能,并开启
# cat /proc/sys/net/ipv4/ip_forward
0
# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1
如果打开了转发功能,就充当网关功能
网络防火墙
修改目标地址时 网络服务器 端口映射
netfilter: nat table
nat: network address translation
snat: source nat
dnat: destination nat
snat源地址转换 POSTROUTING OUTPUT
让本地网络中的主机通过某一特定地址访问外部网络时
dnat目标地址转换 PREROUTING
把本地网络中的某一主机上的某服务开放给外部网络中的用户访问时
nat表的target:
SNAT
--to-source [ipaddr[-ipaddr]][:port[-port]]
--random
DNAT
--to-destination [ipaddr[-ipaddr]][:port[-port]]
MASQUERADE
--to-ports port[-port]
--random
iptables之nat应用(02)
SNAT示例:
# iptables -t nat -A POSTROUTING -s 192.168.12.0/24 -j SNAT --to-source 172.16.100.67
MASQUERADE示例:
源地址转换,当源地址为动态获取的地址时(PPPoe拨号上网),MASQUERADE可自行判断要转换为的地址:
# iptables -t nat -A POSTROUTING -s 192.168.12.0/24 -j MASQUERADE
DNAT示例:
# iptables -t nat -A PREROUTING -d 172.16.100.67 -p tcp --dport 80 -j DNAT --to-destination 192.168.12.77
# iptables -t nat -A PREROUTING -d 172.16.100.67 -p tcp --dport 80 -j DNAT --to-destination 192.168.12.77:8080
# iptables -t nat -A PREROUTING -d 172.16.100.67 -p tcp --dport 22012 -j DNAT --to-destination 192.168.12.78.22
提示:安全起见,一般不适用默认端口
补充:利用iptables的recent模块来抵御DOS攻击: 22,建立一个列表,保存有所有访问过指定的服务的客户端IP
ssh: 远程连接,
# iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP
# iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
# iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j LOG --log-prefix "SSH Attach: "
# iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP
1.利用connlimit模块将单IP的并发设置为3;会误杀使用NAT上网的用户,可以根据实际情况增大该值。
2.利用recent和state模块限制单IP在300s内只能与本机建立2个新连接。被限制五分钟后即可恢复访问。
下面对最后两句做一个说明:
1.第二句是记录访问tcp 22端口的新连接,记录名称为SSH
--set 记录数据包的来源IP,如果IP已经存在将更新已经存在的条目
2.第三句是指SSH记录中的IP,300s内发起超过3次连接则拒绝此IP的连接。
--update 是指每次建立连接都更新列表;
--seconds必须与--rcheck或者--update同时使用
--hitcount必须与--rcheck或者--update同时使用
3.iptables的记录:/proc/net/xt_recent/SSH
也可以使用下面的这句记录日志:
# iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --second 300 --hitcount 3 -j LOG --log-prefix "SSH Attack"
CentOS 6:
http://ftp.redhat.com/redhat/linux/enterprise/6Server/en/os/SRPMS/
layer7:第三方扩展
iptables实现七层访问过滤:
模块:layer7
识别应用层协议
iptables/netfilter
iptables -m state,
netfilter state
对内核中的netfilter,打补丁layer7,重新编译内核
对iptables打补丁,补上layer7模块,重新iptables
diff/patch:文本操作工具
diff是Unix系统的一个很重要的工具程序。它用来比较两个文本文件的差异,是代码版本管理的核心工具之一。其用法非常简单:
# diff <变动前的文件> <变动后的文件>
由于历史原因,diff有三种格式:
* 正常格式(normal diff)
* 上下文格式(context diff)
* 合并格式(unified diff)
1、正常格式的diff
例如,对file1(变动前的文件)和file2(变动后的文件)进行比较可使用如下命令:
# diff file1 file2
显示结果中,第一行是一个提示,用来说明变动位置。它分成三个部分:前面的数字,表示file1的第n行有变化;中间的"c"表示变动的模式是内容改变(change),其他模式还有"增加"(a,代表addition)和"删除"(d,代表deletion);
2、上下文格式的diff
上个世纪80年代初,加州大学伯克利分校推出BSD版本的Unix时,觉得diff的显示结果太简单,最好加入上下文,便于了解发生的变动。因此,推出了上下文格式的diff。它的使用方法是加入-c选项(即context)。
# diff -c f1 f2
结果分成四个部分。第一部分的两行,显示两个文件的基本情况:文件名和时间信息,"***"表示变动前的文件,"---"表示变动后的文件。第二部分是15个星号,将文件的基本情况与变动内容分割开。第三部分显示变动前的文件,即file1。
另外,文件内容的每一行最前面,还有一个标记位。如果为空,表示该行无变化;如果是感叹号(!),表示该行有改动;如果是减号(-),表示该行被删除;如果是加号(+),表示该行为新增。
第四部分显示变动后的文件,即file2。
3、合并格式的diff
如果两个文件相似度很高,那么上下文格式的diff,将显示大量重复的内容,很浪费空间。1990年,GNU diff率先推出了"合并格式"的diff,将f1和f2的上下文合并在一起显示。
它的使用方法是加入u参数(代表unified)。
# diff -u f1 f2
其结果的第一部分,也是文件的基本信息。"---"表示变动前的文件,"+++"表示变动后的文件。第二部分,变动的位置用两个@作为起首和结束。第三部分是变动的具体内容。
除了有变动的那些行以外,也是上下文各显示3行。它将两个文件的上下文,合并显示在一起,所以叫做"合并格式"。每一行最前面的标志位,空表示无变动,减号表示第一个文件删除的行,加号表示第二个文件新增的行。
diff
-u
patch
尽管并没有指定patch和diff的关系,但通常patch都使用diff的结果来完成打补丁的工作,这和patch本身支持多种diff输出文件格式有很大关系。patch通过读入patch命令文件(可以从标准输入),对目标文件进行修改。通常先用diff命令比较新老版本,patch命令文件则采用diff的输出文件,从而保持原版本与新版本一致。
patch的标准格式为
patch [options] [originalfile] [patchfile]
如果patchfile为空则从标准输入读取patchfile内容;如果originalfile也为空,则从patchfile(肯定来自标准输入)中读取需要打补丁的文件名。因此,如果需要修改的是目录,一般都必须在patchfile中记录目录下的各个文件名。绝大多数情况下,patch都用以下这种简单的方式使用:
patch命令可以忽略文件中的冗余信息,从中取出diff的格式以及所需要patch的文件名,文件名按照diff参数中的"源文件"、"目标文件"以及冗余信息中的"Index:"行中所指定的文件的顺序来决定。
-p参数决定了是否使用读出的源文件名的前缀目录信息,不提供-p参数,则忽略所有目录信息,-p0(或者-p 0)表示使用全部的路径信息,-p1将忽略第一个"/"以前的目录,依此类推。如/usr/src/linux-2.4.15/Makefile这样的文件名,在提供-p3参数时将使用linux-2.4.15/Makefile作为所要patch的文件。
patch
-p
-R
mockbuild
总结:操作步骤
1、获取并编译内核
# useradd mockbuild
# rpm -ivh kernel-2.6.32-431.5.1.x86_64.el6.src.rpm
# cd rpmbuild/SOURCES
# tar linux-2.6.32-*.tar.gz -C /usr/src
# cd /usr/src
# ln -sv
2、给内核打补丁
# tar xf netfilter-layer7-v2.23.tar.bz2
# cd /usr/src/linux
# patch -p1 < /root/netfilter-layer7-v2.23/kernel-2.6.32-layer7-2.23.patch
# cp /boot/config-* .config
# make menuconfig
按如下步骤启用layer7模块
Networking support → Networking Options →Network packet filtering framework → Core Netfilter Configuration
<M> "layer7" match support
3、编译并安装内核
# make
# make modules_install
# make install
4、重启系统,启用新内核
5、编译iptables
# tar xf iptables-1.4.20.tar.gz
# cp /root/netfilter-layer7-v2.23/iptables-1.4.3forward-for-kernel-2.6.20forward/* /root/iptables-1.4.20/extensions/
# cp /etc/rc.d/init.d/iptales /root
# cp /etc/sysconfig/iptables-config /root
# rpm -e iptables iptables-ipv6 --nodeps
# ./configure --prefix=/usr --with-ksource=/usr/src/linux
# make && make install
# cp /root/iptables /etc/rc.d/init.d
# cp /root/iptables-config /etc/sysconfig
6、为layer7模块提供其所识别的协议的特征码
# tar zxvf l7-protocols-2009-05-28.tar.gz
# cd l7-protocols-2009-05-28
# make install
7、如何使用layer7模块
ACCT的功能已经可以在内核参数中按需启用或禁用。此参数需要装载nf_conntrack模块后方能生效。
net.netfilter.nf_conntrack_acct = 1
l7-filter uses the standard iptables extension syntax
# iptables [specify table & chain] -m layer7 --l7proto [protocol name] -j [action]
# iptables -A FORWARD -m layer7 --l7proto qq -j REJECT
编译内核:
make menuconfig
make -j #
make modules_install
make install
清理内核源码树:
提示:xt_layer7.ko依赖于nf_conntrack.ko模块
博客:iptables所有应用,包括layer7的实现;
课外扩展:recent模块,layer7模块;
tcp wrapper
博客作业:iptables所有功能
tcp_wrapper简单应用(03)
回顾:iptables/netfilter netfilter, nat
防火墙:主机防火墙:INPUT, OUTPUT
网络防火墙,首先得是网关,RORWARD
nat服务器:
netfilter
target
SNAT: --to-source
DNAT: --to-destination
MASQUERADE
tcp_wrapper: tcp包装器
通用的库文件:libwrap.so 程序链接到此库才能使用
它的配置文件/etc/hosts.allow, /etc/hosts.deny
写规则的方式:配置文件的语法格式:
daemon_list: client_list [:options]
某些服务 针对哪些主机 有哪些控制
daemon_list:
(1)单个应用程序的文件名称,而非服务名
(2)以逗号分隔的应用程序文件名列表
例如:sshd, vsftpd
(3)ALL:所有受tcp_wrapper控制的程序
client_list:
IP地址:
主机名:
网络地址:必须使用完整格式的掩码,不能使用前缀格式掩码
简短格式的网络地址:例如172.16.表示172.16.0.0/255.255.0.0
ALL: 所有主机
KNOWN:所有已知主机,
UNKNOWN: 不能反解的主机
PARANOID:正向解析与反解的主机不匹配的主机
EXCEPT:除了
例如:vsftpd仅开放给172.16.0.0/255.255.0.0中的主机访问
sshd仅开放给172.16.0.0/255.255.0.0中的主机访问,但是不包含172.16.100.6
/etc/hosts.allow
vsftpd: 172.16.
sshd: 172.16. EXCEPT 172.16.100.6
/etc/hosts.deny
vsftpd: ALL
sshd: ALL
:options
deny: 拒绝,主要用于hosts.allow文件
allow: 允许,主要用于hosts.deny文件
spawn: 启动指定的应用程序
%c: client ip
%s: daemon@server_ip
%d: daemon name
练习:CentOS 6主机上,控制telnet服务仅允许172.16.0.0/255.255.0.0网络中的主机访问,但不包含172.16.100.0/255.255.255.0子网中的主机
对所有正常登录的主机都记录于/var/log/telnet.allow.log中,对所有被拒绝访问的尝试都记录于/var/log/telnet.deny.log文件中
注意:
CentOS 6主机上的telnet服务托管于xinetd,后者接受libwrap控制
CentOS 7主机上的telnet服务未托管于xinetd,而in.telnetd未链接至libwrap
练习:尝试实现samba服务仅允许172.16.0.0/16网络中的主机访问,但不包含172.16.100.0/24网络中的主机
CentOS 7不支持
判断某服务是否能够由tcp_wrapper进行访问控制的方法
查看应用程序是否编译此库
(1)动态编译ldd命令就能显示出结果
ldd $(which COMAND)|grep libwrap
(2)静态编译:string命令查看应用程序文件,其其结果中是否出现了hosts.allow和hosts.deny文件
服务基于libwrap完成访问控制的流程:
首先检查/etc/hosts.allow文件有没有显式授权访问
是:直接授权客户端访问
否:接着去检查/etc/hosts.deny文件中有没有显式拒绝当前请求者访问
是:直接拒绝当前请求者的访问
否:允许请求者访问
检查机制:当某个服务被访问时,
# vim /etc/hosts.deny
拒绝这个主机使用sshd,只对新创建的连接有效,只在进程启动时做检查
sudo的简单使用(04)
sudo
su : switch user
用户切换
(1)su -l user
(2)su -l user 'COMMAND'
sudo : 一个用户用另外一个用户
能够让获得授权的用户以另外一个用户的身份运行指定的命令
授权机制:授权文件 /etc/sudoers
root ALL=(ALL) ALL
组 %wheel ALL=(ALL) ALL
编译此文件的专用命令:visudo
授权项:
who where=(whom) commands
users hosts=(runas) commands
users:
username
#uid
%groupname
%#gid
user_alias
支持多个用户定义为一组用户,称之为用户别名,即user_alias
hosts:
ip
hostname
NetAddr
host_alias
runas:
...
host_alias
commands:
command
directory
指定目录下的所有命令
sudoedit:特殊权限,可用于向其它用户授予sudo权限
comand_alias
定义别名的方法:
ALIAS_TYPE NAME=item1,item2,item3,...
NAME:别名名称,必须使用全大写字母
ALIA_TYPE:
User_Alias
Host_Alias
Runas_Alias
Cmnd_Alias
例如:
User_Alias NETADMIN=tom,jerry
Cmnd_Alias NETCOMND=ip,ifconfig,route
NETADMIN localhost=(root) NETCMND
sudo命令:
有一种检票机制,能记录成功认证结果一段时间,默认为5分钟
-s [command] 以目标用户身份运行 shell
-k 清除此前缓存用户认证成功的结果
/etc/sudoers应用示例:
Cmnd_Alias USERADMINCMNDS = /usr/sbin/useradd, /usr/sbin/usermod, /usr/bin/passwd [a-z]*, !/usr/bin/passwd root
User_Alias USERADMIN = bob, alice
USERADMIN ALL=(root) USERADMINCMNDS
常用标签:
NOPASSWD:
PASSWD:
apt
fcitx
CentOS 7
# inittab is no longer used when using systemd.
#
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
#
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
#
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
#
# To view current default target, run:
# systemctl get-default
#
# To set a default target, run:
# systemctl set-default TARGET.target