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

Ap^x%g的结果发送给B

AB发过来的(p^y%g)^x=p^yx%g

        B:y

Bp^y%g的结果发送给A

BA发过来的(p^x%g)^y=p^xy%g

 

PKI:Public Key Infrastructure

公钥基础设施:

    签证机构:CA

    注册机构:RA

    证书吊销列表:CRL

    证书存取库

 

数字证书格式:X.509 v1,v2,v3

X.509v3:定义了证书的结构以及认证协议标准

    版本号

    序列号

    签名算法ID

    发行者名称

    有效期限

    主体名称

    主体公钥

    发行者的唯一标识

    主体的唯一标识

    扩展

    发行者的签名

......documentSSL_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

    客户端生成一个随机数,稍后用户生成"会话密钥"

    支持的加密算法,比如AESRSA3DES

    支持的压缩算法

 

第二阶段: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=wwwxC3xA3.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=wwwxC3xA3.magedu.com/emailAddress=webmaster@magedu.com

貌似是有错误,因为在填写信息时有Backspace按键

 

(2)CA主机吊销证书

先根据客户提交的serialsubject信息,对比其与本机数据库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万个小时

加密类型及相关算法(以前的笔记)

完整性、机密性、身份验证

发送方用自己的私钥加密 能保证 发送方的身份验证

发送方用对方的公钥加密 能保证 数据的机密性

 

对称加密:

    DESData Encryption Standard56bit

    3DES

    AESAdvanced Encryption Standard,高级加密标准

    AES128AES192AES256AES512

    Blowfish

 

单向加密(定长输出):

    MD4

    MD5128

    SHA1160

        SHA224SHA256SHA384

    CRC-32:循环冗余校验码(非加密算法、不提供安全性)

公钥加密(加密/签名):

    RSA:机密、签名

    DSA:只能签名(公开使用)

    ElGamal:商业加密

 

openssl    

    工具:

        OpenSSLSSL的开源实现

            libcrpto:通用加密库,提供了各种加密函数

            libsslTLS/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一样,不然就不会签了

    3CA签署证书

        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.pemCA自己的证书

    /etc/pki/CA/serial:当前证书的序列号

    /etc/pki/CA/crlnumber:证书撤销列表的号码

    /etc/pki/CA/crl.pem

    /etc/pki/CA/private/cakey.pemCA自己的私钥

 

 

PKIPublic Key Infrastructure PKI的核心就是CA

    CACertificate Authority 证书权威机构

SSLSecure Socket Layer 安全的套接字层

TLSTransport Layer Security 传输层安全 (国际标准化组织的)

 

目前比较流行的证书存储格式是x509

x509:公钥、有效期限、证书的合法拥有者、证书该如何被使用(什么用途)、CA的信息、使用CA私钥签名了的校验码

PKITLS/SSLx509

PKIOpenGPG(另一种实现架构)

CRL(证书吊销列表):里面包含此前曾发出去的仍未过期的但由于各种原因已经被撤销了的证书,比如私钥泄露等。

 

AliceBob建立通信

(这一步是Alice获取签名证书的过程)

Alice首先生成自己的私钥。为了能够让Bob认可自己的身份,Alice首先向第三方公认机构(CA)提交自己的公钥和其他身份认证信息,由CA做公正。CAAlice的公钥和身份信息,还有CA自己的身份信息作为整体一起计算出特征码,再用CA自己的私钥加密该特征码(即为签名),并把签名结果附加在整体数据后面,形成由CA认可了的Alice的证书。

 

(这一步主要是Bob获取Alice的公钥)

接着,Bob先向Alice发送会话请求,然后双方互相协商要使用哪一种加密协议(SSLv2SSLv3TLSv1)、哪一种对称加密算法等,协商完,AliceBob发送证书,Bob利用CA自签证书(需要通过可靠途径获得)CA的公钥解密Alice的证书特征码,如果能解密,就说明Alice发来的证书是由自己可信的CA签署的,是可信的,接下来,通过特征码再验证数据的完整性。数据完整性验证通过,再看是不是自己认可的证书颁发机构发的,如果是,再去查看这个证书颁发机构所提供的CRL(证书吊销列表)中此证书有没有被吊销,如果存在,也要拒绝使用此证书,如果不存在,证书验证成功,Alice的公钥获取成功。

接着,Bob会生成一个随机的密钥(对称密钥),用Alice的公钥加密后传递给Alice,然后Alice就可以用这个对称密钥与Bob进行加密的会话了。

    

 

这时在没有CA的情况下,AliceBob通信过程,这样难以防止"中间人"攻击

1Alice加密发送过程

1) Alice先用单向加密提取要发生数据的特征码

2) Alice再用自己的私钥加密这段特征码,并将结果附加在数据后面

3) Alice生成一个临时的对称密钥,并使用对称密钥加密这整段数据

4) Alice获取到Bob的公钥,并使用对方的公钥加密刚临时的对称密钥,再附加到整个后面

5) Alice将整个结果发送给Bob

 

2Bob解密过程

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 SocketIPC的一种实现,允许位于不同主机(也可以是同一主机)上的进程之间进行通信

内核为应用程序提供了 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

    

 

httphyper 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: 增强了缓存功能

        googlespdy

    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]

 

一次完整的http请求处理过程:

    (1)建立或处理连接:接收请求或拒绝请求

    (2)接收请求:接收来自于网络上的主机请求报文中对某特定资源的一次请求的过程

    (3)处理请求:对请求报文进行解析,获取客户端请求的资源及请求方法等相关信息

    (4)访问资源:获取请求报文中请求的资源

    (5)构建响应报文

    (6)发送响应报文

    (7)记录日志

    

web服务基础(02)

 

接收请求的模型:

    并发访问响应模型

        单进程I/O模型:启动一个进程处理用户请求,这意味着,一次只能处理一个请求,多个请求被串行响应

        多进程I/O结构:并行启动多个进程,每个进程响应一个请求,缺点就是会损耗CPU大量时间在进程间切换

        复用的I/O结构:一个服务器进程响应n个客户端请求,一对多。它又分为两种情况:

            多线程模式:一个进程生成n个线程,一个线程处理一个请求

            事件驱动(event-driven):一个进程直接驱动n个请求,不用启动线程

        复用的多个进程I/O结构:启动多个(m)个进程,每个进程生成(n)个线程

            所以整个响应的请求的数量有: m*n

 

处理请求:分析请求报文的http请求报文首部

    http协议:一次事务由两部分组成,交互完成事务

        http请求报文首部

        http响应报文首部

 

请求报文首部的格式

    <method><URL><VERSION>        //<请求方法是什么><请求的是哪个资源><是用http协议的哪个版本>

    HEADERS:(name:value)

    <request body>                //<请求的主体>

 

访问资源:获取请求报文中请求的资源

    web服务器,即存放了web资源的主机,负责向请求者提供对方请求的静态资源,或动态资源运行生成的结果,这些资源通常应该放置于本地文件系统某路径下,此路径称为DocRoot。映射为URL的请求根。

    /var/www/html/images/log.jpg

    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)DSOdynamic shared object

(3)MPMMultipath 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、修改监听的IPPORT

    Listen [IP:]PORT

    (1)省略IP表示0.0.0.0            //本机正常配置可使用的所有IP

    (2)Listen指令可重复出现多次

        Listen 80

        Listen 8080

    (3)修改监听socket(IPPORT)只有重启服务进程方可生效,通常配置修改后只需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.

 

 

3MPM

httpd-2.2版本不支持同时编译多个MPM模块,所以只能编译选定要使用的那个。CentOS 6rpm包为此专门提供了三个应用程序文件,分别用于实现对不同的MPM机制的支持。

    httpd(默认的prefork模型)

    httpd.worker

    httpd.event

 

确认现在使用的是哪个程序文件的方法

默认使用的程序文件为/usr/sbin/httpd, 其为preforkMPM模块

[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

这个带宽流量只是资源数据的大小,还不包含各种网络协议的报头首部等数据

 

 

4DSO (动态共享模块)

配置指定实现模块加载

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)Orderallow,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

只有用户的URL中出现已定义的别名时,才会被替换为别名的值

 

9、设定默认字符集

AddDefaultCharset UTF-8

可指定中文字符集有: GBKGB2312GB18030

 

httpd基础配置详解(04)

 

10、日志设定

日志类型:访问日志和错误日志,每个站点都有独立的日志

    错误日志:

    ErrorLog logs/error_log

    LogLevel warn

    Possible values include: debug, info, notice, warn, error, crit, alert, emerg.

    日志级别,级别越高,对应的事务的严重程度就越高,同样意味着事件数量就越少

debug表示所有信息,只要产生了,都记录下来

infodebug高一级的

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定义的格式记录日志

    LogFormat format strings:

    (可参考官网格式说明地址http://httpd.apache.org/docs/2.2/mod/mod_log_config.html)

%h:远程主机,客户端IP地址

%l:远程登录的用户名,Remote User,通常为一个减号("-")

%u:远程用户Remote user (from auth; may be bogus if return status(%s)is 401);非为登录访问时,其为一个减号

%t:服务器收到请求时的时间

%r:First line of request,即表示请求报文的首行;记录了此次请求的"方法","URL"以及协议版本

%>s:响应状态码,404,304,等等

%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"

192.168.137.100 - - [12/Jan/2016:21:10:09 +0800] "GET /test.html HTTP/1.1" 200 19 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu)libcurl/7.19.7 NSS/3.19.1 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"

 

 

11、基于用户的访问控制

一般私有数据才需要认证

网站上的认证方式有两种:

    表单认证,靠服务器端程序认证的

    http协议认证

 

认证质询

    弹出一个需要登录账号的对话框的机制就是认证质询

    WWW-Authenticate: 响应码为401,拒绝客户端请求,并说明要求客户端提供账号和密码

 

认证:

    Authorization:客户端用户填入账号和密码后再次发送请求报文,认证通过时,则服务器发送响应的资源

 

认证方式有两种

    basic: 明文方式发送

    digest: 消息摘要认证,客户端不直接发送自己的密码,而是用自己的密码加密一段数据发送给服务器,服务器再用存储的密码解密,如果能解密,就认证通过。

 

安全域:需要用户认证后方能访问的路径,应该通过名称对其进行标识,以便于告知用户认证的原因

 

用户的账号和密码存放于何处?

    虚拟账号:引用于访问某服务时用到的认证标识

    存储方式

        文本文件

        SQL数据库

        ldap目录存储,轻量级目录访问协议

 

basic认证配置示例

基于文本文件存储的演示过程

 

(1)定义安全域

<Directory "">

    ...

    Options None

    AllowOverride None

    AuthType Basic

    AuthName "String"

    AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE"

    Require user username1 username2 ...

</Directory>

如果允许账号文件中的所有用户登录访问

    Require valid-user

创建目录及页面文件

[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

<h1>Admin zone</h1>

配置安全域,及语法检测、重载

[root@localhost ~]# vim /etc/httpd/conf/httpd.conf

...

#DocumentRoot "/var/www/html"

DocumentRoot "/web/host1"

...

<Directory "/web/host1/admin">

Options None

AllowOverride None

AuthType Basic

AuthName "Admin Realm, show something."

AuthUserFile "/etc/httpd/conf/.htpasswd"

Require user tom

</Directory>

...

[root@localhost ~]# httpd -t

Syntax OK

[root@localhost ~]# service httpd reload

Reloading httpd:

[root@localhost ~]# service httpd configtest

Syntax OK

 

 

(2)提供账号和密码存储(文本文件的格式)

使用专用命令完成此类文件的创建及用户管理

# htpasswd [options] /PATH/TO/HTTPD_PASSWD_FILE username

    -h : 帮助信息

    -c : 自动创建此处指定的文件,因此,仅应用在此文件不存在时使用,即第一次创建时使用

    -m : md5格式加密

    -s : sha格式加密

    -D : 删除指定用户

    -d : 对称加密的,不安全

 

添加三个用户

[root@localhost ~]# htpasswd -c -m /etc/httpd/conf/.htpasswd tom

New password:

Re-type new password:

htpasswd: password verification error

[root@localhost ~]# htpasswd -c -m /etc/httpd/conf/.htpasswd tom

New password:

Re-type new password:

Adding password for user tom

[root@localhost ~]# htpasswd -m /etc/httpd/conf/.htpasswd jerry

New password:

Re-type new password:

Adding password for user jerry

[root@localhost ~]# htpasswd -m /etc/httpd/conf/.htpasswd obama

New password:

Re-type new password:

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

New password:

Re-type new password:

Adding password for user obama

 

这时只有tom用户才能用账号和密码登录

如果要三个用户都能登录

修改红色标记地方

[root@localhost ~]# vim /etc/httpd/conf/httpd.conf

...

<Directory "/web/host1/admin">

Options None

AllowOverride None

AuthType Basic

AuthName "Admin Realm, show something."

AuthUserFile "/etc/httpd/conf/.htpasswd"

Require valid-user             //修改的值

</Directory>

...

[root@localhost ~]# service httpd reload

Reloading httpd:

 

 

另外:基于组账号进行认证

(1)定义安全域

<Directory "">

    Options None

    AllowOverride None

    AuthType Basic

    AuthName "String"

    AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE"

    AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE"

    Require group grpname1 grpname2 ...

</Directory>

 

(2)创建用户账号文件和组账号文件

组文件:每一行定义一个组

GRP_NAME: username1 username2 ...

 

[root@localhost ~]# vim /etc/httpd/conf/httpd.conf

...

<Directory "/web/host1/admin">

Options None

AllowOverride None

AuthType Basic

AuthName "Admin Realm, show something."

AuthUserFile "/etc/httpd/conf/.htpasswd"

AuthGroupFile "/etc/httpd/conf/.htgroup"

Require group mygrp

</Directory>

...

[root@localhost ~]# vim /etc/httpd/conf/.htgroup

mygrp: obama blair

[root@localhost ~]# htpasswd -m /etc/httpd/conf/.htpasswd blair

New password:

Re-type new password:

Adding password for user blair

[root@localhost ~]# httpd -t

Syntax OK

[root@localhost ~]# service httpd reload

Reloading httpd:

 

 

 

12、虚拟主机

站点标识:socket

    IP相同,但端口不同

    IP不同,但端口均为默认端口

    FQDN不同,主要在请求报文中实现的

        根据http信息中的Host来判定:www.magedu.com

有三种实现方案

    基于ip

        为每个虚拟主机准备至少一个IP地址

    基于port

        为每个虚拟主机使用至少一个独立的port

    基于FQDN

        为每个虚拟主机使用至少一个FQDN

注意:一般虚拟主机不要与中心主机混用,因此,要使用虚拟主机,得先禁用"main"主机

    禁用方法:注释中心主机的"DocumentRoot"指令即可。

 

虚拟主机的配置方法:

    <VirtualHost IP:PORT>

        ServerName FQDN

        DocumentRoot ""

    <>

其它可用指令:

    ServerAlias:虚拟主机的别名,可多次使用

    ErrorLog:

    CustomLog:

    <Directory "">

    ...

    </Directory>

    Alias

    ...

 

基于IP的虚拟主机示例:

<VirtualHost 172.16.100.6:80>

    ServerName www.a.com

    DocumentRoot "/www/a.com/htdocs"

</VirtualHost>

 

<VirtualHost 172.16.100.7:80>

    ServerName www.b.net

    DocumentRoot "/www/b.net/htdocs"

</VirtualHost>

 

<VirtualHost 172.16.100.8:80>

    ServerName www.c.org

    DocumentRoot "/www/c.org/htdocs"

</VirtualHost>

 

基于端口的虚拟主机:

<VirtualHost 172.16.100.6:80>

    ServerName www.a.com

    DocumentRoot "/www/a.com/htdocs"

</VirtualHost>

 

<VirtualHost 172.16.100.6:808>

    ServerName www.b.net

    DocumentRoot "/www/b.net/htdocs"

</VirtualHost>

 

<VirtualHost 172.16.100.6:8080>

    ServerName www.c.org

    DocumentRoot "/www/c.org/htdocs"

</VirtualHost>

 

基于FQDN的虚拟主机:

NameVirtualHost 172.16.100.6:80

<VirtualHost 172.16.100.6:80>

    ServerName www.a.com

    DocumentRoot "/www/a.com/htdocs"

</VirtualHost>

 

<VirtualHost 172.16.100.6:80>

    ServerName www.b.net

    DocumentRoot "/www/b.net/htdocs"

</VirtualHost>

 

<VirtualHost 172.16.100.6:80>

    ServerName www.c.org

    DocumentRoot "/www/c.org/htdocs"

</VirtualHost>

 

13status页面

确保主配置文件中,模块已经装载

LoadModule status_module modules/mod_status.so

 

<Location /server-status>

    SetHandler server-status

    Order allow,deny

    Allow from 172.16

</Location>

 

 

 

13status页面

 

状态页面

编辑主配置文件

确保装载模块

打开

 

 

 

 

 

HTTP权威指南

 

 

2016/01/13

http协议进阶(01)

回顾:

httpd的配置

    Listen [IP:]PORT

    KeepAlived{On|Off}持久连接

    MPM

        prefork,worker,event

DSO:

    LoadModule

    httpd -M 静态动态都能查看

DocumentRoot

<Directory>

    Options Indexes FollowSymlinks

    Order

    Allow from

    Deny from

</Directory>

<Location>        //URL

 

DriectoryIndex

ErrorLog

CustomLog

LogFormat

    %{Referer}i: 引用Referer首部的值,当前页面的访问入口

Alias /URL/ "/path/to/somdir/"

 

基于用户的访问控制

    认证方式有两种:basicdigest

        AuthType Basic

        AuthName ""

        AuthUserFile

        AuthGroupFile

        Require user

        Require group

        Require valid-user

    .htpasswd:

        htpasswd 由命令生成

    虚拟主机:

    IP

    PORT

    FQDN

 

 

http协议和httpd的配置

URLUnifrom Resource Locator

    URL方案:scheme

    服务器地址:ip:port

    资源路径:

        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: 请求方法,标明客户端希望服务器对资源执行的动作

        GETHEADPOST 比较安全的方法

    version:

        HTTP/<major>.<minor>

    status:

        统一都是3位数字,如200301404502,响应状态码,用于标记请求处理过程中发生的情况

    reason-phrase:

        用来说明状态码所标记的状态的简要描述,原因短语

    headers:

        用来标记请求报文的属性的

        每个请求或响应报文可包含任意个首部,每个首部都有首部名称,后面跟一个冒号,而后跟上一个可选空格,接着是一个值

    entity-body:

        有用的数据块,请求报文的实体可能为空

        请求时附加的数据或响应时附加的数据

 

展开说明

method(方法)

    GET:从服务器获取一个资源:

    HEAD:头首之意,只从服务器获取文档的响应首部,而不是响应内容的

    POST:向服务器发送要处理的数据,有危险

    PUT:get相反的方法,将请求的主体部分存储在服务器上,非常危险

    DELETE:请求删除服务器上指定的文档

    TRACE:跟踪源到服务器上经由路由器的节点,追踪请求到达服务器中间经过的代理服务器

    OPTIONS:请求服务器对某个资源访问的方法,请求服务器返回对指定资源支持使用的请求方法

 

    协议查看或分析的工具

        tcpdumptsharkwireshark

 

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-aliveclose

    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 12两个版本

    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

 

 

14curl命令

curl是基于URL语法在命令行方式下工作的文件传输工具,它支持FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILELDAP等协议。curl支持HTTPS认证,并且支持HTTPPOSTPUT等方法, 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的内容输出至标准输出

 

15user/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 MSI[E] !no-gzip !gzip-only-text/html

 

 

16https, 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虚拟主机;

 

回顾几个术语:PKICACRLX.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

 

 

 

18http自带的工具程序

    htpasswd: basic认证基于文件实现时,用到的账号密码文件生成工具

    apachectl: httpd自带的服务控制脚本,支持startstop

    # 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 压测工具

 

19httpd的压力测试工具

文本行工具:

    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,这时需要再提供一台主机做CAIP 地址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 7httpd-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 安装目录下的 system32driversetc 目录中找到hosts 文件(Linuxhosts 文件在 /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.2httpd-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 Lerdorf1994年开始开发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.019956月,Rasmus Lerdorf把它的PHP发布于comp.infosystems.www.authoring.cgi Usenet讨论组,从此PHP开始走进人们的视野。1997年,其2.0版本发布。

 

1997年,两名以色列程序员Zeev SuraskiAndi Gutmans重写的PHP的分析器(parser)成为PHP发展到3.0的基础,而且从此将PHP重命名为PHP: Hypertext Preprocessor。此后,这两名程序员开始重写整个PHP核心,并于1999年发布了Zend Engine 1.0,这也意味着PHP 4.0的诞生。20047月,Zend Engine 2.0发布,由此也将PHP带入了PHP 5时代。PHP5包含了许多重要的新特性,如增强的面向对象编程的支持、支持PDO(PHP Data Objects)扩展机制以及一系列对PHP性能的改进。

 

二、PHP Zend Engine

Zend Engine是开源的、PHP脚本语言的解释器,它最早是由以色列理工学院(Technion)的学生Andi GutmansZeev Suraski所开发,Zend也正是此二人名字的合称。后来两人联合创立了Zend Technologies公司。

 

Zend Engine 1.01999年随PHP 4发布,由C语言开发且经过高度优化,并能够做为PHP的后端模块使用。Zend EnginePHP提供了内存和资源管理的功能以及其它的一些标准服务,其高性能、可靠性和可扩展性在促进PHP成为一种流行的语言方面发挥了重要作用。

 

Zend Engine的出现将PHP代码的处理过程分成了两个阶段:首先是分析PHP代码并将其转换为称作Zend opcode的二进制格式(类似Java的字节码),并将其存储于内存中;第二阶段是使用Zend Engine去执行这些转换后的Opcode

 

三、PHPOpcode

 

Opcode是一种PHP脚本编译后的中间语言,就像JavaByteCode,或者.NETMSLPHP执行PHP脚本代码一般会经过如下4个步骤(确切的来说,应该是PHP的语言引擎Zend)

1Scanning(Lexing) —— PHP代码转换为语言片段(Tokens)

2Parsing —— Tokens转换成简单而有意义的表达式

3Compilation —— 将表达式编译成Opocdes

4Execution —— 顺次执行Opcodes,每次一条,从而实现PHP脚本的功能

 

扫描-->分析-->编译-->执行

 

四、php的加速器

 

基于PHP的特殊扩展机制如opcode缓存扩展也可以将opcode缓存于php的共享内存中,从而可以让同一段代码的后续重复执行时跳过编译阶段以提高性能。由此也可以看出,这些加速器并非真正提高了opcode的运行速度,而仅是通过分析opcode后并将它们重新排列以达到快速执行的目的。

 

常见的php加速器有:

 

1APC (Alternative PHP Cache)

    遵循PHP License的开源框架,PHP opcode缓存加速器,目前的版本不适用于PHP 5.4。项目地址,http://pecl.php.net/package/APC

 

2eAccelerator

    源于Turck MMCache,早期的版本包含了一个PHP encoderPHP loader,目前encoder已经不在支持。项目地址, http://eaccelerator.net/

 

3XCache

    快速而且稳定的PHP opcode缓存,经过严格测试且被大量用于生产环境。项目地址,http://xcache.lighttpd.net/

 

4Zend OptimizerZend Guard Loader

    Zend Optimizer并非一个opcode加速器,它是由Zend TechnologiesPHP5.2及以前的版本提供的一个免费、闭源的PHP扩展,其能够运行由Zend Guard生成的加密的PHP代码或模糊代码。 Zend Guard Loader则是专为PHP5.3提供的类似于Zend Optimizer功能的扩展。项目地址,http://www.zend.com/en/products/guard/runtime-decoders

 

5NuSphere PhpExpress

    NuSphere的一款开源PHP加速器,它支持装载通过NuSphere PHP Encoder编码的PHP程序文件,并能够实现对常规PHP文件的执行加速。项目地址,http://www.nusphere.com/products/phpexpress.htm

 

五、PHP源码目录结构

PHP的源码在结构上非常清晰。其代码根目录中主要包含了一些说明文件以及设计方案,并提供了如下子目录:

 

1build —— 顾名思义,这里主要放置一些跟源码编译相关的文件,比如开始构建之前的buildconf脚本及一些检查环境的脚本等。

 

2ext —— 官方的扩展目录,包括了绝大多数PHP的函数的定义和实现,如array系列,pdo系列,spl系列等函数的实现。 个人开发的扩展在测试时也可以放到这个目录,以方便测试等。

 

3main —— 这里存放的就是PHP最为核心的文件了,是实现PHP的基础设施,这里和Zend引擎不一样,Zend引擎主要实现语言最核心的语言运行环境。

 

4Zend —— Zend引擎的实现目录,比如脚本的词法语法解析,opcode的执行以及扩展机制的实现等等。

 

5pear —— PHP 扩展与应用仓库,包含PEAR的核心文件。

 

6sapi —— 包含了各种服务器抽象层的代码,例如apachemod_phpcgifastcgi以及fpm等等接口。

 

7TSRM —— PHP的线程安全是构建在TSRM库之上的,PHP实现中常见的*G宏通常是对TSRM的封装,TSRM(Thread Safe Resource Manager)线程安全资源管理器。

 

8tests —— PHP的测试脚本集合,包含PHP各项功能的测试文件。

 

9win32 —— 这个目录主要包括Windows平台相关的一些实现,比如sokcet的实现在Windows下和*Nix平台就不太一样,同时也包括了Windows下编译PHP相关的脚本。

 

 

LAMP:

httpd:接收用户的web请求,静态资源则直接响应,动态资源为php脚本,对此类资源的请求交由php来运行

php:运行php程序

MariaDB:数据管理系统

 

httpphp结合的方式:

    CGI

    FastCGI

    modules(php编译成为httpd的模块)

        MPM

            prefork: libphp5.so

            event,worker: libphp5-zts.so

 

安装lamp:

    CentOS 6: httpd,php,mysql-server,php-mysql

        # service httpd start

        # service mysqld start

    CentOS 7: httpd,php,php-mysql,mariadb-server

        # systemctl start httpd.service

        # systemctl start mariadb.service

 

    MySQL的命令行客户端程序:mysql

        -u

        -h

        -p

        支持SQL语句对数据管理

        DDL,DML

            DDL: CREATE,ALTER,DROP,SHOW

            DML: INSERT,DELETE,SELECT,

 

授权能远程的连接用户:

mysql> GRANT ALL PRIVILEGES ON db_name.tbl_name TO username@host IDENTIFIED BY 'password';

 

php测试代码

<php?

    phpinfo();

?>

 

php连接mysql的测试代码:

<?php

    $conn = mysql_connect('172.16.100.67','testuser','testpass');

    if ($conn)

        echo "OK";

    else

        echo "Failure";

?>

 

 

 

 

 

实践作业:部署lamp,以虚拟主机安装wordpressphpwind,discuz;    

 

wordpress 数据库配置

# mysql

MariaDB [(none)]> GRANT ALL ON wpdb.* TO wpuser@'192.168.137.%' IDENTIFIED BY 'wppass';

                        FLUSH PRIVILEGES

MariaDB [(none)]> CREATE DATABASE wpdb;

#[修改配置文件]

 

2016/01/15

lamp组合深入介绍(01)

回顾:httpdlamp

httpd: mod_deflate, https

amp:

静态资源:Client--http-httpd

动态资源:Client--http--httpd-cgi--application server

动态资源:Client--http--httpd--libphp5.so()

动态资源:Client--http--httpd--libphp5.so(php模块)--mysql(驱动)--MySQL server

 

httpd+php

    modules:php编译成为httpd的模块

    cgi

    fastcgi

 

php: zend engine

    编译:Opcode是一种PHP脚本编译后的中间语言

    执行:

 

    Scanning--Parsing--Compilation--Execution

 

    加速器:APC, eAccelerator, Xcache

 

 

LAMP(2)

自定义错误页面

 

sendfile()

sendfile64()静态文件不再经过用户空间,直接在内核空间处理返回给用户

 

 

httpd+php

    modules:php编译成为httpd的模块

    cgi:

 

事件驱动有两种触发机制:

水平触发

边缘触发

AIO:异步IO

同步IO

阻塞IO

非阻塞IO

 

实现事件驱动的机epollo()

 

UNIXsocket

 

2.2没有fastcgi模块

2.4mod_proxy_fcgi

 

快速部署amp

CentOS 7:

    (1)Modules:程序包: httpd, php, php-mysql, mariadb-server

    (2)FastCGI:程序包: httpd, php-fpm, php-mysql, mariadb-server

CentOS 6:

    httpd, php, php-mysql, mysql-server

 

php:

脚本语言解释器:

    配置文件:/etc/php.ini/etc/php.d/*.ini

    配置文件在php解释器启动时被读取,因此,对配置文件的修改如何生效??

        Modules:重启httpd服务

        FastCGI:重启php-fpm服务

 

ini:

    [foo]:Section Header

    directive = value

    

    注释符:较新的版本中,已经完全使用;号进行注释

    #: 纯粹的注释信息

    ;: 用于注释可用的directive

 

如果分号后没有空格,就表示可以启用的选项或指令

如果有空格,表示纯粹的注释信息

 

php.ini的核心配置选项文档:http://php.net/manual/zh/ini.core.php

php.ini配置选项列表:http://php.net/manual/zh/ini.list.php

 

<?php

    ...php code...

?>

 

 

mariadb(mysql):

数据模型:层次模型、网状模型、关系模型

 

    关系模型:

        二维关系:

        表:row,column

        构建索引:index

        视图:view

    SQL接口:Structured Query Language

        操作数据库中数据的接口

        类似于操作系统的shell接口,也提供编程功能

 

    ANSI: SQL标准,SQL-86, SQL-89, SQL-92, SQL-99, SQL-03, ...

        支持xml数据格式输出

 

    DDL: Date Defined Langeuage

        CREATE,ALTER,DROP

    DML: Date Manapulating Language

        INSERT,DELETE,UPDATE,SELECT

 

编程接口

    选择,循环

SQL代码:

    存储过程:无返回procedure

    存储函数:有返回function

    触发器trigger

    时间调度器event scheduler

    例程:routine

 

用户和权限:

用户:用户名和密码

权限:管理类,数据库级别,表级别,字段级别

 

DBMS:DataBase Management System

RDBMS:Relational

 

MySQL 工作模型:单进程多线程模型

用户连接都是通过线程连接实现

线程池定义允许多少用户同时访问

 

 

 

mariadb基础应用(02)

事务(Transaction):组织多个操作为一个整体,要么全部都执行,要么全部都不执行

"回滚"rollback

 

Bob:8000,8000-1000

Alice:5000,5000+1000

 

一个存储系统是否支持事务,测试标准

    ACID:

        A:原子性:看几个操作是不是能组织为一体,或不可分拆的

        C:一致性:结果是一致的,不产生债务

        I:隔离性:事务之间是隔离的

        D:持久性:事务完成后,结果一定是要持久的

 

 

SQL接口:优化器、分析器

存储引擎:

 

外键约束:一个表中字段要填入的数据要取决于另外表一张表中某字段有没有这个数据

常识约束:比如年龄不能为负数,或大于200等等,是合理取值区间中的值

后选键:能唯一标识的员工字段,员工工号、身份证号,能拿来当主键使用

 

 

补充材料:RDMBS设计范式基础概念

 

设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。

 

目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴德斯科范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了。

 

(1) 第一范式(1NF

 

    所谓第一范式(1NF)是指在关系模型中,对域添加的一个规范要求,所有的域都应该是原子性的,即数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。即实体中的某个属性有多个值时,必须拆分为不同的属性。在符合第一范式(1NF)表中的每个域值只能是实体的一个属性或一个属性的一部分。简而言之,第一范式就是无重复的域。

 

    说明:在任何一个关系数据库中,第一范式(1NF)是对关系模式的设计基本要求,一般设计中都必须满足第一范式(1NF)。不过有些关系模型中突破了1NF的限制,这种称为非1NF的关系模型。换句话说,是否必须满足1NF的最低要求,主要依赖于所使用的关系模型。

 

(2) 第二范式(2NF)

 

    第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或记录必须可以被唯一地区分。选取一个能区分每个实体的属性或属性组,作为实体的唯一标识。

 

    第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。简而言之,第二范式就是在第一范式的基础上属性完全依赖于主键。

 

(3) 第三范式(3NF

 

    第三范式(3NF)是第二范式(2NF)的一个子集,即满足第三范式(3NF)必须满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个关系中不能包含已在其它关系已包含的非主关键字信息。简而言之,第三范式就是属性不依赖于其它非主属性,也就是在满足2NF的基础上,任何非主属性不得传递依赖于主属性。

 

 

数据库:数据集合

    :为了满足范式设计要求,将一个数据集分拆为多个

    约束constraint,向数据表插入的数据要遵守的限制规则

        主键:一个或多个字段的组合,填入主键的数据,必须不同于已存在的数据,不能为空

        外键:一个表中某字段中的数据能插入的数据,取决于另外一张表中的数据

        唯一键:一个或多个字段的组合,填入唯一键中的数据,必须不同于已存在的数据,可以为空

        检查性约束:取决于表达式的要求

    索引:将表中的某一个或某些字段抽取出来,将其单独组织一个独特的数据结构中

        常用的索引类型:

            树型

            hash

        注意:有助于读请求,但不利于写请求

    关系运算:对表做连接

        选择:挑选出符合条件的行

        投影:挑选出符合需要的字段

        连接:将多张表关联起来

    数据抽象

        物理层:决定数据的存储格式,即如何将数据组织成为物理文件

        逻辑层:描述DATABASE存储什么数据,以及数据间存在什么样的关系

        视图层:描述DATABASE中的部分数据

    关系模型的分类

        关系模型

        实体-关系模型

        基于对象的关系模型

        半结构化关系模型

 

MariaDB(mysql):

    Unireg

MySQL AB--MySQL

    Solaris:二进制版本

www.mysql.com

 

MariaDB:www.mariadb.org

MariaDB新特性

    插件式存储引擎:存储管理器有多种实现版本,彼此间的功能和特性可能略有区别;用户可根据需要灵活选择

    存储引擎也称为"表类型"

 

    (1)更多的存储引擎

        MyISAM: 不支持事务

        MyISAMàAria(改进版)

        InnoDBàXtraDB(改进版),支持事务

                    

 

    (2)诸多扩展和新特性

    (3)提供了较多的测试组件

    (4)truly open source

 

MySQL的发行机制

    Enterprise: 提供了更丰富的功能

    Community:

 

安装和使用MariaDB

安装方式有三种

(1)rpm

    (a)OS的发行商提供

    (b)程序官方提供

(2)源码包

(3)通用二进制格式的程序包

基于通用二进制格式安装

 

 

(1)准备数据目录

    /mydata/data目录为例

(2)安装配置mariadb

    # useradd -r mysql

    # tar xf mariadb-VERSION.tar.xz -C /usr/local

    # cd /usr/local

    # ln -sv mariadb-VERSION mysql

    # cd /usr/local/mysql

    # chown -R root:mysql ./*

    # mkdir /etc/mysql

    # cp support-files/my-large.cnf /etc/mysql/my.cnf

    # vim /etc/mysql/my.cnf

    # scripts/mysql_install_db --user=mysql --datadir=/mydata/data

    # cp support-files/mysql.server /etc/init.d/mysqld

    # chkconfig --add mysqld

(3)提供配置文件

    ini格式的配置文件:各程序均可通过此配置文件获取配置信息

        [program_name]

 

    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

    后面读取的才是最终生效的。

 

    获取其读取次序的方法:

    mysql --verbose --help

    mysqld --verbose --help

 

    # cp support-files/my-large.cnf /etc/my.cnf

 

    添加三个选项:

    datadir = /mydata/data

    innodb_file_per_table = ON

    skip_name_resolve = ON

 

(4)启动服务

    # service mysqld start

经典案例:

[root@localhost ~]# useradd -r mysql

[root@localhost ~]# ls

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

datadir = /mydata/data

innodb_file_per_table = ON

skip_name_resolve = ON

 

[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 mysql]# cd

[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)

回顾:MariaDB的基础

关系:二维关系:表(行、列)

设计范式:

    第一范式:字段是原子性的

    第二范式:存在可用主键

    第三范式:任何表都不应该依赖于其它表的非主属性

 

约束:主键、唯一键约束、检查性约束

 

MariaDB安装方式

    包管理器(rpm,deb)

    通用二进制格式

    源码编译安装

SQL

    数据库、表、索引、视图、存储过程、存储函数、触发器、事件调度器、用户和权限

    元数据:mysql

 

DDLDML

DDLCREATE, ALTER, DROP

DML:INSERT, DELETE,UPDATE,SELECT

DCL:GRANT,REVOKE

 

MariaDB的基础(2)

 

MariaDB程序的组成:

    C:Client

        mysql:CLI交互式客户端程序

        mysqldump:备份工具

        mysqladmin:管理工具

        mysqlbinlog:查看二进制日志工具

    S:Server

        mysqld

        mysqld_safe:建议运行服务端程序

        mysql_multi:多实例

        监听在三类套接字地址上

        IPv4,3306/tcp

        Unix Sock:/var/lib/mysql/mysql.sock,/tmp/mysql.sock

            C <-> S: localhost, 127.0.0.1

 

 

命令行交互式客户端程序:mysql

mysql

    mysql [OPTIONS] [database]

    常用选项:

    -uUSERNAME:用户名,默认为root

    -hHOST:远程主机(mysql服务器) 地址,默认为localhost;

    -p[PASSWORD]:USERNAME所表示的用户的密码,默认为空。

 

    注意: mysql的用户账号由两部分组成:'USERNAME'@'HOST'; 其中HOST用于限制此用户可通过哪些远程主机连接当前的mysql服务。

        HOST的表示方式,支持使用通配符:

        %: 匹配任意长度的任意字符:

            172.16.%.%, 172.16.0.0/16

        _: 匹配任意单个字符

    -Ddb_name: 连接到服务器端之后,设定其此处指明的数据库为默认库。

    -e'SQL COMMAND;': 连接至服务器并让其执行此命令后直接返回。

 

[root@localhost ~]# mysql -uroot -p -Dmysql

Enter password:

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.

 

MariaDB [mysql]> exit

Bye

[root@localhost ~]#

 

[root@localhost ~]# mysql -e 'SHOW DATABASES;'

+--------------------+

| Database |

+--------------------+

| information_schema |

| mysql |

| performance_schema |

| test |

+--------------------+

[root@localhost ~]#

 

 

命令

客户端命令:本地执行

mysql>help        //获取帮助

    u db_name : 设定哪个库为默认数据库

    q : 退出交互式接口

    d CHAR : 设定新的语句结束符

    g : 语句结束标记

    G : 语句结束标记,结果为竖排方式显示

    s : 查看状态

 

服务端命令:通过mysql协议连接发往服务器执行并取回结果

    DDL, DML, DCL

    注意:每个语句必须有语句结束符,默认为分号(;)

 

数据类型:

    :由行和列组成

        创建表就是定义表中的字段

        定义字段时,关键的一步即为确定其数据类型

        用于确定:数据存储格式、能参与运算种类、可表示的有效的数据范围

 

    字符型:字符集

        码表:在字符和二进制数字之间建立映射关系

        查看支持的字符集:

        MariaDB [(none)]> SHOW CHARACTER SET;

 

 

数据种类

字符型:

    定长字符型:

        CHAR(#):    不区分字符大小写

        BINARY(#):    区分字符大小写

    变长字符型:

        VARCHAR(#)

        VARBINARY(#)

    对象存储方案:只是存储一个指针,指向某个磁盘空间地址

        TEXT

        BLOB二进制的大对象

    内置类型:

        SET    集合

        ENUM

 

数值型:

    精确数值型:

        INT(TINYINT,SMALLINT,MEDIUMIN,INT,BIGINT)

    近似数值型:

        FLOAT

        DOBULE

    日期时间型:

        日期型: DATE

        时间型: TIME

        日期时间型: DATETIME

        时间戳: TIMESTAMP

        年份: YEAR(2),YEAR(4)

 

数据类型有修饰符:

    UNSIGNED : 无符号

    NOT NULL : 非空约束

    DEFAULT value : 默认值

 

服务器端命令:

DDL: 数据定义语言,主要用于管理数据库组件,例如表、索引、视图、用户、存储过程

    CREATE, ALTER, DROP

DML:数据操纵语言,主要用于管理表中的数据,实现数据的增、删、改、查

    INSERT, DELETE, UPDATE, SELECT

 

获取命令帮助:

    mysql>help KEYWORK

 

数据库管理:

创建:

    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

 

查看

    SHOW DATABASES LIKE '';

 

查看支持的所有字符集SHOW CHARACTER SET

查看支持的所有排序规则SHOW COLLATION

 

表管理

创建

获取帮助:HELP CREATE TABLE;

    CREATE TABLE [IF NOT EXISTS] tbl_name (create_defination) [table_options]

    create_defination:

        字段: col_name data_type

        

            PRIMARY KEY (col1, col2,...)

            UNIQUE KEY (col1, col2,...)

            FOREIGN KEY (column)

        索引KEY|INDEX [index_name] (col1, col2,...)

 

    table_options:

        ENGINE [=] engine_name

 

查看数据库支持的所有存储引擎类型

    mysql> SHOW ENGINES;

 

查看某表的存储引擎类型

    mysql> SHOW TABLES STATUS [LIKE 'tbl_name']

 

MariaDB [(none)]> show databases;

+--------------------+

| Database |

+--------------------+

| information_schema |

| mysql |

| performance_schema |

| test |

+--------------------+

4 rows in set (0.00 sec)

 

MariaDB [(none)]> CREATE DATABASE mydb;

Query OK, 1 row affected (0.00 sec)

 

MariaDB [(none)]> USE mydb;

Database changed

MariaDB [mydb]> CREATE TABLE students(id INT UNSIGNED NOT NULL, name CHAR(30) NOT NULL, age TINYINT UNSIGNED, gender ENUM('f','m'));

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

+--------+---------------------+------+-----+---------+-------+

4 rows in set (0.01 sec)

 

MariaDB [mydb]> DROP TABLE students;

Query OK, 0 rows affected (0.00 sec)

 

MariaDB [mydb]> CREATE TABLE students(id INT UNSIGNED NOT NULL, name CHAR(30) NOT NULL, age TINYINT UNSIGNED, gender ENUM('f','m'), PRIMARY KEY(id,name));

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

+--------+---------------------+------+-----+---------+-------+

4 rows in set (0.00 sec)

 

MariaDB [mydb]> DROP TABLE students;

Query OK, 0 rows affected (0.01 sec)

 

MariaDB [mydb]> CREATE TABLE students(id INT UNSIGNED NOT NULL PRIMARY KEY, name CHAR(30) NOT NULL, age TINYINT UNSIGNED, gender ENUM('f','m'));

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

+--------+---------------------+------+-----+---------+-------+

4 rows in set (0.00 sec)

 

 

 

 

修改:

获取帮助:HELP ALTER TABLE;

    ALTER [ONLINE | OFFLINE] [IGNORE] TABLE tbl_name [alter_specification [, 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;

 

            删除DROP [COLUMN] col_name

                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,...)

            删除:

                主键:DROP PRIMARY KEY

                外键:DROP FOREIGN KEY fk_symbol

        索引:

            添加:ADD {INDEX|KEY} [index_name] (col1, col2,...)

            删除:DROP {INDEX|KEY} index_name

        表选项:

            ENGINE [=] engine_name

 

    查看表上的索引的信息:mysql> SHOW INDEXES FROM tbl_name;

 

删除:DROP TABLE [IF EXISTS] tbl_name [, tbl_name] ...

 

表的引用方式:

    tbl_name

    db_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:

    INSERT [INTO] tbl_name [(col1,...)] {VALUES|VALUE} (val1, ...),(...),...

 

注意:

    字符型: 引号。

    数值型: 不能用引号。

 

SELECT:

    (1) SELECT * FROM tbl_name;

    (2) SELECT col1, col2, ... FROM tbl_name;

        显示时,字段可以显示为别名

            col_name AS col_alias

    (3) SELECT col1, ... FROM tbl_name WHERE clause;

            WHERE clause: 用于指明挑选条件

            col_name 操作符 value;

                age > 30;

 

操作符(1): >, <, >=, <=, ==, !=

组合条件: and, or, not

 

操作符(2):

    BETWEEN ... AND ...

    LIKE 'PATTERN'

    通配符:

        %: 长度的任意字符

        _: 单个字符

    RLIKE 'PATTERN'

    正则表达式对字符串做模式匹配

        IS NULL

        IS NOT NULL

 

    (4) SELECT col1, ... FROM tbl_name [WHERE clause] ORDER BY col_name, col_name2, ... [ASC|DESC];

        ASC: 升序,默认

        DESC: 降序排序

 

DELETE:

    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]

 

UPDATE:

    UPDATE [LOW_PRIORITY] [IGNORE] table_reference SET col_name1=value1 [, col_name2=value2] ... [WHERE where_condition] [ORDER BY ...] [LIMIT row_count]

 

用户账号及权限管理:

 

    用户账号'username'@'host'

    host:此用户访问当前mysql服务器时,允许其通过哪些主机远程创建连接

        表示方式IP,网络地址、主机名、通配符(%_)

 

        禁止检查主机名my.cnf

        [mysqld]

        skip_name_resolve = ON

 

    创建用户账号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'];

 

            priv_type: ALL [PRIVILEGES]

            db_name.tbl_name:

                *.*:所有库的所有表

                db_name.*:指定库的所有表

                db_name.tbl_name:指定库的特定表

                db_name.routine_name:指定库上的存储过程或存储函数

 

            [object_type]

                TABLE

                FUNCTION

                PROCEDURE

 

    查看指定用户所获得的授权

        SHOW GRANTS FOR 'user'@'host';

        SHOW GRANTS FOR CURRENT_USER;

 

回收权限REVOKE priv_type, ... ON db_name.tbl_name FROM 'user'@'host';

 

    注意:MariaDB服务进程启动时,会读取mysql库的所有授权表至内存中

        (1) GRANTREVOKE命令等执行的权限操作会保存于表中,MariaDB此时一般会自动重读授权表,权限修改会立即生效

        (2) 其它方式实现的权限修改,要想生效,必须手动运行FLUSH PRIVILEGES命令方可

 

加固mysql服务器,在安装完成后,运行mysql_secure_installation命令,是一些安全的向导设置。

 

 

图形管理组件:

    phpMyAdmin

        运行于lamp

    Navicat

    Mysql-Front

    ToadForMySQL

    SQLyog

 

在本机修改密码:

[root@localhost ~]# mysqladmin -u root -p password

Enter password:

New password:

Confirm new password:

 

 

2016/01/18

php-fpm及lamp编译安装(01)

回顾:MySQL基础应用

 

安装方式、SQL(DDL, DML)

安装方式:

    rpm

    通用二进制格式

    源码编译

SQL:

    mysql/mysqld

        mysqld:

            3306/tcp

        mysql

            客户端命令:c,g,G,s,u,q

            服务端命令:SQL

                命令结束符

 

                DML:INSERT, DELETE, UPDATE, SELECT

                DDL:CREATE DATABASE, ALTER DATABASE, DROP DATABASE, CREATE TABLE, ALTER TABLE, DROP TABLE, CREATE INDEX, DROP INDEX, CREATE USER, DROP USER, SELECT

                DCL:GRANT, REVOKE

 

数据类型:

    字符型:

        定长字符型: CHAR, BINARY

        变长字符型: VARCHAR, VARBINARY

            区分字符大小写: BINARY, VARBINARY

            不区分字符大小写: CHAR, VARCHAR

        TEXT, BLOB

        内建类型: SET, ENUM

    数值型:

        精确数值型:INT

        近似数值型:FLOAT, DOUBLE

    日期时间型:

        DATE, TIME, DATETIME, TIMESTAMP

 

LAMP(3)

    httpd+php结合的方式有三种:

        modules: php

        cgi

        fastcgi: php-fpm

注意:

modules方式与fastcgi方式不能共存

如果用modules方式,安装的是php程序包

如果用fastcgi方式,安装的是php-fpm程序包

 

安装php-fpm:

    CentOS 6:

        PHP-5.3.2-:默认不支持fpm机制,需要自行打补丁并编译安装

        httpd-2.2: 默认不支持fcgi协议,需要自行编译此模块

        解决方案:编译安装httpd-2.4, php-5,3,3+

 

    CentOS 7:

        httpd-2.4: rpm包默认编译支持了fcgi模块

        php-fpm: 专用于将php运行于fpm模块

 

        配置文件:

            服务配置文件: /etc/php-fpm.conf, /etc/php-fpm.d/*.conf

            php环境配置文件: /etc/php.ini, /etc/php.d/*.ini

 

        连接池:

            pm=static|dynamic

                static: 固定数量的子进程,pm.max_children

                dynamic: 子进程数据以动态模式管理

                    pm.start_servers

                    pm.min_spare_servers

                    pm.max_spare_servers

                    pm.max_requests=500

 

        创建session目录,并确保运行php-fpm进程的用户对此目录有读写权限

            # mkdir /var/lib/php/session

            # chown apache.apache /var/lib/php/session

 

        (1) 配置httpd,添加/etc/httpd/conf.d/fcgi.conf配置文件,内容类似:

 

                DirectoryIndex index.php

                ProxyRequests Off

                ProxyPassMatch ^/(.*.php)$ fcgi://127.0.0.1:9000/var/www/html/$1

 

                注意:^/(.*.php)$: 是匹配模式

                            fcgi: 是协议

                            127.0.0.1: 是安装了php-fpm主机提供服务的监听地址

                            /var/www/html/$1: 是提供php-fpm主机的文件系统路径地址,$1是被模式匹配的内容资源

 

 

        (2) 虚拟主机配置

            DirectoryIndex index.php

 

            <VirtualHost *:80>

                ServerName www.b.net

                DocumentRoot /apps/vhosts/b.net            //httpd服务器的静态页面的文件系统

                ProxyRequests Off                //关闭正向代理

                ProxyPassMatch ^/(.*.php)$ fcgi://127.0.0.1:9000/apps/vhosts/b.net/$1

 

                <Directory "/apps/vhosts/b.net">

                    Options None

                    AllowOverride None

                    Require all granted

                </Directory>

            </VirtualHost>

 

 

编译安装lamp

 

准备程序包:

    httpd:编译安装,httpd-2.4

    php5:编译安装,php-5.4

        php5依赖于mariadb,要先安装mariadb

        如果mariadb不打算用通用二进制格式,则只需提供mariadb-devel开发包

        在编译安装php时,一定要查看httpdmpm模块是哪个?如果是进程式的preforkphp编译出来的是进程式的模块的php5,

        如果httpdmpmworkevent模型,php5应该编译成php5-zts模块。这两者是不通用的

        如果是prefork模型,并且再编译了php,此时如果把prefork换成workerevent是不可以的,因为php不兼容,

        php以模块化方式编译成httpd的模块时,它以httpdmpm类型相关,

        进程式的mpm和线程式的mpm它们所使用的php模块是互不兼容的

 

    mairadb:通用二进制格式,mariadb-5.5

 

注意:任何一个程序包被编译操作依赖到时,需要安装此程序包的"开发"组件,其包名一般类似于name-devel-VERSION

 

CentOS 7

    httpd-2.4:

    # yum install pcre-devel apr-devel apr-util-devel openssl-devel

    # ./configure --prefix=/usr/local/apache24 --sysconfdir=/etc/httpd24 --enable-so --enable-ssl --enable-rewrite --with-zlib --with-pcre --with-apr=/usr --with-apr-util=/usr --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork

    # make -j 4 && make install

 

    php-5.4:

    # yum install libxml2-devel libmcrypt-devel

    # ./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-openssl --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring --with-png-dir --with-jpeg-dir --with-freetype-dir --with-zlib --with-libxml-dir=/usr --enable-xml --enable-sockets --with-apxs2=/usr/local/apache24/bin/apxs --with-mcrypt --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2

    # make -j 4 && make install

 

(--enable-maintainer-zts)支持workerevent,线程模式。

 

    # ./configure --prefix=/usr/local/php5.5 --enable-mbstring --enable-xml --enable-fpm --enable-sockets --with-mysql=/usr/local/mysql --with-openssl --with-mysqli=/usr/local/mysql/bin/mysql_config --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --with-mcrypt --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2

 

(--with-apxs2=/usr/local/apache24/bin/apxs)编译成httpd的模块

(--enable-fpm)编译成fastcgi

 

    xcache:

    epel源中

    程序包:php-xcache

 

    编译安装xache的方法:

        # yum install php-devel

        # cd xcache-3.2.0

        # phpize

        # ./configure --enable-xcache --with-php-config=/usr/bin/php-config

        # make && make install

        # cp xcache.ini /etc/php.d/

 

 

    注意: phpize功能在php-devel*.rpm包中

 

 

安装

# yum -y install php-fpm

 

后援队列,-1无限制

 

默认所有人

 

 

虚拟主机定义

 

 

 

编译安装lamp

    httpd: 编译安装,httpd-2.4

    php5: 编译安装,php-5.4

    mariadb: 通用二进制格式,mariadb-5.5

 

    注意:任意一个程序包被编译操作依赖到时,需要安装此程序包的"开发组件",其包名一般类似

 

 

 

lamp组合的其它话题(02)

 

并发级别

 

安装xcache:

    epel源中

        程序包:php-xcache

    编译安装xcache的方法:

        # yum install php-devel

        # cd xcache-3.2.0

        # phpize

        # ./configure --enable-xcache --with-php-config=/usr/bin/php-config

        # make && make install

        # cp xcache.ini /etc/php.d/

 

 

 

博客作业一: CentOS 7, lamp(php-fpm)

    要求:(1)三者分离于两台主机

        (2)一个虚拟主机用于提供phpMyAdmin,另一个虚拟主机用于提供wordpress

        (3)xcache

        (4)phpMyAdmin提供https虚拟主机

 

博客作业二: CentOS 7, lamp(php-fpm)

    要求:(1)三者分离于三台主机

        (2)一个虚拟主机用于提供phpMyAdmin,另一个虚拟主机用于提供wordpress

        (3)xcache

 

博客作业三: CentOS 6, lamp(编译安装,模块或php-fpm)

    要求:(1)三者分离于两台或三台主机

        (2)一个虚拟主机用于提供phpMyAdmin,另一个虚拟主机用于提供wordpress

        (3)xcache

        (4)尝试mpm为非prefork机制

 

yum clean all

yum makecache

 

 

先确保系统上没有安装php

 

确保fcgi模块装载

[root@localhost ~]# httpd -M | grep fcgi

proxy_fcgi_module (shared)

 

查看模块加载文件中有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

DirectoryIndex index.php

ProxyRequests off

ProxyPassMatch ^/(.*.php)$ fcgi://127.0.0.1:9000/web/vhosts/mysql/$1

 

[root@localhost ~]# httpd -t

Syntax OK

 

在默认路径下提供测试页面

[root@localhost ~]# vim /var/www/html/index.php

<?php

    phpinfo();

?>

 

启动php-fpm

[root@localhost ~]# systemctl start php-fpm.service

 

启动httpd

[root@localhost ~]# systemctl start httpd.service

 

 

给视频的MINI linux 制作

Mini Linux

 

    启动流程:

        CentOS 6

            POST --> BootSequence(BIOS) --> BootLoader --> Kernel (ramdisk) --> rootfs --> /sbin/init

 

                编写服务脚本

                upstart配置文件

 

                /etc/init/*.conf

                /etc/inittab

                    默认运行级别

                    运行系统初始化脚本:/etc/rc.d/rc.sysinit

                    /etc/rc.d/rc $runlevel

                    启动终端,并运行login

                    启动图形终端

 

        CentOS 7:

            POST --> BootSequence(BIOS) --> BootLoader --> Kernel (ramdisk) --> rootfs --> /sbin/systemd

 

                编写服务脚本

                systemd unit文件

 

    bootloader:

        lilo

        grub legacy

        grub2

            stage1: mbr

            stage1_5: filesystem driver

            state2:

 

    内核编译:

        make menuconfig --> .config

        make [-j #]

        make modules_install

        make install

 

    步骤:

        bootloader: grub

        内核:kernel (非模块方式)

        根文件系统:busybox

 

 

    复制程序及其依赖的库文件脚本示例:

        #!/bin/bash

        #

        target=/mnt/sysroot

        [ -d $target ] || mkdir /mnt/sysroot

 

        read -p "A command: " command

 

        libcp() {

         for lib in $(ldd $1 | grep -o "[^[:space:]]*/lib[^[:space:]]*"); do

         libdir=$(dirname $lib)

         [ -d $target$libdir ] || mkdir -p $target$libdir

         [ -f $target$lib ] || cp $lib $target$lib

         done

        }

 

        while [ "$command" != 'quit' ]; do

         if ! which $command &> /dev/null; then

         read -p "No such command, enter again: " command

         continue

         fi

         command=$(which --skip-alias $command)

         cmnddir=$(dirname $command)

 

         [ -d $target$cmnddir ] || mkdir -p $target$cmnddir

         [ -f $target$command ] || cp $command $target$command

         libcp $command

         read -p "Another command(quit): " command

        done

 

 

    Mini Linux: kernel+busybox

 

        busybox:

 

            静态方式编译,依赖于glibc-static;

 

        编译单个内核模块:

            # cd /usr/src/linux

            # make M=drivers/net/ethernet/intel/e1000/

 

            # make M=path/to/somedir/

 

 

 

2016/01/20

 

openssh的基本应用(01)

 

telnet: C/S, tcp/32

 

明文传输

不能防中间人

 

 

当客户端

服务器发送一串数据给客户端,进行对暗号

服务器端生成一串密钥,把自己的公钥部署在客户端上

对称加密

DH密钥密钥交换

每隔一段时间,对称密钥就换一次

 

刚开始第一次最好用普通用户登录,

 

 

 

客户端用自己的私钥加密一段数据,然后发送给远程服务器,远程服务器如果能用客户的公钥解密,用户身份得到验证

 

客户机需要保护好自己的私钥,所以要加密自己的私钥

 

 

 

 

OpenSSH:

telnet: C/S, 23/tcp

    CentOS 6:

        Server: telnet-server

        Client: tenet

 

服务进程有两种类型:

    超级守护进程: xinetd,服务器托管者,用于托管其他瞬时守护进程,自己是独立守护进程

    瞬时守护进程:非自我管理,而是由"超级守护进程"代为管理

xinetd:

    配置文件:/etc/xinetd.conf, /etc/xinetd.d/*

 

    CentOS 7:

        Server: telnet-serve

        Client: telnet

 

ssh: Secure Shell

    C/S: 22/tcp, 安全地远程登录

        Server: OpenSSH(服务器端程序sshd)

        Client: OpenSSH(客户端程序ssh,scp)

            windows: xshell, securecrt, sshseclureshellclient, putty;

 

 

    主机认证:需要用到主机认证密钥,由服务器端维护和提供

    用户登录:

        用户认证:

            基于口令的认证

            基于密钥的认证:

                用户提供一对儿密钥,私钥保留在客户端,公钥保留于远程服务器端的用户家目录下

 

OpenSSH:

    sshd: 配置文件/etc/ssh/sshd_config

    ssh: 配置文件/etc/ssh/ssh_config

 

    客户端程序:

        ssh [user@]host [COMMAND]

            用户名省略时,使用本地用户名作为远程登录的用户名

            # 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架构: 可通过UDPTCP协议提供日志记录服务

 

            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: 即日志服务器地址,必须要监听在tcpudp协议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)NISLDAPDNS

 

        每种存储中查找的结果状态

            STATUS => success | notfound | unavail | tryagain

        对应于每种状态参数的行为

            ACTION => return | continue

 

        例如:

            host: files nis [NOTFOUND=return] dns

 

        getent命令:

        # getent database [key]

            主要从ns库中查找

            

 

 

pampluggable authentication module

    主要是提供安全认证的

    以应用程序为中心

 

    认证库:存储

        多种类型的存储: 文件(默认在文件中)、关系型数据管理系统(MySQL)LDAPNIS

 

        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、简单实现:使用一个关键词来定义;例如sufficientrequired, 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 7nat链上多了一个

                -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,INPUTFORWARD

            [!] -o, --out-interface name : 数据报文流出的接口,只能应用于数据报文流出的环节,只能应用于FORWARD,OUTPUTPOSTROUTING

 

 

        扩展匹配条件:需要加载扩展模块,方可生效的-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

 

1multiport扩展

    以离散方式定义多端口匹配,最多指定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的规则,可以事先写一个脚本,定义一个时间后恢复正常策略

 

2iprange扩展

    指明连续的(但一般不指整个网络)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

 

 

3string扩展

对报文中的应用层数据做字符串模式匹配检测,不是正则表达式中的模式,而是使用专用的算法

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

 

 

4time扩展

根据将报文到达的时间与指定的时间范围进行匹配,彼此间是与逻辑,都要 匹配才可以

 

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

 

 

5connlimit扩展

根据每客户端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

 

 

6limit扩展

基于收发报文的速率做匹配

    令牌桶过滤器

        峰值速率,

 

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

 

默认扩展策略

 

7state扩展,连接追踪

根据 "连接追踪机制" 去检查连接的状态

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

 

 

练习:INPUTOUTPUT默认策略为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个,其后每分钟只允许5ping 请求

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

提示:安全起见,一般不适用默认端口

 

 

 

补充:利用iptablesrecent模块来抵御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.利用recentstate模块限制单IP300s内只能与本机建立2个新连接。被限制五分钟后即可恢复访问。

 

下面对最后两句做一个说明:

1.第二句是记录访问tcp 22端口的新连接,记录名称为SSH

    --set 记录数据包的来源IP,如果IP已经存在将更新已经存在的条目

 

2.第三句是指SSH记录中的IP300s内发起超过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:文本操作工具

 

diffUnix系统的一个很重要的工具程序。它用来比较两个文本文件的差异,是代码版本管理的核心工具之一。其用法非常简单:

    # 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,将f1f2的上下文合并在一起显示。

    它的使用方法是加入u参数(代表unified)。

    # diff -u f1 f2

    其结果的第一部分,也是文件的基本信息。"---"表示变动前的文件,"+++"表示变动后的文件。第二部分,变动的位置用两个@作为起首和结束。第三部分是变动的具体内容。

    除了有变动的那些行以外,也是上下文各显示3行。它将两个文件的上下文,合并显示在一起,所以叫做"合并格式"。每一行最前面的标志位,空表示无变动,减号表示第一个文件删除的行,加号表示第二个文件新增的行。

 

    diff

        -u

 

    patch

 

    尽管并没有指定patchdiff的关系,但通常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.allowhosts.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=item1item2item3...

            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

 

 

 

原文地址:https://www.cnblogs.com/chengtai/p/6086705.html