设为首页 收藏本站
查看: 3400|回复: 0

[经验分享] Linux Service and Security

[复制链接]

尚未签到

发表于 2017-6-22 10:47:58 | 显示全部楼层 |阅读模式
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)
DSC0000.png

  资源子网:用户空间的协议,都可以有软件自己的协议,具体的软件
  通信子网:
  传输层协议: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)
  为了达到安全目标所用到的解决方案:
  技术:解密和解密
  服务:用于抵御攻击的服务,也即是为了上述安全目标而特地设计的安全服务
  加密和解密:
  传统加密方法:替代加密算法、置换加密方法
  现代加密方法:现代块加密方法、
  结合算法,转换为另外一种方式
DSC0001.png

  服务:认证机制、访问控制机制
  密码算法和协议
      对称加密
      非对称加密(公钥加密)
      单向加密
      认证协议
  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)
      特点:用公钥加密的数据,只能使用与之配对的私钥解密,反之亦然
      用途:
          数字签名:主要在于让接收方确认发送方的身份
          密钥交换:发送方用对方的公钥加密一个对称密钥(对称密钥是加密数据和特征码的),并发送给对方
          数据加密
DSC0002.png

  加密算法:RSA,DSA,ELGamal
      DSS:Digital Signature Standard
      DSA:Digital Signature Algorithm
  单向加密:即提出数据指纹,只能加密,不能解密
      特性:定长输出、雪崩效应
      功能:保证完整性
      算法:
          md5:Message Digest5, 128bits
          sha1: Secure Hash Algorithm 1, 160bits
              sha224,sha256,sha384,sha512
  密钥交换:IKE (Internet Key Exchange)
      公钥加密
      DH(Deffie-Hellman)两个大素数
      双方协商生成p,g,使用明文交换的
          A:p,g
          B:p,g
      双方私下各自生成的数x,y
          A:x
  A把p^x%g的结果发送给B
  A用B发过来的(p^y%g)^x=p^yx%g
          B:y
  B把p^y%g的结果发送给A
  B用A发过来的(p^x%g)^y=p^xy%g
  PKI:Public Key Infrastructure
  公钥基础设施:
      签证机构:CA
      注册机构:RA
      证书吊销列表:CRL
      证书存取库
  数字证书格式:X.509 v1,v2,v3
  X.509v3:定义了证书的结构以及认证协议标准
      版本号
      序列号
      签名算法ID
      发行者名称
      有效期限
      主体名称
      主体公钥
      发行者的唯一标识
      主体的唯一标识
      扩展
      发行者的签名
  ..\..\..\document\SSL_handshake_with_two_way_authentication_with_certificates.svg
  SSL:Secure sockets Layer
  Netscape:1994
  V1.0, V2.0, V3.0
  TLS:Transport Layer Security
  IETF:1999
  V1.0, V1.1, V1,2
  建议使用TLSV1.2
  分层设计:
  1、最底层:基础算法原语的实现,aes,rsa,md5
  2、向上一层:各种算法的实现
  3、再向上一层:组合算法实现的半成品
  4、用各种组件拼装而成的各种成品密码学协议软件
  协议的开源实现:OpenSSL
openssl使用详解(03)
  回顾
  技术:加密和解密,服务
  加密算法和协议
      对称加密:数据加密(保密性)
      公钥加密:身份认证、密钥交换、数据加密(不常用,比对称加密要慢3个数量级)
      单向加密:数据完整性
      密钥交换:RSA, DH(迪菲-赫尔曼), ECDH(椭圆曲线DH), ECDHE(临时椭圆曲线DH)
  SSL/TLS
      SSL: 安全套接字层(ssl1.0, ssl2.0, ssl3.0)
      TLS: 传输层安全(tls1.0, tls1.1, tls1.2(目前主流), tls1.3)
  工具OpenSSL
      libcrypto
      libssl
      openssl
  SSL会话主要三步:
  1、客户端向服务器端索要并验证证书
  2、双方协商生成"会话密钥"
  3、双方采用"会话密钥"进行加密通信
  SSL Handshake Protocal
  第一阶段:ClientHello:
      发送自己支持的协议版本,比如tls1.2
      客户端生成一个随机数,稍后用户生成"会话密钥"
      支持的加密算法,比如AES、RSA、3DES
      支持的压缩算法
  第二阶段:ServerHello
      确认使用的加密通讯协议版本,比如tls1.2
      服务器端生成一个随机数,稍后用于生成"会话密钥"
      确认使用的加密方法
      发送服务器证书
      (索要客户端证书)
  第三阶段:
      验证服务器证书,在确认无误后,取出其公钥(验证发证机构、证书完整性、证书的持有者、证书有效期、验证吊销列表)
      发送以下信息给服务器端
          发送一个随机数,用于服务器上的公钥加密
          编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送
          客户端握手结束通知
  第四阶段
      收到客户端发来的第三个随机数pre-master-key后,计算生成本次会话所用到的"会话密钥"
      向客户端发送如下信息
          编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送
          服务端握手结束通知
  sshPKI:公钥基础设施
      签证机构:CA
      注册机构:RA
      证书吊销列表:CRL
      证书存取库
  OpenSSL
  组件:
      libcrypto,libssl主要开发者使用
      openssl:多用途命令行工具
  openssl众多子命令,分为三类
      标准命令
      消息摘要命令(dgst子命令)
      加密命令(enc子命令)
  标准命令:enc, ca, req, genrsa, ...
  对称加密:
      工具:openssl enc, gpg
      支持的算法:3des,aes,blowfish,towfish
  enc命令使用方法:
  加密:~]# openssl enc -e -des3 -a -salt -in fstab -out fstab.ciphertext
  解密:~]# openssl enc -d -des3 -a -salt -out fstab -in fstab.ciphertext
  单向加密工具
  主要用于取数据特征码
  # openssl dgst FILE ...
  # md5sum FILE ...
  # sha1sum FILE ...
  # sha224sum FILE ...
  # sha384sum FILE ...
  # sha512sum FILE ...
  dgst命令
  # openssl dgst -md5 /PATH/TO/SOMEFILE
  [iyunv@localhost ~]# md5sum fstab
  36417d4122a5e7be47e4d7af793a7a81  fstab
  [iyunv@localhost ~]# openssl dgst -md5 fstab
  MD5(fstab)= 36417d4122a5e7be47e4d7af793a7a81
  生成用户密码工具
  # passwd
  # openssl passwd
  # openssl passwd -1 -salt SALT
  [iyunv@localhost ~]# openssl passwd -1 -salt 12345678
  Password:
  $1$12345678$0ME5N6oDyoEAwUp7b5UDM/
  生成随机数
  # openssl rand
  # openssl rand -base64 NUM        //基于文本的随机数
  [iyunv@localhost ~]# openssl rand -base64 10
  HF8LJsVGU5ABFQ==  有个固定的格式特征就是双等号==
  # openssl rand -hex NUM        //生成十六进制数格式的随机数
  [iyunv@localhost ~]# openssl rand -hex 10
  48cb2f6a1faad637e126
  用随机数代替salt的推荐方式
  [iyunv@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)显示于屏幕
  [iyunv@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
  [iyunv@localhost ~]# openssl genrsa 1024 > /tmp/mykey.private
  Generating RSA private key, 1024 bit long modulus
  ....++++++
  .........................++++++
  e is 65537 (0x10001)
  3)保存为文件2
  [iyunv@localhost ~]# openssl genrsa -out /tmp/mykey.private 1024
  Generating RSA private key, 1024 bit long modulus
  ........................................................++++++
  ........................++++++
  e is 65537 (0x10001)
  4)生成仅对自己有读取权限的密钥文件3
  [iyunv@localhost ~]# (umask 077;openssl genrsa -out /tmp/mykey.private 2048)
  Generating RSA private key, 2048 bit long modulus
  ..............................+++
  ...+++
  e is 65537 (0x10001)
  5)提取公钥
  [iyunv@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)生成密钥
  [iyunv@localhost ~]# ls /etc/pki/CA/private/
  [iyunv@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选项
  [iyunv@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
  [iyunv@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)用到证书的主机生成私钥
  [iyunv@localhost ~]# mkdir /etc/httpd/ssl
  [iyunv@localhost ~]# cd /etc/httpd/ssl/
  [iyunv@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)生成证书签署请求
  [iyunv@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 []:
  [iyunv@localhost ssl]# ls
  httpd.csr  httpd.key
  (3)将证书通过可靠的方式发送给CA主机
  这里用scp命令发送
  [iyunv@localhost ssl]# scp httpd.csr root@192.168.137.11:/tmp/
  (4)在CA主机上签署证书
  [iyunv@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
  [iyunv@localhost ~]# ls /etc/pki/CA/certs/
  httpd.crt
  (5)把签好的证书通过安全途径给客户端
  这里用scp命令演示
  [iyunv@localhost ~]# cd /etc/pki/CA/certs/
  [iyunv@localhost certs]# ls
  httpd.crt
  [iyunv@localhost certs]# scp httpd.crt root@192.168.137.10:/etc/httpd/ssl/
  至此httpd服务器的证书已建立完成
  查看证书信息
  [iyunv@localhost ssl]# openssl x509 -in httpd.crt -noout -serial -subject
  serial=01
  subject= /C=CN/ST=Beijing/O=MageEdu/OU=Ops/CN=www\xC3\xA3.magedu.com/emailAddress=webmaster@magedu.com
  吊销证书步骤
  (1)客户端获取要吊销的证书的serial(在使用证书的主机上执行)
  [iyunv@localhost ssl]# openssl x509 -in httpd.crt -noout -serial -subject
  serial=01
  subject= /C=CN/ST=Beijing/O=MageEdu/OU=Ops/CN=www\xC3\xA3.magedu.com/emailAddress=webmaster@magedu.com
  貌似是有错误,因为在填写信息时有Backspace按键
  (2)CA主机吊销证书
  先根据客户提交的serial和subject信息,对比其与本机数据库index.txt中存储的是否一致
  吊销:
  # openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
  注意是在CA主机上执行的,其中的SERIAL要换成证书真正的序列号
  [iyunv@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
DSC0003.png

这是一个灌输鸡汤的时刻(04)
  1万个小时
加密类型及相关算法(以前的笔记)
  完整性、机密性、身份验证
  发送方用自己的私钥加密能保证发送方的身份验证
  发送方用对方的公钥加密能保证数据的机密性
  对称加密:
      DES:Data Encryption Standard,56bit
      3DES:
      AES:Advanced Encryption Standard,高级加密标准
      AES128、AES192、AES256、AES512
      Blowfish:
  单向加密(定长输出):
      MD4
      MD5:128
      SHA1:160
          SHA224、SHA256、SHA384
      CRC-32:循环冗余校验码(非加密算法、不提供安全性)
  公钥加密(加密/签名):
      RSA:机密、签名
      DSA:只能签名(公开使用)
      ElGamal:商业加密
  openssl:   
      工具:
          OpenSSL:SSL的开源实现
              libcrpto:通用加密库,提供了各种加密函数
              libssl:TLS/SSL的实现
                  基于会话的、实现了身份验证,数据机密性和会话完整性的TLS/SSL库
              openssl;多用途命令行工具
                  实现私有证书颁发机构
                  子命令可用 openssl ? 查看
                  使用例子:
                      加密:openssl enc -des3 -salt -a -in inittab -out inittab.des3
                      解密:openssl enc -des3 -d -salt -a -in inittab.des3 -out inittab
      提取特征码(指纹)
          # openssl dgst -md5 inittab
          # md5sum inittab
          # sha1sum inittab
      生成密码串
          # openssl passwd -1
      生成私钥
          # (umask 077;openssl genrsa -out server1024.key 1024)
      从私钥中提取公钥
          # openssl rsa -in server1024.key -pubout [-out server.pubkey]
      生成自签证书
          # openssl req -new -x509 -key server1024.key -out server.crt -days 365
      查看证书信息
          # openssl x509 -text -in server.crt
  客户机向CA申请证书
      1、客户机生成自己的私钥
      2、客户机生成证书签署请求
          openssl req -new -key httpd.key -out httpd.csr
              ##注意,私有证书中,国家地区名称、组织单位名称及以上信息,一定要和CA一样,不然就不会签了
      3、CA签署证书
          openssl ca -in httpd.csr -out httpd.crt -days 365
  CA目录结构
      /etc/pki/CA/certs/:客户端证书放置位置
      /etc/pki/CA/crl/:客户端证书吊销列表
      /etc/pki/CA/index.txt:给那些人发了证书的记录
      /etc/pki/CA/newcerts/:刚新生成的证书放置目录
      /etc/pki/CA/cacert.pem:CA自己的证书
      /etc/pki/CA/serial:当前证书的序列号
      /etc/pki/CA/crlnumber:证书撤销列表的号码
      /etc/pki/CA/crl.pem:
      /etc/pki/CA/private/cakey.pem:CA自己的私钥
  PKI:Public Key Infrastructure PKI的核心就是CA
      CA:Certificate Authority 证书权威机构
  SSL:Secure Socket Layer 安全的套接字层
  TLS:Transport Layer Security 传输层安全(国际标准化组织的)
  目前比较流行的证书存储格式是x509
  x509:公钥、有效期限、证书的合法拥有者、证书该如何被使用(什么用途)、CA的信息、使用CA私钥签名了的校验码
  PKI:TLS/SSL:x509
  PKI:OpenGPG(另一种实现架构)
  CRL(证书吊销列表):里面包含此前曾发出去的仍未过期的但由于各种原因已经被撤销了的证书,比如私钥泄露等。
  Alice和Bob建立通信
  (这一步是Alice获取签名证书的过程)
  Alice首先生成自己的私钥。为了能够让Bob认可自己的身份,Alice首先向第三方公认机构(CA)提交自己的公钥和其他身份认证信息,由CA做公正。CA把Alice的公钥和身份信息,还有CA自己的身份信息作为整体一起计算出特征码,再用CA自己的私钥加密该特征码(即为签名),并把签名结果附加在整体数据后面,形成由CA认可了的Alice的证书。
  (这一步主要是Bob获取Alice的公钥)
  接着,Bob先向Alice发送会话请求,然后双方互相协商要使用哪一种加密协议(SSLv2、SSLv3、TLSv1)、哪一种对称加密算法等,协商完,Alice向Bob发送证书,Bob利用CA自签证书(需要通过可靠途径获得)中CA的公钥解密Alice的证书特征码,如果能解密,就说明Alice发来的证书是由自己可信的CA签署的,是可信的,接下来,通过特征码再验证数据的完整性。数据完整性验证通过,再看是不是自己认可的证书颁发机构发的,如果是,再去查看这个证书颁发机构所提供的CRL(证书吊销列表)中此证书有没有被吊销,如果存在,也要拒绝使用此证书,如果不存在,证书验证成功,Alice的公钥获取成功。
  接着,Bob会生成一个随机的密钥(对称密钥),用Alice的公钥加密后传递给Alice,然后Alice就可以用这个对称密钥与Bob进行加密的会话了。
     
  这时在没有CA的情况下,Alice和Bob通信过程,这样难以防止"中间人"攻击
  1、Alice加密发送过程
  1) Alice先用单向加密提取要发生数据的特征码
  2) Alice再用自己的私钥加密这段特征码,并将结果附加在数据后面
  3) Alice生成一个临时的对称密钥,并使用对称密钥加密这整段数据
  4) Alice获取到Bob的公钥,并使用对方的公钥加密刚临时的对称密钥,再附加到整个后面
  5) Alice将整个结果发送给Bob
  2、Bob解密过程
  1) Bob用自己的私钥解密对称密钥
  2) 再用对称密钥解密这整段内容
  3) 用对方的公钥解密特征码,能解密,Alice的身份得到验证
  4) Bob再用同样的单向加密算法计算出这段数据的特征码,再与对方发送的特征码比较,如果相同,数据完整性得到验证
DSC0004.png

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
DSC0005.png

DSC0006.png

DSC0007.png

  BSD Socket:IPC的一种实现,允许位于不同主机(也可以是同一主机)上的进程之间进行通信
  内核为应用程序提供了 Socket API (封装了内核中的socket通信相关的系统调用)
      SOCK_STREAM:TCP套接字
      SOCK_DGRAM:UDP套接字
      SOCK_RAW:raw套接字裸套接字
  根据套接字所使用的地址格式:Socket Domain
      AF_INET: Address Family,Ipv4
      AF_INET6: ipv6
      AF_UNIX: 同一主机上的不同进程间基于socket套接字通信使用的一种地址,Unix_SOCK
  TCP协议的特性
      建立连接:三次握手
      将数据打包成段:校验和CRC32
      确认、重传及超时机制
      排序:基于逻辑序号
      流量控制:基于滑动窗口算法的,取决于对方的接收缓冲大小
      拥赛控制:慢启动和拥赛避免算法
DSC0008.png

DSC0009.png

  TCP FSM  time_wait=2msl
     
  http:hyper text transfer protocol,应用层协议,80/tcp,文本协议
  html(hyper text mark language,编程语言,超文本标记语言
  <html>
      <head>
      </head>
      <body>
          <h1></h1>
              <p>blabla...<a href=http://www.magedu.com/download.html>bla...</a></p>
          <h2></h2>
      </body>
  </html>
  css: Cascading Style Sheet
  js: JavaScript,客户端脚本,运行时,需要客户先下载,在客户端运行
  协议版本:
      http/0.9: 原型版本,功能简陋
      http/1.0: cache,MIME,method.
          MIME: Multipurpose Internet Mail Extesion
          method: GET, POST, HEAD, PUT, DELETE, OPTIONS
      http/1.1: 增强了缓存功能
          google的spdy
      http/2.0: 借鉴spdy 更多看rfc文档
  工作模式:
      http请求报文:http request
      http响应报文:http response
          一次http事务:一次请求<-->响应
  Web资源:web resource
      静态资源(无须服务端做出额外处理): .jpg, .png, .gif, .html, .txt, .js, .css, .mp3, .avi
      动态资源(服务端需要通过执行程序做出处理,发送给客户端的是程序运行的结果): .php, .jsp
  注意:一个页面中展示的资源可能有多个,每个资源都需要单独请求
  资源的标识机制:URL
      Uniform Resource Locator: 用于描述服务器某特定资源的位置
      例如:http://www.sina.com.cn/index.html
      Scheme://Server[:Port][/PATH/TO/SOME_RESOURCE]
  一次完整的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)DSO:dynamic shared object
  (3)MPM:Multipath processing Modules (多道处理模块)
      1)prefork: 多进程模型,每个进程响应一个请求
          一个主进程:负责生成子进程及回收子进程,负责创建套接字,负责接收请求,并将其派发给某子进程进行处理
          n个子进程:每个子进程处理一个请求,只负责处理,不接受请求
          工作模型:会预先生成几个空闲进程,随时等待用于响应用户请求,最大空闲和最小空闲
      2)worker:多进程多线程模型,每个线程处理一个用户请求
          一个主进程:负责生成子进程负责创建套接字,负责接收请求,并将其派发给某子进程进行处理
          多个子进程:每个子进程负责生成多个线程
          每个线程:负责响应用户请求
          并发响应数量:m*n
              m:子进程数量
              n:每个子进程所能创建的最大线程数量
      3)event:事件驱动模型,多进程模型,每个进程响应多个请求
          一个主进程:负责生成子进程,负责创建套接字,负责接收请求,并将其派发给某子进程进行处理
          子进程:基于事件驱动机制直接响应多个请求
          httpd-2.2: event仍为测试使用模型
          httpd-2.4: event可生产环境中使用
  httpd的程序版本
      httpd-1.3: 官方已经停止维护
      httpd-2.0:
      httpd-2.2:
      httpd-2.4: 目前最新稳定版
  httpd的功能特性
      CGI: Common Gateway Interface     通用网关接口
      虚拟主机: IP, PORT, FQDN
      反向代理
      负载均衡
      路径别名
      丰富的用户认证机制
          basic: 基本认证
          digest: 摘要认证
      支持第三方模块
          ...
  安装httpd:
      rpm包:CentOS 发行版中直接提供
      编译安装:定制新功能,或其它原因,相当不建议
  CentOS 6:
  程序环境:
      配置文件:
          /etc/httpd/conf/httpd.conf
          /etc/httpd/conf.d/*.conf
      服务脚本:
          /etc/rc.d/init.d/httpd
          脚本配置文件:/etc/sysconfig/httpd
      主程序文件:要用哪种模型,就用哪个主程序,在脚本配置文件/etc/sysconfig/httpd中配置
          /usr/sbin/httpd
          /usr/sbin/httpd.event
          /usr/sbin/httpd.worker
      日志文件目录:/var/log/httpd/
          access_log: 访问日志
          error_log: 错误日志
      站点文件目录:/var/www/html/
      模块文件目录路径:/usr/lib64/httpd/modules/
      服务控制和启动:
          # chkconfig httpd on|off
          # service {start|stop|restart|status|configtest|reload} httpd
  CentOS 7: httpd-2.4
  程序环境:
      配置文件:
          /etc/httpd/conf/httpd.conf
          /etc/httpd/conf.d/*.conf
          模块相关的配置文件:/etc/httpd/conf.modules.d/*.conf
      systemd unit file:
          /usr/lib/systemd/system/httpd.service
      主程序文件:/usr/sbin/httpd
          httpd-2.4支持MPM的动态切换
      日志文件目录:/var/log/httpd/
          access_log: 访问日志
          error_log: 错误日志
      站点文档目录:/var/www/html/
      模块文件目录路径:/usr/lib64/httpd/modules/
      服务控制:
          # systemctl enable|disable httpd.service
          # systemctl {start|stop|restart|status} httpd.service
httpd基础配置详解(03)
  回顾:
  并发服务响应模型
  单进程模型
  多进程模型
  复用的I/O的模型
      多线程模型
      事件驱动
  复用的多进程多线程模型
  MPM
      prefork: 多进程模型,一个进程响应一个请求
      worker: 一个主进程生成多个子进程,多个子进程生成多个线程,一个线程响应一个请求
      event: 事件驱动模型,一个进程响应n个请求
  Web Server(2)
  httpd 2.2的常用配置
  主配置文件:/etc/httpd/conf/httpd.conf
  辅助配置文件:/etc/httpd/conf.d/*.conf
  主配置文件有三段组成
  ### Section 1: Global Environment            //全局配置段
  ### Section 2: 'Main' server configuration        //中心主机配置
  ### Section 3: Virtual Hosts            //虚拟主机配置
  配置格式:
  directive value
      directive: 不区分字符大小写
      value: 为路径时,是否区分字符大小写,取决于文件系统
  先备份配置文件:
  # cp -v httpd.conf{,.backup}
  [iyunv@localhost ~]# cd /etc/httpd/conf/
  [iyunv@localhost conf]# cp -v httpd.conf{,.backup}
  `httpd.conf' -> `httpd.conf.backup'
  常用配置:
  1、修改监听的IP和PORT,
      Listen [IP:]PORT
      (1)省略IP表示0.0.0.0            //本机正常配置可使用的所有IP
      (2)Listen指令可重复出现多次
          Listen 80
          Listen 8080
      (3)修改监听socket(IP或PORT)只有重启服务进程方可生效,通常配置修改后只需reload即可
  2、持久连续
      Persistent Connection: tcp连续建立后,每个资源获取完成后不全断开连接,而是继续等待其它资源请求的进行
      如何断开?
          数量限制
          时间限制
      副作用: 对并发访问量较大的服务器,长连接机制会使得后续某些请求无法得到正常响应
      折中办法: 使用较短的持久连接时长,以及较少的请求数量
      配置:
          KeepAlive On|Off         //如果长连接关闭,则一次请求以后就连接关闭
          KeepAlive Timeout 15     //单位:秒
          MaxKeepAliveRequests 100         //一次长连接时的最大请求次数
  测试方法:
  telnet WEB_SERVER_IP PORT [回车]
  GET /URL HTTP/1.1 [回车]
  Host: WEB_SERVER_IP [回车][回车]    //连按两下回车
  演示效果:
  [iyunv@localhost ~]# cd /var/www/html/
  [iyunv@localhost html]# vim test.html
  <h1>Test Site</h1>
  [iyunv@localhost html]# ls
  test.html
  [iyunv@localhost html]# cd
  [iyunv@localhost ~]# telnet 192.168.137.100 80
  Trying 192.168.137.100...
  Connected to 192.168.137.100.
  Escape character is '^]'.
  GET /test.html HTTP1.1
  Host: 192.168.137.100
  HTTP/1.1 200 OK
  Date: Tue, 12 Jan 2016 08:35:26 GMT
  Server: Apache/2.2.15 (CentOS)
  Last-Modified: Tue, 12 Jan 2016 08:14:50 GMT
  ETag: "e0101-13-5291ea5c14602"
  Accept-Ranges: bytes
  Content-Length: 19
  Connection: close
  Content-Type: text/html; charset=UTF-8
  <h1>Test Site</h1>
  Connection closed by foreign host.
  3、MPM
  httpd-2.2版本不支持同时编译多个MPM模块,所以只能编译选定要使用的那个。CentOS 6的rpm包为此专门提供了三个应用程序文件,分别用于实现对不同的MPM机制的支持。
      httpd(默认的prefork模型)
      httpd.worker
      httpd.event
  确认现在使用的是哪个程序文件的方法
  默认使用的程序文件为/usr/sbin/httpd, 其为prefork的MPM模块
   [iyunv@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
  [iyunv@localhost ~]# /usr/sbin/httpd -l
  Compiled in modules:
    core.c
    prefork.c
    http_core.c
    mod_so.c        //支持动态模块装卸载的模块接口
  2)查看静态编译及动态编译的模块
  # httpd -M
  [iyunv@localhost ~]# /usr/sbin/httpd -M
  ...
  3)更换使用httpd程序,以支持其他MPM机制
  先最好停止httpd服务
  再修改/etc/sysconfig/httpd文件
  HTTPD=/usr/sbin/httpd.{worker,event}
  然后重启服务生效
  [iyunv@localhost ~]# service httpd stop
  Stopping httpd:                                            [  OK  ]
  [iyunv@localhost ~]# vim /etc/sysconfig/httpd
  ...
  HTTPD=/usr/sbin/httpd.worker
  ...
  [iyunv@localhost ~]# service httpd start
  Starting httpd:                                           [  OK  ]
  [iyunv@localhost ~]# ps aux | grep httpd
  root       3976  0.0  0.8 186136  4168 ?        Ss   17:26   0:00 /usr/sbin/httpd.worker
  apache     3979  0.0  0.6 530396  3348 ?        Sl   17:26   0:00 /usr/sbin/httpd.worker
  apache     3980  0.0  0.6 530396  3368 ?        Sl   17:26   0:00 /usr/sbin/httpd.worker
  apache     3982  0.0  0.6 595932  3360 ?        Sl   17:26   0:00 /usr/sbin/httpd.worker
  root       4210  0.0  0.1 103308   852 pts/1    S+   18:07   0:00 grep httpd
  脚本配置文件原理。。。
  #!/bin/bash
  #
  [ -f /tmp/useradd.conf ] && source /tmp/useradd.conf
  username=${username:-testuser}
  echo $username
  <IfModule prefork.c>
  StartServers       8            //服务器刚启动时,就启动多少个进程
  MinSpareServers    5            //最少空闲进程数,如果少于这个数,主控进程就再启动进程够这个数量
  MaxSpareServers   20            //最大空闲进程数量
  ServerLimit      256            //允许启动最大在线进程数量=MaxClients+空闲数量,ServerLimit >= MaxClients
  MaxClients       256            //最大允许启动多少个进程去响应用户请求,最大并发响应的数量
  MaxRequestsPerChild  4000        //每个进程最多处理多少个请求,处理到4000个后,把该进程销毁
  </IfModule>
  <IfModule worker.c>
  StartServers         4        //刚开始启动多少个服务子进程
  MaxClients         300        //
  MinSpareThreads     25        //最少空闲线程数
  MaxSpareThreads     75        //最大空闲线程数
  ThreadsPerChild     25        //每个进程可以生成多少个线程
  MaxRequestsPerChild  0        //无限制
  </IfModule>
  PV,UV
      PV:Page View        //页面浏览量
      UV:User View
  1个进程1秒处理5个请求,假设都是静态请求
  256*5=1280        //满载,1秒钟可以响应的请求数量
  1280*60*60*24=110592000            //满载,1天可以响应的请求数量
  1个页面中有100个资源
  110592000/100=1105920        //相当于1天可以响应的页面访问量,也就是PV
  这是平均值,是不科学的。
  实际要按峰值来构建服务器,还要考虑其他因素,比如网络服务器的带宽
  1个请求需要10KB
  1秒钟需要产生的流量1280*10KB=12800KB/1024=12.5MB
  换算成比特(bit)12.5MB*8=100Mbit
  这个带宽流量只是资源数据的大小,还不包含各种网络协议的报头首部等数据
  4、DSO (动态共享模块)
  配置指定实现模块加载
  LoadModule <mod_name> <mod_path>
  任何模块如果不想用,可以直接注释掉即可
  模块文件路径可使用相对路径,相对于ServerRoot(默认/etc/httpd,又符号链接到其他位置)
  [iyunv@localhost ~]# ls -l /etc/httpd
  total 8
  drwxr-xr-x. 2 root root 4096 Jan 12 18:21 conf
  drwxr-xr-x. 2 root root 4096 Jan  3 20:27 conf.d
  lrwxrwxrwx. 1 root root   19 Jan  3 20:27 logs -> ../../var/log/httpd
  lrwxrwxrwx. 1 root root   29 Jan  3 20:27 modules -> ../../usr/lib64/httpd/modules
  lrwxrwxrwx. 1 root root   19 Jan  3 20:27 run -> ../../var/run/httpd
  5、定义"Main server"的文档页面路径
  中心主机默认的根目录
      DocumentRoot "/var/www/html"
          文档路径映射
      DoucumentRoot指定的路径为URL路径的起始位置,相当于站点URL的根路径
          (FileSystem)/web/host1/index.html –> (URL)/index.html
          从文件系统路径映射到了URL路径
  6、站点访问控制常见机制
  可基于两种机制指明对哪些资源进行何种访问控制
  (1)文件系统路径
      1)对一个目录及子目录的各种访问控制
          <Directory "路径">
          ...[各种控制指令]
          </Directory>
      2)针对单个文件实现访问控制的
          <File "">
          ...
          </File>
      3)对被正则表达式模式匹配到的各文件实现的访问控制
          <FileMatch "PATTERN">
          ...
          </FileMatch>
  (2)URL路径
      1)
          <Location "">
          ...
          </Location>
      2)
          <LocationMatch "">
          ...
          </LocationMatch>
  <Dircetory "">中"基于源地址"实现访问控制
  (a)Options : 用于控制这个目录所制定路径下的各种资源的被访问模式或方式
      后跟1个或多个以空白字符分隔的"选项"列表
          Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
      其中常用的有:
          Indexes: 指定的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户
          FollowSymLinks: 允许跟踪符号链接所指向的源文件
          None:所有都没有
          All:全部都有
  (b)AllowOverride 会极大降低性能,一般不建议使用
      与访问控制相关的哪些指令可以放在.htaccess文件(每个目录下都可以有一个)中,
      .htaccess文件内设定的指令优先级权限高于当前目录所设定的
          Options FileInfo AuthConfig Limit
          All:所有都可以放进去
          None:所有都不放进去
  (c)Order和allow,deny
      order: 定义生效次序,写在后面的表示默认法则。
          allow deny 做白名单
          deny allow 做黑名单
      Allow from,允许哪些地址的主机来访问页面的
      Deny from,拒绝哪些地址的主机来访问页面的
          来源地址的格式:
          IP
          NetAddr:
              172.16
              172.16.0.0
              172.16.0.0/16
              172.16.0.0/255.255.0.0
  Order allow,deny            //只有明确指明的才能访问,其他不能访问。白名单机制
  Order deny,allow            //只有明确指明的才能被禁止,其他都能访问。黑名单机制
  Deny from 192.168.137.11
  Allow from 192.168.137.100
  主机192.168.137.11测试结果
  [iyunv@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测试结果
  [iyunv@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
  可指定中文字符集有: GBK、GB2312、GB18030
httpd基础配置详解(04)
  10、日志设定
  日志类型:访问日志和错误日志,每个站点都有独立的日志
      错误日志:
      ErrorLog logs/error_log
      LogLevel warn
      Possible values include: debug, info, notice, warn, error, crit, alert, emerg.
      日志级别,级别越高,对应的事务的严重程度就越高,同样意味着事件数量就越少
  debug表示所有信息,只要产生了,都记录下来
  info比debug高一级的
  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"的值,即发出请求的应用程序
      示例
  [iyunv@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
  创建目录及页面文件
  [iyunv@localhost ~]# mkdir /web/host1/admin -vp
  mkdir: created directory `/web'
  mkdir: created directory `/web/host1'
  mkdir: created directory `/web/host1/admin'
  [iyunv@localhost ~]# vim /web/host1/admin/index.html
  <h1>Admin zone</h1>
  配置安全域,及语法检测、重载
  [iyunv@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>
  ...
  [iyunv@localhost ~]# httpd -t
  Syntax OK
  [iyunv@localhost ~]# service httpd reload
  Reloading httpd:
  [iyunv@localhost ~]# service httpd configtest
  Syntax OK
  (2)提供账号和密码存储(文本文件的格式)
  使用专用命令完成此类文件的创建及用户管理
  # htpasswd [options] /PATH/TO/HTTPD_PASSWD_FILE username
      -h : 帮助信息
      -c : 自动创建此处指定的文件,因此,仅应用在此文件不存在时使用,即第一次创建时使用
      -m : md5格式加密
      -s : sha格式加密
      -D : 删除指定用户
      -d : 对称加密的,不安全
  添加三个用户
  [iyunv@localhost ~]# htpasswd -c -m /etc/httpd/conf/.htpasswd tom
  New password:
  Re-type new password:
  htpasswd: password verification error
  [iyunv@localhost ~]# htpasswd -c -m /etc/httpd/conf/.htpasswd tom
  New password:
  Re-type new password:
  Adding password for user tom
  [iyunv@localhost ~]# htpasswd -m /etc/httpd/conf/.htpasswd jerry
  New password:
  Re-type new password:
  Adding password for user jerry
  [iyunv@localhost ~]# htpasswd -m /etc/httpd/conf/.htpasswd obama
  New password:
  Re-type new password:
  Adding password for user obama
  [iyunv@localhost ~]# htpasswd -D /etc/httpd/conf/.htpasswd obama
  Deleting password for user obama
  [iyunv@localhost ~]# htpasswd -m /etc/httpd/conf/.htpasswd obama
  New password:
  Re-type new password:
  Adding password for user obama
  这时只有tom用户才能用账号和密码登录
  如果要三个用户都能登录
  修改红色标记地方
  [iyunv@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>
  ...
  [iyunv@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 ...
  [iyunv@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>
  ...
  [iyunv@localhost ~]# vim /etc/httpd/conf/.htgroup
  mygrp: obama blair
  [iyunv@localhost ~]# htpasswd -m /etc/httpd/conf/.htpasswd blair
  New password:
  Re-type new password:
  Adding password for user blair
  [iyunv@localhost ~]# httpd -t
  Syntax OK
  [iyunv@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>
  13、status页面
  确保主配置文件中,模块已经装载
  LoadModule status_module  modules/mod_status.so
  <Location /server-status>
      SetHandler server-status
      Order allow,deny
      Allow from 172.16
  </Location>
  13、status页面
  状态页面
  编辑主配置文件
  确保装载模块
DSC00010.png

DSC00011.png 打开

DSC00012.png

DSC00013.png

DSC00014.png

  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/"
  基于用户的访问控制
      认证方式有两种:basic,digest
          AuthType Basic
          AuthName ""
          AuthUserFile
          AuthGroupFile
          Require user
          Require group
          Require valid-user
      .htpasswd:
          htpasswd 由命令生成
      虚拟主机:
      IP
      PORT
      FQDN
  http协议和httpd的配置
  URL:Unifrom 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: 请求方法,标明客户端希望服务器对资源执行的动作
          GET、HEAD、POST 比较安全的方法
      version:
          HTTP/<major>.<minor>
      status:
          统一都是3位数字,如200,301,404,502,响应状态码,用于标记请求处理过程中发生的情况
      reason-phrase:
          用来说明状态码所标记的状态的简要描述,原因短语
      headers:
          用来标记请求报文的属性的
          每个请求或响应报文可包含任意个首部,每个首部都有首部名称,后面跟一个冒号,而后跟上一个可选空格,接着是一个值
      entity-body:
          有用的数据块,请求报文的实体可能为空
          请求时附加的数据或响应时附加的数据
  展开说明
  method(方法)
      GET:从服务器获取一个资源:
      HEAD:头首之意,只从服务器获取文档的响应首部,而不是响应内容的
      POST:向服务器发送要处理的数据,有危险
      PUT:跟get相反的方法,将请求的主体部分存储在服务器上,非常危险
      DELETE:请求删除服务器上指定的文档
      TRACE:跟踪源到服务器上经由路由器的节点,追踪请求到达服务器中间经过的代理服务器
      OPTIONS:请求服务器对某个资源访问的方法,请求服务器返回对指定资源支持使用的请求方法
      协议查看或分析的工具
          tcpdump、tshark、wireshark
  status(状态码)
  1xx: 100-101,信息提示
  2xx: 200-206,成功类的信息
  3xx: 300-305,重定向类状态码
  4xx: 400-415,错误类信息,客户端错误
  5xx: 500-505,错误类信息,服务器端错误
  常用的状态码:
      200:成功响应,请求的所有数据通过响应报文的entity-body部分发送:OK
      301:请求的资源被移动到其他位置去了,请求的URL指向的资源已经被删除,但在响应报文中通过首部Location指明了资源现在所处的新位置,永久重定向:Moved Permanently
      302: 与301相似,但在响应报文中通过Location指明资源现在所处临时新位置,Found
      304:客户端发出了条件式请求,但服务器上的资源未曾发生改变,则通过响应此响应状态码通知客户端: Not Modified
      401: 需要输入账号和密码认证方能访问资源:Unauthorized
      403:请求被禁止,Forbidden
      404:服务器无法找到客户端请求的资源:Not Found
      500:服务器内部错误:Internal Server Error
      502:代理服务器从后端服务器收到了一条伪响应:Bad Gateway,可用trace方法追踪代理服务器节点
  headers:
      格式:
      Name: Value
DSC00015.png

      首部的分类
          通用首部
          请求首部
          响应首部
          实体首部
          扩展首部
  展开说明
  通用首部: 请求和响应报文中都能用
      Date:报文的创建时间
      Connection: 连接方式,如keep-alive,close
      Via: 显示报文经由的中间节点
      Cache-Control:控制缓存
      Pragma:
  请求首部:
      Accept: 通知服务器自己可接受的媒体类型,MIME的类型
      Accept-Charset: 接受的字符集
      Accept-Encoding: 接受哪些种编码格式,如gzip
      Accept-Language:接受的语言
      信息型首部
      Client-IP: 客户端IP地址
      Host: 请求的服务器名称和端口号
      Referer: 包含了当前正在请求的资源的上一级资源
      User-Agent: 客户端代理
      条件式首部
      Expect
      If-Modified-Since: 自从指定的时间之后,请求的资源是否发生过修改
      If-Unmodified-Since:
      If-None-Match: 本地缓存中存储的文档的Etag标签是否与服务器文档的ETag不匹配
      If-Match:
      安全请求首部
      Authorization:向服务器发送认证信息,如账号和密码
      Cookie:客户端向服务器发送Cookie 1,2两个版本
      Cookie2:
      代理请求首部
      Proxy-Authorization:向代理服务器认证
  响应首部
      信息性:
      Age:只占用资源的年龄,响应持续时长
      Server:服务器程序软件名称和版本
      协商首部:某资源有多种表示方法时使用
      Accept-Ranges:服务器可接受的请求范围类型
      Vary:服务器查看的其他首部列表
      安全响应首部
      Set-Cookie:向客户端设置Cookie
      Set-Cookie2:
      WWW-Authentiate:来自服务器的对客户端的质询认证表单
  实体首部
      Allow:列出对此实体可使用的请求方法
      Location:告诉客户端真正的实体位于何处,重定向时使用
      Content-Encoding:内容的编码格式
      Content-Language:
      Content-Length:主体的长度
      Content-Location:实体真正所处位置
      Content-Type:主体的对象类型
     
      缓存相关
      Etag:实体的扩展标签
      Expires:实体的过期时间
      Last-Modified:最后一次修改的时间
httpd-2.2应用进阶(02)
  http rfc
  http 权威指南
  httpd-2.2的常见配置(2)
  服务器遇到自己不理解的首部时,会通通忽略
  MIME类型:major/minor, image/png, image/gif
  14、curl命令
  curl是基于URL语法在命令行方式下工作的文件传输工具,它支持FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE及LDAP等协议。curl支持HTTPS认证,并且支持HTTP的POST、PUT等方法, FTP上传, kerberos认证,HTTP上传,代理服务器, cookies,用户名/密码认证,下载文件断点续传,上载文件断点续传, http代理服务器管道( proxy tunneling),甚至它还支持IPv6, socks5代理服务器,,通过http代理服务器上传文件到FTP服务器等等,功能十分强大。
  用法:curl [options] [URL...]
  curl的常用选项
  -A/--user-agent <string> 设置用户代理发送给服务器
  -basic 使用HTTP基本认证
  --tcp-nodelay 使用TCP_NODELAY选项
  -e/--referer <URL> 来源网址
  --cacert <file> CA证书 (SSL)
  --compressed 要求返回是压缩的格式
  -H/--header <line>自定义首部信息传递给服务器
  -I/--head 只显示响应报文首部信息
  --limit-rate <rate> 设置传输速度
  -u/--user <user[:password]>设置服务器的用户和密码
  -0/--http1.0 使用HTTP 1.0
  另一个工具:elinks
  用法:elinks [OPTION]... [URL]...
      -dump: 不进入交互式模式,而直接将URL的内容输出至标准输出
  15、user/group
      指定以哪个用户的身份运行httpd服务进程
          User apache
          Group apache
      suexec: 用另外用户的身份运行程序
  16、使用mod_deflate模块压缩页面优化传输速度
      适用场景:
      (1) 节约带宽,额外消耗CPU;同时,可能有些较老浏览器不支持;
      (2) 压缩适于压缩的资源,例如文件文件;
      SetOutputFilter DEFLATE
      # mod_deflate configuration
      # Restrict compression to these MIME types
      AddOutputFilterByType DEFLATE text/plain
      AddOutputFilterByType DEFLATE text/html
      AddOutputFilterByType DEFLATE application/xhtml+xml
      AddOutputFilterByType DEFLATE text/xml
      AddOutputFilterByType DEFLATE application/xml
      AddOutputFilterByType DEFLATE application/x-javascript
      AddOutputFilterByType DEFLATE text/javascript
      AddOutputFilterByType DEFLATE text/css
      # Level of compression (Highest 9 - Lowest 1)
      DeflateCompressionLevel 9
      # Netscape 4.x has some problems.        //对某些浏览器过滤
      BrowserMatch ^Mozilla/4 gzip-only-text/html
      # Netscape 4.06-4.08 have some more problems
      BrowserMatch ^Mozilla/4\.0[678] no-gzip
      # MSIE masquerades as Netscape, but it is fine
      BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
  16、https, http over ssl
  http over ssl = https 443/tcp
      ssl: v3
      tls: v1
      https://
  SSL会话的简化过程
      (1) 客户端发送可供选择的加密方式,并向服务器请求证书
      (2) 服务器端发送证书以及选定的加密方式给客户端
      (3) 客户端取得证书并进行证书验正:
          如果信任给其发证书的CA:
          (a) 验正证书来源的合法性;用CA的公钥解密证书上数字签名
          (b) 验正证书的内容的合法性:完整性验正
          (c) 检查证书的有效期限
          (d) 检查证书是否被吊销
          (e) 证书中拥有者的名字,与访问的目标主机要一致
      (4) 客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换
      (5) 服务器用此密钥加密用户请求的资源,响应给客户端
  注意:SSL会话是基于IP地址创建;所以单IP的主机上,仅可以使用一个https虚拟主机;
  回顾几个术语:PKI,CA,CRL,X.509 (v1, v2, v3)
  配置httpd支持https:
  (1) 为服务器申请数字证书;
      测试:通过私建CA发证书
          (a) 创建私有CA
          (b) 在服务器创建证书签署请求
          (c) CA签证
  (2) 配置httpd支持使用ssl,及使用的证书
      # yum -y install mod_ssl
      配置文件:/etc/httpd/conf.d/ssl.conf
          DocumentRoot
          ServerName
          SSLCertificateFile
          SSLCertificateKeyFile
  在/etc/httpd/conf.d/ssl.conf配置文件中有个历史遗留的待解决的问题:
  <VirtualHost _default_:443>
  (3) 测试基于https访问相应的主机;
      # openssl s_client [-connect host:port] [-cert filename] [-CApath directory] [-CAfile filename]
  在这里只演示web服务器创建证书签署请求,接着配置httpd支持使用ssl的过程
  首先在WEB服务器上生成密钥
  [iyunv@localhost ~]# cd /etc/httpd
  [iyunv@localhost httpd]# ls
  conf  conf.d  logs  modules  run
  [iyunv@localhost httpd]# mkdir ssl
  [iyunv@localhost httpd]# cd ssl
  [iyunv@localhost ssl]# (umask 077;openssl genrsa -out httpd.key 1024)
  Generating RSA private key, 1024 bit long modulus
  .......++++++
  ...................................++++++
  e is 65537 (0x10001)
  生成证书签署请求
  [iyunv@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 []:
  [iyunv@localhost ssl]# ls
  httpd.csr  httpd.key
  发送CA签署
  [iyunv@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端签署证书
  [iyunv@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
  [iyunv@localhost ~]# cd /etc/pki/CA/certs/
  [iyunv@localhost certs]# ls
  httpd_100.crt  httpd.crt
  把证书给WEB服务器
  [iyunv@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模块
  [iyunv@localhost ssl]# ls
  httpd_100.crt  httpd.csr  httpd.key
  [iyunv@localhost ssl]# yum -y install mod_ssl
  ...
  备份ssl.conf
  [iyunv@localhost ~]# cd /etc/httpd/conf.d
  [iyunv@localhost conf.d]# cp ssl.conf ssl.conf.bak
  修改正确路径,一般修改下面的四项
  [iyunv@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
  ...
  检查语法,无误后重载配置或重启服务
  [iyunv@localhost ~]# httpd -t
  Syntax OK
  [iyunv@localhost ~]# service httpd restart
  Stopping httpd:                                            [  OK  ]
  Starting httpd:                                            [  OK  ]
  这时,所有配置经完成。在基于https协议浏览时,需要手动导入CA证书,一般为cacert.pem文件,可以改为证书标准后缀*.crt
  在浏览器测试
DSC00016.png

  用上面的命令行工具测试
  [iyunv@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
DSC00017.png

  18、http自带的工具程序
      htpasswd: basic认证基于文件实现时,用到的账号密码文件生成工具
      apachectl: httpd自带的服务控制脚本,支持start和stop
      # apachectl stop|start
      apxs: 由httpd-devel包提供,扩展httpd使用第三方模块的工具
      rotatelogs: 日志滚动工具,有两个维度,时间、体积
          access.log à
              access.log, access.1.logà
                  access.log, access.1.log, access.2.logà
                      ...
      suexec: 访问某些有特殊权限配置的资源时,临时切换至指定用户身份运行
      ab: apache bench 压测工具
  19、httpd的压力测试工具
  文本行工具:
      ab, webbench, http_load, seige
  图形化工具
      jmeter, loadrunner
  其中
      tcpcopy: 是网易开源的,复制生产环境中的真实请求,并将之保存下来
  ab命令的用法
  # ab [OPTIONS] URL
      -n: 总请求数
      -c: 模拟的并行数
      -k: 以持久连接模式测试
  注意:一般c模拟的并行数要小于等于n总请求数
  示例:
  [iyunv@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安装即可
          [iyunv@localhost ~]# httpd -M
          [iyunv@localhost ~]# yum -y install mod_ssl
  2)、提供CA,这时需要再提供一台主机做CA,IP 地址192.168.10.25 。要想做CA,首先要生成自签证书。使用openssl genrsa格式先生成密钥,输出保存在/etc/pki/CA/private/cakey.pem ,2048位,600权限其他人不允许访问。
          [iyunv@localhost ~]# cd /etc/pki/CA
          [iyunv@localhost CA]# (umask 077;openssl genrsa -out private/cakey.pem 2048)
      生成自签证书,先修改默认配置信息,保存退出
          [iyunv@localhost ~]# cd /etc/pki/tls
          [iyunv@localhost tls]# vim openssl.cnf
              countryName_default             = CN
              stateOrProvinceName_default     = Gansu
              localityName_default            = Lanzhou
              0.organizationName_default      = School
              organizationalUnitName_default  = Tech
      接着生成自签证书
          [iyunv@localhost ~]# cd /etc/pki/CA
          [iyunv@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
      接着更改路径
          [iyunv@localhost ~]# cd /etc/pki/tls
          [iyunv@localhost tls]# vim openssl.cnf
              dir             = /etc/pki/CA           # TSA root directory
      创建目录和文件
          [iyunv@localhost CA]# mkdir certs crl newcerts
          [iyunv@localhost CA]# touch index.txt
          [iyunv@localhost CA]# echo 01 > serial
          [iyunv@localhost CA]# ls
              cacert.pem  certs  crl  index.txt  newcerts  private  serial
      至此CA已经能用了。
     
  3)、返回到Web服务器
      生成自己的密钥
          [iyunv@localhost ~]# cd /etc/httpd
          [iyunv@localhost httpd]# mkdir ssl
          [iyunv@localhost httpd]# ls
              conf  conf.d  logs  modules  run  ssl
          [iyunv@localhost httpd]# cd ssl/
          [iyunv@localhost ssl]# (umask 077; openssl genrsa 1024 > httpd.key)
              Generating RSA private key, 1024 bit long modulus
              ...................++++++
              ................++++++
              e is 65537 (0x10001)
      生成证书颁发请求
          [iyunv@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 []:
          [iyunv@localhost ssl]# ls
              httpd.csr  httpd.key
      把证书送到CA
          [iyunv@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 ,开始签署证书
      签署过程
          [iyunv@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
      查看证书签署结果
          [iyunv@localhost ~]# cd /etc/pki/CA
          [iyunv@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
          [iyunv@localhost CA]# cat serial
              02
      此时,证书已经签好(官方登记成功)了
     
  5)、到Web服务器取回已经签好的自己的证书
      操作如下
          [iyunv@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   
          [iyunv@localhost ssl]# ls
              httpd.crt  httpd.csr  httpd.key
      至此,证书已取回成功
  6)、再到CA ,因为刚才是在/tmp 临时目录操作的,为避免被别人获取,应该把证书相关的文件删除
      [iyunv@localhost CA]# ls
          cacert.pem  certs  crl  index.txt  index.txt.attr  index.txt.old  newcerts  private  serial  serial.old
      [iyunv@localhost CA]# ls newcerts/
          01.pem
      [iyunv@localhost CA]# cd /tmp
      [iyunv@localhost tmp]# ls /tmp
          httpd.crt  httpd.csr
      [iyunv@localhost tmp]# rm -f httpd.c*
     
  7)、配置Web服务器使用此证书
      操作如下,主要是配置ssl.conf 文件,这里只列出了需要修改的行
          [iyunv@localhost ~]# cd /etc/httpd/conf.d/
          [iyunv@localhost conf.d]# ls
              manual.conf  nagios.conf  php.conf  README  ssl.conf  virtual.conf  welcome.conf
          [iyunv@localhost conf.d]# cp ssl.conf ssl.conf.bak
          [iyunv@localhost conf.d]# vim ssl.conf
              <VirtualHost 192.168.10.100:443>
              <VirtualHost _default_:443>        //这是CentOS 7上httpd-2.4版本默认监听地址
                  ServerName www.a.com
                  DocumentRoot "/www/a.com"
                  SSLCertificateFile /etc/httpd/ssl/httpd.crt
                  SSLCertificateKeyFile /etc/httpd/ssl/httpd.key
                  ## crt: 证书
                  ## crl: 证书吊销列表
                 
      检查语法-->重启httpd服务-->查看443端口是否监听
          [iyunv@localhost conf.d]# httpd -t
              Syntax OK
          [iyunv@localhost conf.d]# service httpd restart
              Stopping httpd:                                            [  OK  ]
              Starting httpd:                                            [  OK  ]
          [iyunv@localhost conf.d]# netstat -tnlp |grep :443
              tcp   0   0 :::443     :::*     LISTEN      2354/httpd
          
  8)、客户端安装CA自签证书
      如果不能配置DNS 服务器,而客户机是 Windows 系统,可以在Windows 安装目录下的 system32\drivers\etc 目录中找到hosts 文件(Linux的hosts 文件在 /etc 目录),然后添加以下内容,就可以保证本客户机使用的www.a.com 域名指向192.168.10.100
          192.168.10.100        www.a.com
      用传输工具,在CA 服务器上把CA自签证书复制过来,修改后缀为 .crt 后再安装。
          CA 服务器:/etc/pki/CA/cacert.pem  -->  客户机
          
  9)、建立安全的连接传输
      在浏览器中输入协议为 https://www.a.com 即可。至此,基本的配置已完成。
httpd-2.4基本应用(03)
  回顾:
  http协议基础,httpd2.2的基础配置
      http协议:请求<-->响应
      request:
          <method> <URL> <version>
          <HEADER>
          <entity>
      response
          <version> <status code> <reason phrase>
          <HEADERS>
          <entity>
  请求方法:GET, HEAD, POST, PUT, DELETE, OPTIONS, TRACE, ...
  httpd-2.2基本配置
      mod_deflate 模块:页面压缩之后再传输的
      User/Group
      https(tcp/443)的实现
  命令工具:curl,ab
  课外作业:理解ab命令执行结果所输出信息的意义
  httpd的基本应用(3)
  httpd-2.4
  新特性:
      (1)MPM支持运行为DSO机制,以模块形式按需加载
      (2)event MPM生产环境可用
      (3)异步读写机制
      (4)支持每模块及每目录的单独日志级别定义
      (5)每请求相关的专用配置
      (6)增强版的表达式分析器
      (7)毫秒级持久连接时长定义
      (8)基于FQDN的虚拟主机也不再需要NameVirtualHost指令
      (9)新指令,AllowOverrideList
      (10)支持用户自定义变量
      (11)更低的内存消耗
  新模块:
      (1)mod_proxy_fcgi        //Fastcgi
      (2)mod_proxy_scgi        //SCGI
      //(3)mod_proxy_express
      (3)mod_remoteip        //基于IP的访问控制
  安装httpd-2.4
  依赖于apr-1.4+, apr-util-1.4+, [apr-iconv]
      apr: apache portable runtime(虚拟机)
     
在CentOS 6编译安装:
      默认安装的是:apr-1.3.9, apr-util-1.3.9
  开发环境包组:Development Tools, Server Platform Development
  开发程序包:pcre-devel
  编译安装步骤:
  (1)apr-1.4+
      # ./configure --prefix=/usr/local/apr
      # make && make install
  (2)apr-util-1.4+
      # ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
      # make && make install
  (3)httpd-2.4
      # ./configure --prefix=/usr/local/apache24 --sysconfdir=/etc/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork
      # make && make install
  各配置选项简单说明
  --prefix=??            //指明程序安装目录
  --sysconfdir=??        //指明程序配置文件目录
  --enable-so            //支持DSO机制
  --enable-ssl            //支持SSL功能
  --enable-cgi            //支持CGI功能
  --enable-rewrite        //支持URL重写
  --enable-zlib            //提供压缩库,可以让页面压缩后发送和接收
  --with-pcre            //支持perl扩展的正则表达式模式,提供更强大的模式分析
  --with-apr=/usr/local/apr                    //指明依赖的模块
  --with-apr-util=/usr/local/apr-util        //指明依赖的模块
  --enable-modules=most                            //有三种方式给定,most|all|[模块列表]
  --enable-mpms-shared=all            //把三个模块都编译出来
  --with-mpm=prefork                    //指明默认工作模块
  --with-??             //依赖于哪些程序包的
  --without-??         //不依赖于哪些程序包的
  --enable-??        //启用哪些特性
  --disable-??        //启用或禁用哪些特性的
  不写 "=" 也就是不指明,它会到默认位置找
  CentOS 6演示编译安装httpd服务过程
  先将rpm包安装的程序停止运行,再确保开机不会自动启动
  [iyunv@localhost ~]# service httpd stop
  Stopping httpd:                                            [  OK  ]
  [iyunv@localhost ~]# chkconfig httpd off
  1安装开发环境
  [iyunv@localhost ~]# yum -y groupinstall "Development Tools" "Server Platform Development"
  ...
  [iyunv@localhost ~]# yum -y install pcre-devel
  ...
  2准备程序包,并编译安装
  1)编译安装apr
  [iyunv@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
  [iyunv@localhost ~]# tar xf apr-1.5.0.tar.bz2
  [iyunv@localhost ~]# cd apr-1.5.0
  [iyunv@localhost apr-1.5.0]# ./configure --prefix=/usr/local/apr
  ...
  [iyunv@localhost apr-1.5.0]# make && make install
  ..
  2)编译安装apr-util
  [iyunv@localhost apr-1.5.0]# cd
  [iyunv@localhost ~]#
  [iyunv@localhost ~]# tar xf apr-util-1.5.3.tar.bz2
  [iyunv@localhost ~]# cd apr-util-1.5.3
  [iyunv@localhost apr-util-1.5.3]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
  ...
  [iyunv@localhost apr-util-1.5.3]# make && make install
  ...
  3)编译安装httpd
  [iyunv@localhost ~]# tar xf httpd-2.4.10.tar.bz2
  [iyunv@localhost ~]# cd httpd-2.4.10
  [iyunv@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
  ...
  [iyunv@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 的命令
  [iyunv@localhost ~]# /usr/local/apache24/bin/apachectl start
  再或者将这个程序文件加入环境变量
  注意:一定要添加在最左边,要比原有rpm包安装的bin程序先执行
  [iyunv@localhost ~]# export PATH=/usr/local/apache24/bin:$PATH
  [iyunv@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
  编辑配置文件使永久生效
  [iyunv@localhost ~]# vim /etc/profile.d/httpd.sh
  export PATH=/usr/local/apache24/bin:$PATH
  5导出头文件
  [iyunv@localhost ~]# ln -sv /usr/local/apache24/include /usr/include/httpd
  `/usr/include/httpd/include' -> `/usr/local/apache24/include'
  6导出库文件(这里并没有导出,可能是其他原因,但方法是正确的)
  [iyunv@localhost ~]# vim /etc/ld.so.conf.d/httpd.conf
  /usr/local/apache24/lib
  [iyunv@localhost ~]# ldconfig -v        //系统重新生成缓存
  7实现脚本启动
  1)自带的服务控制脚本:apachectl(同样需要加入环境变量)
  2)如果要实现开机自动启动,可直接复制现有httpd-2.2的脚本控制文件副本,进行修改即可
  [iyunv@localhost ~]# cd /etc/rc.d/init.d
  [iyunv@localhost init.d]# cp httpd httpd24
  [iyunv@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)配置开机自启动
  [iyunv@localhost init.d]# chkconfig --add httpd24
  [iyunv@localhost init.d]# chkconfig --list httpd24
  httpd24            0:off        1:off        2:off        3:off        4:off        5:off        6:off
  [iyunv@localhost init.d]# chkconfig --level 35 httpd24 on
  [iyunv@localhost init.d]# chkconfig --list httpd24
  httpd24            0:off        1:off        2:off            3:on    4:off        5:on        6:off
  4)查看运行状态
  [iyunv@localhost init.d]# service httpd24 status
  httpd (pid  32677) is running...
  至此,手动修改的控制脚本已经完成。
在CentOS 7安装:
  直接通过yum安装
      # yum install httpd
  配置文件:
      /etc/httpd/conf/httpd.conf            //主配置文件
      /etc/httpd/conf.modules.d/*.conf            //模块配置文件
      /etc/httpd/conf.d/*.conf        //配置文件的组成部分
  配置应用:
  (1)切换使用的MPM
      编辑配置文件/etc/httpd/conf.modules.d/00-mpm.conf,启用要启用的MPM相关的LoadModule指令即可
  (2)基于IP的访问控制
  允许所有主机访问:Require all granted
  拒绝所有主机访问:Require all deny
  控制特定的IP访问
      Require ip IPADDR: 授权指定来源的主机访问
      Require not ip IPADDR:拒绝
  控制特定的主机访问
      Require host HOSTNAME:授权指定来源的主机访问
      Require not host HOSTNAME:拒绝
          HOSTNAME:
              FQDN:特定主机
              domin.tld : 指定域名下的所有主机
  示例:
  允许所有主机访问
      <RequireAll>
          Require all granted
          Require not ip 172.16.100.2
      </RequireAll>
  (3)虚拟主机
  httpd-2.4基于FQDN的虚拟主机也不再需要NameVirutalHost指令
  <VirtualHost *:80>
      ServerName wordpress.stu1.com
      DocumentRoot "/web/vhosts/wordpress"
      Errorlog /web/vhosts/wordpress/logs/error_log                    //好像要给全路径
      CustomLog /web/vhosts/wordpress/logs/access_log common        //好像要给全路径
      <Directory "/web/vhosts/wordpress">
          Options None
          AllowOverride None
          Require all granted
      </Directory>
  </VirtualHost>
  只有明确授权才能被访问
  注意:任意目录下的页面只有显式授权才能被访问
  (4)ssl
  (5)KeepAliveTimeout #ms
      毫秒级持久连接时长定义
  练习题:分别使用httpd-2.2和httpd-2.4实现;
  1、建立httpd服务,要求:
  (1)提供两个基于名称的虚拟主机:
      www1.stuX.com,页面文件目录为/web/vhosts/www1;错误日志为/var/log/httpd/www1/error_log,访问日志为/var/log/httpd/www1/access_log;
      www2.stuX.com,页面文件目录为/web/vhosts/www2;错误日志为/var/log/httpd/www2/error_log,访问日志为/var/log/httpd/www2/access_log;
  (2)通过www1.stuX.com/server-status输出其状态信息,且要求只允许提供账号的用户访问;
  (3)www1不允许192.168.1.0/24网络中的主机访问;
  2、为上面的第2个虚拟主机提供https服务,使得用户可以通过https安全的访问此web站点;
  (1)要求使用证书认证,证书中要求使用国家(CN),州(Beijing),城市(Beijing),组织为(MageEdu);
  (2)设置部门为Ops, 主机名为www2.stuX.com
lamp基础应用入门(04)
  LAMP
  a: apache(httpd)
  m: mysql,mariadb
  p: php,perl,python
  WEB资源类型:
      静态资源:原始形式与响应内容一致
      动态资源:原始形式通常为程序文件,需要在服务器端执行之后,将执行结果返回给客户端
      客户端技术:javascript
      服务器端技术:php,jsp
      application/x-http-php
  CGI: Common Gateway Interface
      可以让一个客户端,从网页浏览器向执行在网络服务器上的程序请求数据,CGI描述了客户端和服务器程序之间传输的一种标准
      响应用户的请求,管理后端的应用程序进程
  程序=指令+数据
      数据模型:
          层次模型
          网状模型
          关系型模型:表(行+列)
      关系型模型:IngreSQL, Oracle, Sybase, Infomix, DB2(IBM), SQL Server,MySQL, PostgreSQL, MariaDB
      指令:代码文件
      数据:数据存储系统、文件
  请求流程:
      Client --(httpd)--> httpd –-(cgi)--> application server (program file) –-(mysql) -->     mysql
  php:脚本编程语言、嵌入到html中的嵌入式web程序开发语言
  基于zend编译成opcode(二进制格式的字节码,重复运行,可省略编译环境)
  关于PHP
  一、PHP简介
  PHP是通用服务器端脚本编程语言,其主要用于web开发以实现动态web页面,它也是最早实现将脚本嵌入HTML源码文档中的服务器端脚本语言之一。同时,php还提供了一个命令行接口,因此,其也可以在大多数系统上作为一个独立的shell来使用。
  Rasmus Lerdorf于1994年开始开发PHP,它是初是一组被Rasmus Lerdorf称作"Personal Home Page Tool"的Perl脚本,这些脚本可以用于显示作者的简历并记录用户对其网站的访问。后来,Rasmus Lerdorf使用C语言将这些Perl脚本重写为CGI程序,还为其增加了运行Web forms的能力以及与数据库交互的特性,并将其重命名为"Personal Home Page/Forms Interpreter"或"PHP/FI"。此时,PHP/FI已经可以用于开发简单的动态web程序了,这即是PHP 1.0。1995年6月,Rasmus Lerdorf把它的PHP发布于comp.infosystems.www.authoring.cgi Usenet讨论组,从此PHP开始走进人们的视野。1997年,其2.0版本发布。
  1997年,两名以色列程序员Zeev Suraski和Andi Gutmans重写的PHP的分析器(parser)成为PHP发展到3.0的基础,而且从此将PHP重命名为PHP: Hypertext Preprocessor。此后,这两名程序员开始重写整个PHP核心,并于1999年发布了Zend Engine 1.0,这也意味着PHP 4.0的诞生。2004年7月,Zend Engine 2.0发布,由此也将PHP带入了PHP 5时代。PHP5包含了许多重要的新特性,如增强的面向对象编程的支持、支持PDO(PHP Data Objects)扩展机制以及一系列对PHP性能的改进。
  二、PHP Zend Engine
  Zend Engine是开源的、PHP脚本语言的解释器,它最早是由以色列理工学院(Technion)的学生Andi Gutmans和Zeev Suraski所开发,Zend也正是此二人名字的合称。后来两人联合创立了Zend Technologies公司。
  Zend Engine 1.0于1999年随PHP 4发布,由C语言开发且经过高度优化,并能够做为PHP的后端模块使用。Zend Engine为PHP提供了内存和资源管理的功能以及其它的一些标准服务,其高性能、可靠性和可扩展性在促进PHP成为一种流行的语言方面发挥了重要作用。
  Zend Engine的出现将PHP代码的处理过程分成了两个阶段:首先是分析PHP代码并将其转换为称作Zend opcode的二进制格式(类似Java的字节码),并将其存储于内存中;第二阶段是使用Zend Engine去执行这些转换后的Opcode。
  三、PHP的Opcode
  Opcode是一种PHP脚本编译后的中间语言,就像Java的ByteCode,或者.NET的MSL。PHP执行PHP脚本代码一般会经过如下4个步骤(确切的来说,应该是PHP的语言引擎Zend):
  1、Scanning(Lexing) ——将PHP代码转换为语言片段(Tokens)
  2、Parsing ——将Tokens转换成简单而有意义的表达式
  3、Compilation ——将表达式编译成Opocdes
  4、Execution ——顺次执行Opcodes,每次一条,从而实现PHP脚本的功能
  扫描-->分析-->编译-->执行
  四、php的加速器
  基于PHP的特殊扩展机制如opcode缓存扩展也可以将opcode缓存于php的共享内存中,从而可以让同一段代码的后续重复执行时跳过编译阶段以提高性能。由此也可以看出,这些加速器并非真正提高了opcode的运行速度,而仅是通过分析opcode后并将它们重新排列以达到快速执行的目的。
  常见的php加速器有:
  1、APC (Alternative PHP Cache)
      遵循PHP License的开源框架,PHP opcode缓存加速器,目前的版本不适用于PHP 5.4。项目地址,http://pecl.php.net/package/APC。
  2、eAccelerator
      源于Turck MMCache,早期的版本包含了一个PHP encoder和PHP loader,目前encoder已经不在支持。项目地址, http://eaccelerator.net/。
  3、XCache
      快速而且稳定的PHP opcode缓存,经过严格测试且被大量用于生产环境。项目地址,http://xcache.lighttpd.net/
  4、Zend Optimizer和Zend Guard Loader
      Zend Optimizer并非一个opcode加速器,它是由Zend Technologies为PHP5.2及以前的版本提供的一个免费、闭源的PHP扩展,其能够运行由Zend Guard生成的加密的PHP代码或模糊代码。而Zend Guard Loader则是专为PHP5.3提供的类似于Zend Optimizer功能的扩展。项目地址,http://www.zend.com/en/products/guard/runtime-decoders
  5、NuSphere PhpExpress
      NuSphere的一款开源PHP加速器,它支持装载通过NuSphere PHP Encoder编码的PHP程序文件,并能够实现对常规PHP文件的执行加速。项目地址,http://www.nusphere.com/products/phpexpress.htm
  五、PHP源码目录结构
  PHP的源码在结构上非常清晰。其代码根目录中主要包含了一些说明文件以及设计方案,并提供了如下子目录:
  1、build ——顾名思义,这里主要放置一些跟源码编译相关的文件,比如开始构建之前的buildconf脚本及一些检查环境的脚本等。
  2、ext ——官方的扩展目录,包括了绝大多数PHP的函数的定义和实现,如array系列,pdo系列,spl系列等函数的实现。个人开发的扩展在测试时也可以放到这个目录,以方便测试等。
  3、main ——这里存放的就是PHP最为核心的文件了,是实现PHP的基础设施,这里和Zend引擎不一样,Zend引擎主要实现语言最核心的语言运行环境。
  4、Zend —— Zend引擎的实现目录,比如脚本的词法语法解析,opcode的执行以及扩展机制的实现等等。
  5、pear —— PHP 扩展与应用仓库,包含PEAR的核心文件。
  6、sapi ——包含了各种服务器抽象层的代码,例如apache的mod_php,cgi,fastcgi以及fpm等等接口。
  7、TSRM —— PHP的线程安全是构建在TSRM库之上的,PHP实现中常见的*G宏通常是对TSRM的封装,TSRM(Thread Safe Resource Manager)线程安全资源管理器。
  8、tests —— PHP的测试脚本集合,包含PHP各项功能的测试文件。
  9、win32 ——这个目录主要包括Windows平台相关的一些实现,比如sokcet的实现在Windows下和*Nix平台就不太一样,同时也包括了Windows下编译PHP相关的脚本。
  LAMP:
  httpd:接收用户的web请求,静态资源则直接响应,动态资源为php脚本,对此类资源的请求交由php来运行
  php:运行php程序
  MariaDB:数据管理系统
  http与php结合的方式:
      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";
  ?>
DSC00018.png

  实践作业:部署lamp,以虚拟主机安装wordpress,phpwind,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)
  回顾:httpd,lamp
  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.4中mod_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:持久性:事务完成后,结果一定是要持久的
DSC00019.png

  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
  经典案例:
  [iyunv@localhost ~]# useradd -r mysql
  [iyunv@localhost ~]# ls
  anaconda-ks.cfg  mariadb-5.5.46-linux-x86_64.tar.gz
  [iyunv@localhost ~]# tar xf mariadb-5.5.46-linux-x86_64.tar.gz -C /usr/local/
  [iyunv@localhost ~]# cd /usr/local
  [iyunv@localhost local]# ln -sv mariadb-5.5.46-linux-x86_64 mysql
  'mysql' -> 'mariadb-5.5.46-linux-x86_64'
  [iyunv@localhost local]# cd mysql
  [iyunv@localhost mysql]# chown -R root:mysql ./*
  [iyunv@localhost mysql]# mkdir -pv /mydata/data
  mkdir: created directory '/mydata'
  mkdir: created directory '/mydata/data'
  [iyunv@localhost mysql]# chown mysql:mysql /mydata/data
  [iyunv@localhost mysql]# mv /etc/my.cnf /etc/my.cnf.libs
  [iyunv@localhost mysql]# cp support-files/my-large.cnf /etc/my.cnf
  [iyunv@localhost mysql]# vim /etc/my.cnf
  datadir = /mydata/data
  innodb_file_per_table = ON
  skip_name_resolve = ON
  [iyunv@localhost mysql]# scripts/mysql_install_db --user=mysql --datadir=/mydata/data
  [iyunv@localhost mysql]# cp support-files/mysql.server /etc/init.d/mysqld
  [iyunv@localhost mysql]# chkconfig --add mysqld
  [iyunv@localhost mysql]# service mysqld start
  [iyunv@localhost mysql]# cd
  [iyunv@localhost ~]# vim /etc/profile.d/mysqld.sh
  export PATH=/usr/local/mysql/bin:$PATH
  [iyunv@localhost ~]# source /etc/profile.d/mysqld.sh
mariadb的核心DDL语句(03)
  回顾:MariaDB的基础
  关系:二维关系:表(行、列)
  设计范式:
      第一范式:字段是原子性的
      第二范式:存在可用主键
      第三范式:任何表都不应该依赖于其它表的非主属性
  约束:主键、唯一键约束、检查性约束
  MariaDB安装方式
      包管理器(rpm,deb)
      通用二进制格式
      源码编译安装
  SQL:
      数据库、表、索引、视图、存储过程、存储函数、触发器、事件调度器、用户和权限
      元数据:mysql
  DDL、DML
  DDL:CREATE, 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;': 连接至服务器并让其执行此命令后直接返回。
  [iyunv@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
  [iyunv@localhost ~]#
  [iyunv@localhost ~]# mysql -e 'SHOW DATABASES;'
  +--------------------+
  | Database           |
  +--------------------+
  | information_schema |
  | mysql              |
  | performance_schema |
  | test               |
  +--------------------+
  [iyunv@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
  在本机修改密码:
  [iyunv@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时,一定要查看httpd的mpm模块是哪个?如果是进程式的prefork,php编译出来的是进程式的模块的php5,
          如果httpd的mpm是work或event模型,php5应该编译成php5-zts模块。这两者是不通用的
          如果是prefork模型,并且再编译了php,此时如果把prefork换成worker或event是不可以的,因为php不兼容,
          php以模块化方式编译成httpd的模块时,它以httpd的mpm类型相关,
          进程式的mpm和线程式的mpm它们所使用的php模块是互不兼容的
      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)支持worker和event,线程模式。
      # ./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无限制
DSC00020.png

  默认所有人
DSC00021.png

DSC00022.png

  虚拟主机定义
DSC00023.png

  编译安装lamp
      httpd: 编译安装,httpd-2.4
      php5: 编译安装,php-5.4
      mariadb: 通用二进制格式,mariadb-5.5
      注意:任意一个程序包被编译操作依赖到时,需要安装此程序包的"开发组件",其包名一般类似
lamp组合的其它话题(02)
  并发级别
DSC00024.png

  安装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模块装载
  [iyunv@localhost ~]# httpd -M | grep fcgi
  proxy_fcgi_module (shared)
  查看模块加载文件中有fcgi模块加载配置
  [iyunv@localhost ~]# cat /etc/httpd/conf.modules.d/00-proxy.conf | grep fcgi
  LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
  添加配置文件,检查语法
  [iyunv@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
  [iyunv@localhost ~]# httpd -t
  Syntax OK
  在默认路径下提供测试页面
  [iyunv@localhost ~]# vim /var/www/html/index.php
  <?php
      phpinfo();
  ?>
  启动php-fpm
  [iyunv@localhost ~]# systemctl start php-fpm.service
  启动httpd
  [iyunv@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/*
DSC00025.png

DSC00026.png

      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
                  ...
DSC00027.png

DSC00028.png

                  DSC00029.png
DSC00030.png 删除保留的认可的主机

DSC00031.png

DSC00032.png

  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
  基于密钥的认证配置过程
  在本地主机生成一对儿密钥
  [iyunv@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     |
  |   + +   ...=    |
  |           +..   |
  |            ..   |
  +-----------------+
  在本地主机上,将公钥复制到要登录的远程主机的某用户的家目录下的特定文件中
  [iyunv@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.
  测试登录
  [iyunv@localhost ~]# ssh root@172.16.1.22
  Last login: Tue Feb  2 18:06:32 2016 from 192.168.137.1
  [iyunv@localhost ~]# exit
  logout
  Connection to 172.16.1.22 closed.
DSC00033.png

DSC00034.png

DSC00035.png

DSC00036.png

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上,默认为启动状态
               DSC00037.png
          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的会话应该是: 短连接,其实长短链接都支持,
              只要是服务器,并同时支持多个用户连接的,应该考虑
DSC00038.png

DSC00039.png 改为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、基于口令认证时,使用强密码策略
              # 不使用易猜测的密码
DSC00040.png

      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:
DSC00041.png                 syslogd: system系统各应用程序日志

                  klogd: kernel日志
              事件格式较为简单时,可统一由syslog进行记录
                  事件产生的日期时间    主机    进程[pid]    :事件内容
              支持C/S架构: 可通过UDP或TCP协议提供日志记录服务
              rsyslog:
                  syslogd
                  klogd
                  特性:
                      多线程:并发性更好
                      UDP, TCP, SSL, TLS, RELP
                      存储日志信息于MySQL, PGSQL, Oralce等数据管理系统
                      强大的过滤器,可实现过滤日志信息中任何部分的内容
                      自定义输出格式
              elk stack:    elasticsearch,强大的日志搜索引擎
                                  logstash,收集日志,并导入到elasticsearch
                                  kibana,更加美观的展示出来
      rsyslog日志收集器重要术语:
          facility: 设施,从功能或程序上对日志收集进行分类
              auth,跟认证相关的日志信息
              authpriv,
              cron,
              daemon,
              kern,
              lpr,打印系统相关
              mail,
              mark,
              news,
              security,安全相关
              user,
              uucp,
              local0-local7,用户自定义到某一系统使用
              syslog
          priority: 优先级,日志级别
              debug,
              info,
              notice,
              warn(warning),
              err(error),
              crit(critical),
              alert,
              emerg(panic)
              指定级别
                  *: 所有级别
                  none: 没有级别
                  priority: 此级别及更高级别的日志信息
                  =priority:仅此级别
          facility.priority    /var/log/messages
  程序环境:
      主程序:rsyslogd
      主配置文件:/etc/rsyslog.conf, /etc/rsyslog.d/*.conf
      服务脚本(CentOS 6):/etc/rc.d/init.d/rsyslog
      Unit File(CentOS 7): /usr/lib/systemd/system/rsyslog.service
      配置文件格式:rsyslog.conf
          MOUDULES
          GLOBAL DRICTIVES
          RULES
      RULES:
          facility.priority     target
          target:
              文件路径:记录日志事件于指定的日志文件中,通常应该在/var/log目录下,文件路径前的"-"表示异步写入
              用户:将日志通知给指定用户,用户是通过将信息发送给登录到系统上的用户的终端进行的
              *: 所有用户
              日志服务器:@host, 把日志送往指定的服务器主机
                  host: 即日志服务器地址,必须要监听在tcp或udp协议514端口上提供服务;
              管道: |COMMAND
          文件记录的日志的格式
              事件产生的日期时间     主机     进程(pid): 事件内容
          其他日志记录二进制格式:/var/log/wtmp, /var/log/btmp
              /var/log/wtmp: 当前系统上成功登录的日志信息
                  查看该日志的专用命令: last
              /var/log/btmp: 当前系统尝试登录系统失败的日志
                  查看该日志的专用命令: lastb
              lastlog命令:显示当前系统每一个用户最近一次的登录时间
              /var/log/dmesg: 记录系统引导过程中的日志信息
                  也可以使用dmesg命令进行查看
      rsyslog服务器
          # Provides UDP syslog reception
          $ModLoad imudp
          $UDPServerRun 514
          # Provides TCP syslog reception
          $ModLoad imtcp
          $InputTCPServerRun 514
      配置记录日志于mysql中:
          (1)于MySQL服务器: 准备好MySQL服务器,创建用户,授权对Syslog数据库的全部访问权限
          (2)于rsyslog主机: 安装rsyslog-mysql程序包
          (3)于rsyslog主机: 通过导入createDB.sql脚本创建依赖到的数据库及表
              # mysql -uUSERNAME -hHOST -pPASSWORD < /usr/share/doc/rsyslog-mysql-VERSION/createDB.sql
          (4) 配置rsyslog使用ommysql模块
              #### MODULES ####
              $ModLoad ommysql
              #### RULES ####
              facility.priority     :ommysql:DBHOST,DB,DBUSER,DBUSERPASS
              注意: 重启rsyslog服务
          (5) 安装loganalyzer
              (a) 配置webserver, 支持php
                  # yum install httpd php php-mysql php-gd
                  # service httpd start
              (b) loganalyzer
                  # cp -r loganalyzer-3.6.5/src /var/www/html/loganalyzer
                  # cp loganalyzer-3.6.5/contrib/*.sh /var/www/html/loganalyzer
                  # cd /var/www/html/loganalyzer
                  # chmod +x *.sh
                  # ./configure.sh
                  # ./secure.sh
                  # chmod 666 config.php
DSC00042.png

DSC00043.png

          (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
  认证服务:
DSC00044.png

  nsswitch: name service switch
  以database为中心
      通用框架,与各种类型存储进行交互的公共实现
      实现: /usr/lib64/libnss*, /lib64/libnss*
          框架: libnss
          驱动: libnss_file
      为每一种用到解析库的应用通过配置定义其位置
          /etc/nsswitch.conf
              db: store1 store2 ...
              例如:
                  passwd: files
                  hosts: files dns
          解析库:
              文件、关系型数据管理系统(MySQL)、NIS、LDAP、DNS
          每种存储中查找的结果状态
              STATUS => success | notfound | unavail | tryagain
          对应于每种状态参数的行为
              ACTION => return | continue
          例如:
              host: files nis [NOTFOUND=return] dns
          getent命令:
          # getent database [key]
              主要从ns库中查找
               DSC00045.png
  pam:pluggable authentication module
      主要是提供安全认证的
      以应用程序为中心
      认证库:存储
          多种类型的存储: 文件(默认在文件中)、关系型数据管理系统(MySQL)、LDAP、NIS
          pam: 也是一种通用框架,提供了与各种类型存储进行交互的公共实现,以及多种辅助类的功能:
              它的文件放置位置/lib64/security/*.so
      配置文件: 为了各种调用了pam的应用提供其专用配置
          通用配置文件: /etc/pam.conf 可为每一种调用pam完成认证功能的应用程序提供配置
          专用配置文件: /etc/pam.d/* 通常专用于为某种特定的应用程序提供配置
              通常每个应用使用一个单独的配置文件,每行定义一种检查规则
      配置文件格式:
          通用配置文件:
              application    type     control     module-path module-arguments
          专用配置文件:
              type    control    module-path        module-arguments
          type:检查的功能类别
              auth: 账号的认证和授权
              account:与账号管理相关的非认证功能
              password:用户修改密码时密码检查规则
              session:用户获取到服务之前或使用服务完成之后要进行的一些附加性操作
          control:同一种功能的多个检查之间如何进行组合;
              control有两种实现机制:
              1、简单实现:使用一个关键词来定义;例如sufficient,required, requisite;
              2、使用一或多个"status=action"形式的组合表示
              简单机制:
              required        必须通过检查,否则,即为失败,无论成功还是失败,都需要继续由后续同种功能的其它模块检查
              requisite    一票否决,检测失败就直接返回失败,检测成功,则由由后续同种功能的其它模块进行检查
              sufficient    一票通过,检测成功就直接返回成功,检测失败,则由由后续同种功能的其它模块进行检查
              optional        可选的,参考性控制机制
              include        调用其它配置文件中的同种功能的检测机制
              复杂机制:
              [status1=action1,status2=action2,....]
              status:返回状态,
              action: 采取的行为,比如ok, done, die, ignore, bad, reset, ...
          module-path: 模块文件路径
              相对路径:相对于/lib64/security/目录而言。: 此目录下的模块引用时可使用相对路径;
              绝对路径: 可位于任何可访问路径
          module-arguments: 模块的专用参数
  模块示例:
  (1) pam_shells.so
  (2) pam_limits.so 资源限制
      在用户级别实现对其可使用的资源的限制,例如可打开的文件数量,可运行的进程数量,可用内存空间。
  修改限制的实现方式:
  (1)ulimit命令
  (2)配置文件: /etc/security/limits.conf, /etc/security/limits.d/*.conf
      模块通过读取配置文件完成用户对系统资源的使用控制
  配置文件: 每行一个定义:
      <domain> <type> <item> <value>
          <domain>: 应用于哪些对象
              username        用户
              @group        组
              *: 所有用户    统配机制
          <type>: 限制的类型
              soft: 软限制,普通用户自己可以修改,可以超出,但最大不能超出硬限制
              hard: 硬限制,由root用户设定,且通过kernel强制生效
              -: 二者同时限定
          <item>: 限制的资源类型
              nofile: 所能够同时打开的最大文件数量,默认是1024
              nproc: 所能够同时运行的进程的最大数量,默认是1024
              msqqueue: 使用的POSIX消息队列能够占用的最大内存空间;
              sigpending: 所能够使用的最大信号数量;
          <value>
  例如:nginx        -        nofile        30000
  nginx用户能同时打开的最大文件数量是三万个
  ulimit命令: 只能用于调整软限制
      -n # : 最多的打开的文件描述个数
      -u # : 最大用户进程数
      -S 使用'soft' (软)资源限制
      -H 使用'hard'(硬)资源限制
  课外作业:分开实现
      (1) 限制centos用户只能够在worktime通过ssh远程连接本机。时间限定
      (2) 限制只有distro组内的用户可通过ssh连接到本机。
DSC00046.png

2016/01/22
01
  运维
  1、资源的合理分配
  2、标准化,制定规则,数据的正常存储和高效传输
  3、自动化,服务的可用性和性能
  资源利用率
  脚本可以提高保证
  脚本,
  结果导向
  主要用到的场景是公司内部使用,
  FTP
      早期三大网络应用之一ftp(40年) http mail
      ftp file transfer protocol
      文件传输协议
  C/S模型
  客户端服务器
  FTP采用双TCP连接方式
      控制连接使用TCP端口号21
      数据连接使用TCP端口号20
DSC00047.png

  新起的连接需要重新建立三次握手的
DSC00048.png

  控制端口加+1
DSC00049.png











  [iyunv@localhost ~]# yum -y install vsftpd
  [iyunv@localhost ~]# whereis vsftpd
  vsftpd: /usr/sbin/vsftpd /etc/vsftpd /usr/share/man/man8/vsftpd.8.gz
  [iyunv@localhost ~]# vim /etc/vsftpd/vsftpd.conf



  把虚拟用户映射到本地用户





  首先建立文本文件包含账号信息的
  然后把文本文件的格式转换成能让安全机制认识的文件
  让ftp支持这种认证机制 pam
  /etc/pam.d/vsf



  匿名用户
  本地用户
  虚拟用户
NFS


  但现在用的也不多了

  上规模的都用分布式文件系统
  文件共享服务
  网络文件系统,只能在



  至少存储6份

  把一个目录通过本机共享出去,这个目录的权限是

  监听2049端口









  最好自己写挂载脚本,,如果服务端出问题了,也能正常启动


  dns服务器能解析两个地址,提供健康检测,如果不能检测,要把dns记录删除,再reload
  提供wEB服务,
  通过共享挂载提供wordpress服务

  mysql每天要有一次备份
  ~]# yum install nfs-utils portmap
samba






  日志信息
  把日志收集好
  系统盘
  数据盘
  系统日志
  服务日志
  app日志




2016/01/23
包过滤防火墙基础(01)
  iptables: 包过滤型的防火墙
  Firewall:防火墙,隔离工具:工作于主机或网络边缘,对于进出本主机或本网络的报文根据事先定义的检查规则作匹配检测,对于能够被规则匹配到的报文作出相应处理的组件
      主机防火墙
      网络防火墙
      软件防火墙(软件逻辑)
      硬件防火墙(硬件和软件逻辑)


  Identification Fragment ID 拆封标记
  URG 紧急指针表示  Urgent Pointer,有效,紧急发送的
  RST 重置有风险
  Checksum 重新校验与该位做对比


  OpenBSD号称最安全的系统
  ipfw(firewall framework)
  kernel 2.2 ipchains(firewall framework)内核空间写规则的工具
  kernel 2.4 iptables(netfilter)
      netfilter: kernel
      iptables: rules nutil
      hook function(钩子函数)
          input
          output
          forword
          frerouting
          postrouting
  每个门称为链
  链(内置):
      PREROUTING
      INPUT
      FORWARD
      OUTPUT
      POSTROUING
  功能:
      filter: 过滤,防火墙
      nat: network address translation,用于修改源IP或目标IP,也可以改端口;
      mangle: 拆解报文,做出修改,并重新封装起来。
      raw: 关闭nat表上启用的连接追踪机制


  以功能划分
  功能<--链
  raw: PREROUTING, OUTPUT
  mangle: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
  nat:
      CentOS 6: PREROUTING, OUTPUT, POSTROUTING
      CentOS 7: PREROUTING, INPUT, OUTPUT, POSTROUTING
  filter: INPUT, FORWARD, OUTPUT
  报文流向:
      流入本机: PREROUTING --> INPUT
      由本机流出: OUTPUT --> POSTROUTING
      转发: PREROUTING --> FORWARD --> POSTROUTING
  路由功能发生的时刻
      报文进入本机后:
          判断目标主机是?
      报文离开本机之前:
          判断经由哪个接口送往下一站?
iptables基础应用(02)
  iptables/netfilter
  规则:
      组成部分:根据规则匹配条件来尝试匹配报文,一旦匹配成功,就由规则定义的处理动作作出处理
        匹配条件:

              基本匹配条件
              扩展匹配条件(/usr/lib64/xtables/小写字母.so)
          处理动作:
              基本处理动作
              扩展处理动作(/usr/lib64/xtables/大写字母.so)
              自定义处理机制
      iptables的链:内置链和自定义链。自定义链可以类型分组,以便好管理
          内置链:对应于hook function
          自定义链接:用于内置链的扩展和补充,可实现更灵活的规则管理机制。
  添加规则时的考量点:
      (1)要实现哪种功能:判断添加到哪个表上。
      (2)报文流经的路径:判断添加到哪个链上。
      链: 链上的规则次序,即为检查的次序,因此,隐含一定的应用法则
          (1)同类规则(访问同一应用),匹配范围小的放上面。
          (2)不同类的规则(访问不同应用),匹配到报文频率较大的放在上面。
          (3)将那些可由一条规则描述的多个规则合并起来。
          (4)设置默认策略。做白名单更加安全
  iptables命令:
      iptables [-t table] {-A|-C|-D} chain rule-specification
      ip6tables [-t table] {-A|-C|-D} chain rule-specification
      iptables [-t table] -I chain [rulenum] rule-specification
      iptables [-t table] -R chain rulenum rule-specification
      iptables [-t table] -D chain rulenum
      iptables [-t table] -S [chain [rulenum]]
      iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
      iptables [-t table] -N chain
      iptables [-t table] -X [chain]
      iptables [-t table] -P chain target
      iptables [-t table] -E old-chain-name new-chain-name
      rule-specification = [matches...] [target]
      match = -m matchname [per-match-options]
      target = -j targetname [per-target-options]
  规则格式:iptables [-t table] chain [-m matchname [per-match-options]] -j targetname [per-target-options]
      -t table:
          raw, mangle, nat, [filter]
      COMMAND:
          链管理:
              -N: new, 自定义一条新的规则链。
              -X: delete, 删除自定义的规则链。
              -P: Policy, 设置默认策略,对filter表中的链而言,其默认策略有:
                  ACCEPT: 接受
                  DROP: 丢弃
                  REJECT: 拒绝
              -E: 重命名自定义链,引用计数不为0的自定义链不能够被重命名,也不能被删除
          规则管理:
              -A: append, 追加规则
              -I: insert, 插入规则,要指明位置,省略时表示第一条
              -D: delete, 删除
                  (1)指明规则序号
                  (2)指明规则本身
              -R: replace, 替换指定链上的指定规则
                  (1)指明规则序号
                  (2)指明规则本身
              -F: flush, 清空指定的规则链
              -Z: zero, 置零
                  iptables的每条规则都有两个计数器
                      (1)匹配到的报文的个数
                      (2)匹配到的所有报文的大小之和
          查看:
              -L: list, 列出指定链上的所有规则 CentOS 7上nat链上多了一个
                  -n: number, 以数字格式显示地址和端口号
                  -v: verbose, 详细信息
                      -vv, -vvv
                  -x: exactly, 显示计数器结果的精确值
                  --line-numbers: 显示规则的序号
      chain:
          PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
      匹配条件
          基本匹配条件:无需加载任何模块,由iptables/netfilter自行提供
              [!] -s, --source address[/mask][,...] : 检查报文中的源ip地址是否符合此处指定的地址或范围
              [!] -d, --destination address[/mask][,...] : 检查报文中的目标ip地址是否符合此处指定的地址或范围
              [!] -p, --protocol protocol
                  protocol: tcp,udp,udplite,icmp,icmpv6,esp,ah,sctp,mh or "all"
              [!] -i, --in-interface name : 数据报文流入的接口,只能应用于数据报文流入的环节,只能应用于PREROUTING,INPUT和FORWARD链
              [!] -o, --out-interface name : 数据报文流出的接口,只能应用于数据报文流出的环节,只能应用于FORWARD,OUTPUT和POSTROUTING链
          扩展匹配条件:需要加载扩展模块,方可生效的-m
              隐式扩展: 不需要手动加载扩展模块,因为它们是对协议的扩展,所以,但凡使用-p指明了协议,就表示已经指明了要扩展的模块
                  tcp:
                      [!] --source-port,--sport port[:port] : 匹配报文的源端口,可以是端口范围
                      [!] --destination-port,--dport port[:port] : 匹配报文的目标端口,可以是端口范围
                      [!] --tcp-flags mask comp
                          mask is the flags which we should examine, written as a comma-separated list, 例如SYN,ACK,FIN,RST
                          comp is a comma-separated list of flags which must be set, 例如SYN
                              例如 "--tcp-flags SYN,ACK,FIN,RST SYN" 表示,要检查的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0
                      [!] --syn : 用于匹配第一次握手,相对于 "--tcp-flags SYN,ACK,FIN,RST SYN"
                  udp
                      [!] --source-port,--sport port[:port] : 匹配报文的源端口,可以是端口范围
                      [!] --destination-port,--dport port[:port] : 匹配报文的目标端口,可以是端口范围
                  icmp
                      [!] --icmp-type {type[/code]|typename}
                          echo-request: 8    请求报文
                              # iptables -A INPUT -d 172.16.100.67 -p icmp --icmp-type 8 -j DROP
                          echo-reply: 0    响应报文
              显式扩展: 必须要手动加载扩展模块,[-m matchname [per-match-options]]
      处理动作:
          -j targetname [per-target-options]
              ACCEPT
              DROP
              REJECT
              RETURN:返回调用链
              REDIRECT:端口重定向
              LOG: 记录日志
              MARK: 做防火墙标记
              DNAT: 目标地址转换
              SNAT: 源地址转换
              MASQUERADE: 地址伪装
              ...
              自定义链:
  防火墙(服务):
      CentOS 6:
          service iptables {start|stop|restart|status}
              start: 读取事先保存的规则,并应用到netfilter上。
              stop: 清空netfilter上的规则,以及还原默认策略等。
              status: 显示生效的规则。
              restart: 清空netfilter上的规则,再读取事先保存的规则,并应用到netfilter上。
              默认的规则文件: /etc/sysconfig/iptables
      CentOS 7:
          systemctl start|stop|restart|status| firewalld.service
          systemctl disable firewalld.service
          systemctl stop firewalld.service
  课后作业:开放本机web服务器给非192.168.0.0/24网络中的主机访问
      禁止本机被非172.16.0.0/16网络中的主机进行ping请求
      开放本机的DNS 服务给所有主机
  # iptables -t filter -F INPUT
  # iptables -t filter -A INPUT -s 172.16.100.6 -d 172.16.100.67 -p tcp --dport 22 -j DROP
  # iptables -L -nv
  # iptables -t filter -R INPUT 1 -s 172.16.100.6 -d 172.16.100.67 -p icmp -j REJECT
iptables扩展匹配(03)
  回顾:iptables/netfilter
      netfilter: kernel framework
      ipatbles: 编写规则的CLI
      四表: filter, nat, mangle, raw
      五链: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
      iptables [-t table] SUBCOMMAND [chain] [匹配条件] [-j TARGET]
          SUBCOMMAND:
              链: -N, -X, -E, -P
              规则: -A, -I, -D, -R, -F, -Z
              查看: -L
                  -n, -v, -x, --line-number
          匹配条件:
              基本匹配: -s, -d, -p, -i, -o
              扩展匹配:
                  隐式扩展: [-m]
                      tcp: --dport, --sport, --tcp-flags, --syn
                      udp: --dport, --sport
                      icmp: --icmp-type
                          echo-request, 8
                          echo-reply, 0
                  显式扩展: -m
  小写字母规则扩展
  iptables(2)
  显式扩展: 必须显式地指明使用的扩展模块进行的扩展
      使用帮助:
          CentOS 6: man iptables
          CentOS 7: man iptables-extensions
  1、multiport扩展
      以离散方式定义多端口匹配,最多指定15个端口
      [!] --source-ports,--sports port[,port|,port:port]... : 指定多个源端口
      [!] --destination-ports,--dports port[,port|,port:port]... : 指定多个目标端口
      [!] --ports port[,port|,port:port]... : 指明多个端口
  示例
      # iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp -m multiport --dports 22,80 -j ACCEPT
  任何drop的规则,可以事先写一个脚本,定义一个时间后恢复正常策略
  2、iprange扩展
      指明连续的(但一般不指整个网络)ip地址范围
      [!] --src-range from[-to] : 源IP地址
      [!] --dst-range from[-to] : 目标IP地址
  示例
      # iptables -A INPUT -d 172.16.100.67 -p tcp --dport 80 -m iprange --src-range 172.16.100.5-172.16.100.10 -j DROP
  3、string扩展
  对报文中的应用层数据做字符串模式匹配检测,不是正则表达式中的模式,而是使用专用的算法
      --algo {bm|kmp} : 字符串匹配检测算法
          bm = Boyer-Moore, kmp = Knuth-Pratt-Morris
      [!] --string pattern : 要检测的字符串模式
      [!] --hex-string pattern : 要检测的字符串模式,16进制格式
  示例
      # iptables -A INPUT -p tcp --dport 80 -m string --algo bm --string 'GET /index.html' -j LOG
      # iptables -A OUPUT -s 172.16.100.67 -d 172.16.0.0/16 -p tcp --sport 80 -m string --algo bm --string "string" -j REJECT
  4、time扩展
  根据将报文到达的时间与指定的时间范围进行匹配,彼此间是与逻辑,都要匹配才可以
      --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
      --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
      --timestart hh:mm[:ss]
      --timestop hh:mm[:ss]
      [!] --monthdays day[,day...]
      [!] --weekdays day[,day...]
      --kerneltz : 使用内核上的时区,而非UTC
  示例
      # iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -j DROP
  5、connlimit扩展
  根据每客户端IP做并发连接数数量匹配
      --connlimit-upto n : 连接的数量小于等于n时匹配
      --connlimit-above n : 连接的数量大于n时匹配
  示例
      # iptables -A INPUT -d 172.16.100.67 -p tcp --dport 21 -m connlimit --connlimit-above 2 -j REJECT
  6、limit扩展
  基于收发报文的速率做匹配
      令牌桶过滤器
          峰值速率,
      --limit rate[/second|/minute|/hour|/day]: 平均速率
      --limit-burst number : 峰值数量
  示例
      # iptables -I INPUT -d 172.16.100.67 -p icmp --icmp-type 8 -m limit --limit 3/minut --limit-burst 5 -j ACCEPT
      # iptables -I INPUT 2 icmp -j REJECT
  默认扩展策略
  7、state扩展,连接追踪
  根据 "连接追踪机制" 去检查连接的状态
  源IP、目标IP、什么时间、什么协议都已可以记录
      contrack机制: 追踪本机上的请求和响应之间的关系,状态有如下几种
          NEW: 新发出请求,连接追踪模板中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求
          ESTABLISHED: NEW状态之后,连接追踪模板中为其建立的条目失败之前期间内所进行的通信状态
          RELATED: 相关联的连接,如ftp协议中的命令连接与数据连接之间的关系
          INVALID: 无效的连接
  对于一个生产线的负载均衡器来说,这时绝对不允许的
      [!] --state state
  示例
      # iptables -A INPUT -d 172.16.100.67 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTANLISHED -j ACCEPT
      # iptables -A OUTPUT -s 172.16.100.67 -p tcp -m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT
  调整连接追踪功能所能够容纳的最大连接数量:
      /proc/sys/net/nf_contrack_max
  [iyunv@localhost ~]# cat /proc/sys/net/nf_conntrack_max
  15220
  已经追踪到的并记录下来的连接:
      /proc/net/nf_conntrack
  [iyunv@localhost ~]# cat /proc/net/nf_conntrack
  ipv4     2 tcp      6 299 ESTABLISHED src=192.168.137.11 dst=192.168.137.1 sport=22 dport=53551 src=192.168.137.1 dst=192.168.137.11 sport=53551 dport=22 [ASSURED] mark=0 secctx=system_u:object_r:unlabeled_t:s0 zone=0 use=2
  不同的协议的连接追踪时长:
      /proc/sys/net/netfilter/*

iptables规则管理(04)
  iptables的链接跟踪表最大容量为/proc/sys/net/ipv4/ip_conntrack_max,链接碰到各种状态的超时后就会从表中删除,当模板满载时,后续的连接可能会超时
  所以解决方法一般有两个:
  (1) 加大 ip_conntrack_max 值
      vi /etc/sysctl.conf
          net.ipv4.ip_conntrack_max = 393216
          net.ipv4.netfilter.ip_conntrack_max = 393216
  (2): 降低 ip_conntrack timeout时间
      vi /etc/sysctl.conf
          net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 300
          net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
          net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
          net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120
          iptables -t nat -L -n
  如何开放被动模式的ftp服务?
      (1)装载ftp连接的追踪的专用模块
          # modproble nf_conntrack_ftp
      (2)放行命令连接(假设Server地址为172.16.100.67):
          # iptables -A INPUT -d 172.16.100.67 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
          # iptables -A OUTPUT -s 172.16.100.67 -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT
      (3)放行数据连接(假设Server地址为172.16.100.67):
          # iptables -A INPUT -d 172.16.100.67 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
          # iptables -I OUPUT -s 172.16.100.67 -m state --state ESTABLISHED -j ACCEPT
  规则优化:
      服务器端规则设定: 任何不允许的访问,应该在请求到达时给予拒绝
      (1)可安全放行,所有入站的状态为ESTABLISHED状态的连接
      (2)可安全放行,所有出站的状态为ESTABLISHED状态的连接
      (3)谨慎放行入站的新请求
      (4)有特殊目的的限制访问,要于放行规则之前加以拒绝
  如何使用自定义链:
      自定义链: 需要被调用才能生效,自定义链最后需要定义返回规则
      返回规则使用的target叫做RETURN
  规则的有效期限:
      使用iptables命令定义的规则,手动删除之前,其生效期限为kernel存活期限
      保存规则:
          保存规则至指定的文件
              CentOS 6:
                  # service iptables save #将规则保存至/etc/sysconfig/iptables文件中
                  # iptables-save > /PATH/TO/SOME_RULES_FILE
              CentOS 7:
                  # iptables-save > /PATH/TO/SOME_RULES_FILE
                 
          重新载入预存文件中的规则:
              # iptables-restore < /PATH/FROM/SOME_RULES_FILE
              CentOS 6
                  # service iptables restart
          自动生效规则文件中的规则
          (1)用脚本保存各iptables命令,让此脚本开机后自动运行
              /etc/rc.d/rc.local文件中添加脚本路径
                  /PATH/TO/SOME_SCRIPT_FILE
          (2)用规则文件保存各规则,开机时自动载入此规则文件中的规则
              /etc/rc.d/rc.local文件添加:
                  iptables-restore < /PATH/FROM/IPTABLES_RULES_FILE
  CentOS 7:
      引入了新的iptables前端管理工具firewalld,其管理工具有: firewall-cmd, firewalld-config
  Target
      ACCEPT, DROP, REJECT, RETURN
      LOG, SNAT, DNAT, REDIRECT, MASQUERADE, ...
      LOG:
          --log-level level
          --log-prefix prefix
  FORWARD













  modproble
  练习:INPUT和OUTPUT默认策略为DROP;
      1、限制本地主机的web服务器在周一不允许访问;新请求的速率不能超过100个每秒;web服务器包含了admin字符串的页面不允许访问;web服务器仅允许响应报文离开本机;
  iptables
      2、在工作时间,即周一到周五的8:30-18:00,开放本机的ftp服务给172.16.0.0网络中的主机访问;数据下载请求的次数每分钟不得超过5个;
      3、开放本机的ssh服务给172.16.x.1-172.16.x.100中的主机,x为你的座位号,新请求建立的速率一分钟不得超过2个;仅允许响应报文通过其服务端口离开本机;
      4、拒绝TCP标志位全部为1及全部为0的报文访问本机;
      5、允许本机ping别的主机;但不开放别的主机ping本机;
      练习:判断下述规则的意义:
      # iptables -N clean_in
      # iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP
      # iptables -A clean_in -d 172.16.255.255 -p icmp -j DROP
      # iptables -A clean_in -p tcp ! --syn -m state --state NEW -j DROP
      # iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP
      # iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP
      # iptables -A clean_in -d 172.16.100.7 -j RETURN
      # iptables -A INPUT -d 172.16.100.7 -j clean_in
      # iptables -A INPUT  -i lo -j ACCEPT
      # iptables -A OUTPUT -o lo -j ACCEPT
      # iptables -A INPUT  -i eth0 -m multiport -p tcp --dports 53,113,135,137,139,445 -j DROP
      # iptables -A INPUT  -i eth0 -m multiport -p udp --dports 53,113,135,137,139,445 -j DROP
      # iptables -A INPUT  -i eth0 -p udp --dport 1026 -j DROP
      # iptables -A INPUT  -i eth0 -m multiport -p tcp --dports 1433,4899 -j DROP
      # iptables -A INPUT  -p icmp -m limit --limit 10/second -j ACCEPT
以前练习的笔记
  #清除条目
  [iyunv@localhost ~]# iptables -F
  #通行 SSH 服务
  [iyunv@localhost ~]# iptables -A INPUT -d 192.168.137.100 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
  [iyunv@localhost ~]# iptables -A OUTPUT -s 192.168.137.100 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
  #设置默认动作为禁止
  [iyunv@localhost ~]# iptables -P INPUT DROP
  [iyunv@localhost ~]# iptables -P OUTPUT DROP
  #通行 HTTP 服务
  [iyunv@localhost ~]# iptables -A INPUT -d 192.168.137.100 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
  [iyunv@localhost ~]# iptables -A OUTPUT -s 192.168.137.100 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
  #通行 ICMP
  [iyunv@localhost ~]# iptables -A INPUT -d 192.168.137.100 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT
  [iyunv@localhost ~]# iptables -A OUTPUT -s 192.168.137.100 -p icmp --icmp-type 0 -m state --state ESTABLISHED -j ACCEPT
  #查看规则条目
  [iyunv@localhost ~]# iptables -L -n -v --line-numbers
  #优化条目
  [iyunv@localhost ~]# iptables -I OUTPUT -s 192.168.137.100 -m state --state ESTABLISHED -j ACCEPT
  #查看规则条目
  [iyunv@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
  #删除无用条目
  [iyunv@localhost ~]# iptables -D OUTPUT 2
  [iyunv@localhost ~]# iptables -D OUTPUT 2
  [iyunv@localhost ~]# iptables -D OUTPUT 2
  [iyunv@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
  #通行本地回环地址
  [iyunv@localhost ~]# iptables -A INPUT -i lo -j ACCEPT
  [iyunv@localhost ~]# iptables -A OUTPUT -o lo -j ACCEPT
  #通行 ftp 服务
      #确保添加 ip_nat_ftp ip_conntrack_ftp 模块
      [iyunv@localhost ~]# vim /etc/sysconfig/iptables-config
      #更改-保存-退出
          IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"
      #保存规则1
      [iyunv@localhost ~]# service iptables save
      iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]
      #保存读取规则2
      [iyunv@localhost ~]# iptables-save > /etc/sysconfig/iptables.2015120901
      [iyunv@localhost ~]# iptables-restore < /etc/sysconfig/iptables.2015120901
      #重启iptables 脚本
      [iyunv@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  ]
  [iyunv@localhost ~]# iptables -I INPUT -d 192.168.137.100 -p tcp -m state --state RELATED,ESTABLISHED
  #待续
  #修改条目
  [iyunv@localhost ~]# iptables -R OUTPUT 1 -s 192.168.137.100 -m state --state ESTABLISHED,RELATED -j ACCEPT
  [iyunv@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
  #继续优化条目
  #直接修改配置文件
  [iyunv@localhost ~]# service iptables save
  iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]
  [iyunv@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
  #重载入
  [iyunv@localhost ~]# service iptables reload
  [iyunv@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           
  #多端口匹配优化
  [iyunv@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
  #删除无用的条目
  [iyunv@localhost ~]# iptables -D INPUT 3
  [iyunv@localhost ~]# iptables -D INPUT 3
  [iyunv@localhost ~]# iptables -D INPUT 3
  [iyunv@localhost ~]# iptables -D INPUT 3
  [iyunv@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时,通行
  [iyunv@localhost ~]# iptables -A INPUT -d 192.168.137.100 -p tcp --dport 80 -m connlimit ! --connlimit-above 2 -j ACCEPT
  或
  [iyunv@localhost ~]# iptables -A INPUT -d 192.168.137.100 -p tcp --dport 80 -m connlimit --connlimit-above 2 -j DROP
  #第一次请求峰值允许为6个,其后每分钟只允许5个ping 请求
  iptables -A INPUT -d 192.168.137.100 -p icmp --icmp-type 8 -m limit --limit 5/minute --limit-burst 6 -j ACCEPT
  #限制字符串
  -m string --algo {bm|kmp} --string "STRING"
  iptables -I OUTPUT -s 192.168.137.100 -m string --algo kmp --string "h7n9" -j REJECT
  #IP地址范围段
  -m iprange
      -src-range
      -dst-range
      -s, -d
      -s IP, NET
          172.16.0.0/16, 172.16.100.3-172.16.100.100
      iptables -A INPUT -p tcp -m iprange --src-range 172.16.100-172.16.100.100 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
2016/01/24
iptables网络防火墙及nat(01)
  回顾: iptables/netfilter
  显式扩展、保存恢复规则
  显式扩展:
      multiport, iprange, string, time, connlimit, limit, state
  state: conntrack
      保存模板/proc/net/nf_conntrack
      保存数设定/proc/sys/net/nf_conntrack_max
      NEW,ESTABLISHED,RELATED(nf_conntrack_ftp),INVALID,UNTRACKED
  保存和恢复规则:
      iptables-save
      iptables-restore
  iptables(3)
  查看转发功能,并开启
  # cat /proc/sys/net/ipv4/ip_forward
  0
  # sysctl -w net.ipv4.ip_forward=1
  net.ipv4.ip_forward = 1
  如果打开了转发功能,就充当网关功能



  网络防火墙


  修改目标地址时网络服务器端口映射

  netfilter: nat table
  nat: network address translation
      snat: source nat
      dnat: destination nat
  snat源地址转换 POSTROUTING OUTPUT
      让本地网络中的主机通过某一特定地址访问外部网络时
  dnat目标地址转换 PREROUTING
      把本地网络中的某一主机上的某服务开放给外部网络中的用户访问时
  nat表的target:
  SNAT
          --to-source [ipaddr[-ipaddr]][:port[-port]]
          --random
  DNAT
          --to-destination [ipaddr[-ipaddr]][:port[-port]]
  MASQUERADE
          --to-ports port[-port]
          --random
iptables之nat应用(02)
  SNAT示例:
      # iptables -t nat -A POSTROUTING -s 192.168.12.0/24 -j SNAT --to-source 172.16.100.67
  MASQUERADE示例:
  源地址转换,当源地址为动态获取的地址时(PPPoe拨号上网),MASQUERADE可自行判断要转换为的地址:
      # iptables -t nat -A POSTROUTING -s 192.168.12.0/24 -j MASQUERADE
  DNAT示例:
      # iptables -t nat -A PREROUTING -d 172.16.100.67 -p tcp --dport 80 -j DNAT --to-destination 192.168.12.77
      # iptables -t nat -A PREROUTING -d 172.16.100.67 -p tcp --dport 80 -j DNAT --to-destination 192.168.12.77:8080
      # iptables -t nat -A PREROUTING -d 172.16.100.67 -p tcp --dport 22012 -j DNAT --to-destination 192.168.12.78.22
  提示:安全起见,一般不适用默认端口
  补充:利用iptables的recent模块来抵御DOS攻击: 22,建立一个列表,保存有所有访问过指定的服务的客户端IP
  ssh: 远程连接,
  # iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP
  # iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
  # iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j LOG --log-prefix "SSH Attach: "
  # iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP
  1.利用connlimit模块将单IP的并发设置为3;会误杀使用NAT上网的用户,可以根据实际情况增大该值。
  2.利用recent和state模块限制单IP在300s内只能与本机建立2个新连接。被限制五分钟后即可恢复访问。
  下面对最后两句做一个说明:
  1.第二句是记录访问tcp 22端口的新连接,记录名称为SSH
      --set 记录数据包的来源IP,如果IP已经存在将更新已经存在的条目
  2.第三句是指SSH记录中的IP,300s内发起超过3次连接则拒绝此IP的连接。
      --update 是指每次建立连接都更新列表;
      --seconds必须与--rcheck或者--update同时使用
      --hitcount必须与--rcheck或者--update同时使用
  3.iptables的记录:/proc/net/xt_recent/SSH
  也可以使用下面的这句记录日志:
      # iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --second 300 --hitcount 3 -j LOG --log-prefix "SSH Attack"
  CentOS 6:
      http://ftp.redhat.com/redhat/linux/enterprise/6Server/en/os/SRPMS/
  layer7:第三方扩展
  iptables实现七层访问过滤:
      模块:layer7
          识别应用层协议
      iptables/netfilter
          iptables -m state,
          netfilter state
      对内核中的netfilter,打补丁layer7,重新编译内核
      对iptables打补丁,补上layer7模块,重新iptables
  diff/patch:文本操作工具
  diff是Unix系统的一个很重要的工具程序。它用来比较两个文本文件的差异,是代码版本管理的核心工具之一。其用法非常简单:
      # diff <变动前的文件> <变动后的文件>
  由于历史原因,diff有三种格式:
      * 正常格式(normal diff)
      * 上下文格式(context diff)
      * 合并格式(unified diff)
  1、正常格式的diff
      例如,对file1(变动前的文件)和file2(变动后的文件)进行比较可使用如下命令:
      # diff file1 file2
      显示结果中,第一行是一个提示,用来说明变动位置。它分成三个部分:前面的数字,表示file1的第n行有变化;中间的"c"表示变动的模式是内容改变(change),其他模式还有"增加"(a,代表addition)和"删除"(d,代表deletion);
  2、上下文格式的diff
      上个世纪80年代初,加州大学伯克利分校推出BSD版本的Unix时,觉得diff的显示结果太简单,最好加入上下文,便于了解发生的变动。因此,推出了上下文格式的diff。它的使用方法是加入-c选项(即context)。
      # diff -c f1 f2
      结果分成四个部分。第一部分的两行,显示两个文件的基本情况:文件名和时间信息,"***"表示变动前的文件,"---"表示变动后的文件。第二部分是15个星号,将文件的基本情况与变动内容分割开。第三部分显示变动前的文件,即file1。
      另外,文件内容的每一行最前面,还有一个标记位。如果为空,表示该行无变化;如果是感叹号(!),表示该行有改动;如果是减号(-),表示该行被删除;如果是加号(+),表示该行为新增。
      第四部分显示变动后的文件,即file2。
  3、合并格式的diff
      如果两个文件相似度很高,那么上下文格式的diff,将显示大量重复的内容,很浪费空间。1990年,GNU diff率先推出了"合并格式"的diff,将f1和f2的上下文合并在一起显示。
      它的使用方法是加入u参数(代表unified)。
      # diff -u f1 f2
      其结果的第一部分,也是文件的基本信息。"---"表示变动前的文件,"+++"表示变动后的文件。第二部分,变动的位置用两个@作为起首和结束。第三部分是变动的具体内容。
      除了有变动的那些行以外,也是上下文各显示3行。它将两个文件的上下文,合并显示在一起,所以叫做"合并格式"。每一行最前面的标志位,空表示无变动,减号表示第一个文件删除的行,加号表示第二个文件新增的行。
      diff
          -u
      patch
      尽管并没有指定patch和diff的关系,但通常patch都使用diff的结果来完成打补丁的工作,这和patch本身支持多种diff输出文件格式有很大关系。patch通过读入patch命令文件(可以从标准输入),对目标文件进行修改。通常先用diff命令比较新老版本,patch命令文件则采用diff的输出文件,从而保持原版本与新版本一致。
      patch的标准格式为
      patch [options] [originalfile] [patchfile]
      如果patchfile为空则从标准输入读取patchfile内容;如果originalfile也为空,则从patchfile(肯定来自标准输入)中读取需要打补丁的文件名。因此,如果需要修改的是目录,一般都必须在patchfile中记录目录下的各个文件名。绝大多数情况下,patch都用以下这种简单的方式使用:
      patch命令可以忽略文件中的冗余信息,从中取出diff的格式以及所需要patch的文件名,文件名按照diff参数中的"源文件"、"目标文件"以及冗余信息中的"Index:"行中所指定的文件的顺序来决定。
      -p参数决定了是否使用读出的源文件名的前缀目录信息,不提供-p参数,则忽略所有目录信息,-p0(或者-p 0)表示使用全部的路径信息,-p1将忽略第一个"/"以前的目录,依此类推。如/usr/src/linux-2.4.15/Makefile这样的文件名,在提供-p3参数时将使用linux-2.4.15/Makefile作为所要patch的文件。
      patch
          -p
          -R
  mockbuild
  总结:操作步骤
  1、获取并编译内核
      # useradd mockbuild
      # rpm -ivh kernel-2.6.32-431.5.1.x86_64.el6.src.rpm
      # cd rpmbuild/SOURCES
      # tar linux-2.6.32-*.tar.gz -C /usr/src
      # cd /usr/src
      # ln -sv
  2、给内核打补丁
      # tar xf netfilter-layer7-v2.23.tar.bz2
      # cd /usr/src/linux
      # patch -p1 < /root/netfilter-layer7-v2.23/kernel-2.6.32-layer7-2.23.patch
      # cp /boot/config-*  .config
      # make menuconfig
  按如下步骤启用layer7模块
      Networking support → Networking Options →Network packet filtering framework → Core Netfilter Configuration
      <M>  "layer7" match support
  3、编译并安装内核
      # make
      # make modules_install
      # make install
  4、重启系统,启用新内核
  5、编译iptables
      # tar xf iptables-1.4.20.tar.gz
      # cp /root/netfilter-layer7-v2.23/iptables-1.4.3forward-for-kernel-2.6.20forward/* /root/iptables-1.4.20/extensions/
      # cp /etc/rc.d/init.d/iptales /root
      # cp /etc/sysconfig/iptables-config /root
      # rpm -e iptables iptables-ipv6 --nodeps
      # ./configure  --prefix=/usr  --with-ksource=/usr/src/linux
      # make && make install
      # cp /root/iptables /etc/rc.d/init.d
      # cp /root/iptables-config /etc/sysconfig
  6、为layer7模块提供其所识别的协议的特征码
      # tar zxvf l7-protocols-2009-05-28.tar.gz
      # cd l7-protocols-2009-05-28
      # make install        
  7、如何使用layer7模块
      ACCT的功能已经可以在内核参数中按需启用或禁用。此参数需要装载nf_conntrack模块后方能生效。
      net.netfilter.nf_conntrack_acct = 1
      l7-filter uses the standard iptables extension syntax
      # iptables [specify table & chain] -m layer7 --l7proto [protocol name] -j [action]
      # iptables -A FORWARD -m layer7 --l7proto qq -j REJECT
  编译内核:
      make menuconfig
      make -j #
      make modules_install
      make install
  清理内核源码树:
      提示:xt_layer7.ko依赖于nf_conntrack.ko模块
  博客:iptables所有应用,包括layer7的实现;
  课外扩展:recent模块,layer7模块;
  tcp wrapper
  博客作业:iptables所有功能
tcp_wrapper简单应用(03)
  回顾:iptables/netfilter netfilter, nat
  防火墙:主机防火墙:INPUT, OUTPUT
          网络防火墙,首先得是网关,RORWARD
  nat服务器:
      netfilter
      target
          SNAT: --to-source
          DNAT: --to-destination
          MASQUERADE
  tcp_wrapper: tcp包装器
      通用的库文件:libwrap.so    程序链接到此库才能使用
  它的配置文件/etc/hosts.allow, /etc/hosts.deny
  写规则的方式:配置文件的语法格式:
      daemon_list: client_list [:options]
      某些服务        针对哪些主机        有哪些控制
      daemon_list:
          (1)单个应用程序的文件名称,而非服务名
          (2)以逗号分隔的应用程序文件名列表
              例如:sshd, vsftpd
          (3)ALL:所有受tcp_wrapper控制的程序
      client_list:
          IP地址:
          主机名:
          网络地址:必须使用完整格式的掩码,不能使用前缀格式掩码
          简短格式的网络地址:例如172.16.表示172.16.0.0/255.255.0.0
          ALL: 所有主机
          KNOWN:所有已知主机,
          UNKNOWN: 不能反解的主机
          PARANOID:正向解析与反解的主机不匹配的主机
      EXCEPT:除了
  例如:vsftpd仅开放给172.16.0.0/255.255.0.0中的主机访问
          sshd仅开放给172.16.0.0/255.255.0.0中的主机访问,但是不包含172.16.100.6
              /etc/hosts.allow
                  vsftpd: 172.16.
                  sshd: 172.16.    EXCEPT    172.16.100.6
              /etc/hosts.deny
                  vsftpd: ALL
                  sshd: ALL
      :options
          deny: 拒绝,主要用于hosts.allow文件
          allow: 允许,主要用于hosts.deny文件
          spawn: 启动指定的应用程序
              
                  %c: client ip
                  %s: daemon@server_ip
                  %d: daemon name
      练习:CentOS 6主机上,控制telnet服务仅允许172.16.0.0/255.255.0.0网络中的主机访问,但不包含172.16.100.0/255.255.255.0子网中的主机
          对所有正常登录的主机都记录于/var/log/telnet.allow.log中,对所有被拒绝访问的尝试都记录于/var/log/telnet.deny.log文件中
      注意:
          CentOS 6主机上的telnet服务托管于xinetd,后者接受libwrap控制
          CentOS 7主机上的telnet服务未托管于xinetd,而in.telnetd未链接至libwrap
      练习:尝试实现samba服务仅允许172.16.0.0/16网络中的主机访问,但不包含172.16.100.0/24网络中的主机


  CentOS 7不支持
  判断某服务是否能够由tcp_wrapper进行访问控制的方法
  查看应用程序是否编译此库
  (1)动态编译ldd命令就能显示出结果
      ldd $(which COMAND)|grep libwrap


  (2)静态编译:string命令查看应用程序文件,其其结果中是否出现了hosts.allow和hosts.deny文件
  服务基于libwrap完成访问控制的流程:
      首先检查/etc/hosts.allow文件有没有显式授权访问
          是:直接授权客户端访问
          否:接着去检查/etc/hosts.deny文件中有没有显式拒绝当前请求者访问
              是:直接拒绝当前请求者的访问
              否:允许请求者访问
  检查机制:当某个服务被访问时,
  # vim /etc/hosts.deny

  拒绝这个主机使用sshd,只对新创建的连接有效,只在进程启动时做检查
sudo的简单使用(04)
  sudo
  su : switch user
      用户切换
  (1)su -l user
  (2)su -l user 'COMMAND'
  sudo : 一个用户用另外一个用户
      能够让获得授权的用户以另外一个用户的身份运行指定的命令
          授权机制:授权文件 /etc/sudoers
              root        ALL=(ALL)        ALL
          组    %wheel    ALL=(ALL)        ALL
      编译此文件的专用命令:visudo
      授权项:
      who    where=(whom)    commands
      users    hosts=(runas)    commands
          users:
              username
              #uid
              %groupname
              %#gid
              user_alias
              支持多个用户定义为一组用户,称之为用户别名,即user_alias
          hosts:
              ip
              hostname
              NetAddr
              host_alias
          runas:
              ...
              host_alias
          commands:
              command
              directory
                  指定目录下的所有命令
              sudoedit:特殊权限,可用于向其它用户授予sudo权限
              comand_alias
      定义别名的方法:
          ALIAS_TYPE NAME=item1,item2,item3,...
              NAME:别名名称,必须使用全大写字母
              ALIA_TYPE:
                  User_Alias
                  Host_Alias
                  Runas_Alias
                  Cmnd_Alias
              例如:
                  User_Alias NETADMIN=tom,jerry
                  Cmnd_Alias NETCOMND=ip,ifconfig,route
                  NETADMIN    localhost=(root)    NETCMND


  sudo命令:
      有一种检票机制,能记录成功认证结果一段时间,默认为5分钟
    -s [command]  以目标用户身份运行 shell
    -k            清除此前缓存用户认证成功的结果


  /etc/sudoers应用示例:
      Cmnd_Alias USERADMINCMNDS = /usr/sbin/useradd, /usr/sbin/usermod, /usr/bin/passwd [a-z]*, !/usr/bin/passwd root
      User_Alias USERADMIN = bob, alice
      USERADMIN       ALL=(root)      USERADMINCMNDS
  常用标签:
      NOPASSWD:
      PASSWD:
  apt

  fcitx
  CentOS 7
  # inittab is no longer used when using systemd.
  #
  # ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
  #
  # Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
  #
  # systemd uses 'targets' instead of runlevels. By default, there are two main targets:
  #
  # multi-user.target: analogous to runlevel 3
  # graphical.target: analogous to runlevel 5
  #
  # To view current default target, run:
  # systemctl get-default
  #
  # To set a default target, run:
  # systemctl set-default TARGET.target
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-386832-1-1.html 上篇帖子: linux服务器开发三(网络编程) 下篇帖子: 《Xenogears》(异度装甲)隐含的原型与密码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表