墨菲定律:一种心理学效应,是由爱德华·墨菲(Edward A. Murphy)提出的, 原话:如果有两种或两种以上的方式去做某件事情,而其中一种选择方式将导 致灾难,则必定有人会做出这种选择

主要内容:

  1. 任何事都没有表面看起来那么简单
  2. 所有的事都会比你预计的时间长
  3. 会出错的事总会出错
  4. 如果你担心某种情况发生,那么它就更有可能发生

安全

安全机制

  • 信息安全防护的目标

    • 保密性 Confidentiality
    • 完整性 Integrity
    • 可用性 Usability
    • 可控制性 Controlability
    • 不可否认性 Non-repudiation
  • 安全防护环节

    • 物理安全:各种设备/主机、机房环境
    • 系统安全:主机或设备的操作系统
    • 应用安全:各种网络服务、应用程序
    • 网络安全:对网络访问的控制、防火墙规则
    • 数据安全:信息的备份与恢复、加密解密
    • 管理安全:各种保障性的规范、流程、方法
  • 安全攻击: STRIDE

    • Spoofing 假冒
    • Tampering 篡改
    • Repudiation 否认
    • Information Disclosure 信息泄漏
    • Denial of Service 拒绝服务
    • Elevation of Privilege 提升权限

设计原则

  • 使用成熟的安全系统
  • 以小人之心度输入数据
  • 外部系统是不安全的
  • 最小授权
  • 减少外部接口
  • 缺省使用安全模式
  • 安全不是似是而非
  • 从STRIDE思考
  • 在入口处检查
  • 从管理上保护好你的系统

安全算法

  • 常用安全技术
    • 认证
    • 授权
    • 审计
    • 安全通信
  • 加密算法和协议
    • 对称加密
    • 公钥加密
    • 单向加密
    • 认证协议

对称加密算法

  • 对称加密:加密和解密使用同一个密钥
    • DES:Data Encryption Standard,64bits
    • 3DES:Triple DES
    • AES:Advanced (128, 192, 256, 384bits)
    • Blowfish
    • Twofish
    • IDEA
    • RC6
    • CAST5
  • 特性:
    1. 加密、解密使用同一个密钥,效率高
    2. 将原始数据分割成固定大小的块,逐个进行加密
  • 缺陷:
    1. 密钥过多
    2. 密钥分发
    3. 数据来源无法确认

非对称加密算法

  • 基于一对公钥/密钥对
    • 用密钥对中的一个加密,另一个解密
  • 实现加密:
    • 接收者
      • 生成公钥/密钥对:P和S
      • 公开公钥P,保密密钥S
    • 发送者
      • 使用接收者的公钥来加密消息M
      • 将P(M)发送给接收者
    • 接收者
      • 使用密钥S来解密:M=S(P(M))
  • 实现数字签名:
    • 发送者
      • 生成公钥/密钥对:P和S
      • 公开公钥P,保密密钥S
      • 使用密钥S来加密消息M
      • 发送给接收者S(M)
    • 接收者
      • 使用发送者的公钥来解密M=P(S(M))
  • 结合签名和加密
  • 分离签名

RSA和DSA

  • RSA:公钥加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的,RSA取名来自开发他们三者的名字,后成立RSA 数据安全有限公司。RSA是目前最有影响力的公钥加密算法,它能够抵抗到目 前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。RSA算法基于 一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积 进行因式分解却极其困难,因此可以将乘积公开作为加密密钥

  • DSA (Digital Signature Algorithm):1991年7月26日提交,并归属于DavidW. Kravitz前NSA员工,DSA是Schnorr和ElGamal签名算法的变种,被美国 NIST作为SS(DigitalSignature Standard), DSA是基于整数有限域离散对数难 题的,其安全性与RSA相比差不多。DSA只是一种算法,和RSA不同之处在于它不能用作加密和解密,也不能进行密钥交换,只用于签名,它比RSA要快很多

单向散列

  • 将任意数据缩小成固定大小的“指纹”

    • 任意长度输入
    • 固定长度输出
    • 有雪崩效应
    • 若修改数据,指纹也会改变(“不会产生冲突”)
  • 无法从指纹中重新生成数据(“单向”)

  • 功能:校验数据完整性

  • 常见算法

    • md5: 128bits
    • sha1: 160bits
    • sha224
    • sha256
    • sha384
    • 512
  • 常用工具

    • md5sum | sha1sum [ –check ] file
    • openssl、gpg
    • rpm -V

数字签名

image-20200507082258192

应用程序:RPM

  • 文件完整性的两种实施方式

  • 被安装的文件

    • MD5单向散列

    • rpm --verify package_name (or -V)

  • 发行的软件包文件

    • GPG公钥签名
    • rpm –import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat*
    • rpm –checksig pakage_file_name (or -K)

密钥交换

  • 密钥交换:IKE( Internet Key Exchange )

    公钥加密:DH (Deffie-Hellman):生成会话密钥,由惠特菲尔德·迪菲(Bailey Whitfield Diffie)和马丁·赫尔曼(Martin Edward Hellman)在1976年发表,参看:https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange

  • DH:

    • A: g,p 协商生成公开的整数g, 大素数p

      B: g,p

    • A:生成隐私数据 :a (a<p ),计算得出 g^a%p,发送给B

      B:生成隐私数据 :b,计算得出 g^b%p,发送给A

    • A:计算得出 [(g^b%p)^a] %p = g^ab%p,生成为密钥

      B:计算得出 [(g^a%p)^b] %p = g^ab%p,生成为密钥

gpg加密

对称加密

  • 对称加密file文件

    gpg -c file

    ls file.gpg

  • 在另一台主机上解密file

    gpg -o file -d file.gpg

公钥加密

  • 在hostB主机上用公钥加密,在hostA主机上解密

  • 在hostA主机上生成公钥/私钥对

    gpg --gen-key

  • 在hostA主机上查看公钥

    gpg --list-keys

  • 在hostA主机上导出公钥到xxx.pubkey

    gpg -a --export -o xxx.pubkey

  • 从hostA主机上复制公钥文件到需加密的B主机上

    scp xxx.pubkey hostB:

  • 在需加密数据的hostB主机上生成公钥/私钥对

    gpg --list-keys

    gpg --gen-key

  • 在hostB主机上导入公钥

    gpg --import xxx.pubkey

    gpg --list-keys

  • 用从hostA主机导入的公钥,加密hostB主机的文件file,生成file.gpg

    gpg -e -r wangxiaochun file

    file file.gpg

  • 复制加密文件到hostA主机

    scp fstab.gpg hostA:

  • 在hostA主机解密文件

    gpg -d file.gpg

    gpg -o file -d file.gpg

  • 删除公钥和私钥

    gpg --delete-keys xxx

    gpg --delete-secret-keys xxx

中间人攻击

image-20200507083125751

CA和证书

  • PKI:Public Key Infrastructure
    • 签证机构:CA(Certificate Authority)
    • 注册机构:RA
    • 证书吊销列表:CRL
    • 证书存取库:
  • X.509:定义了证书的结构以及认证协议标准
    • 版本
    • 序列
    • 签名算法
    • 颁发者
    • 有效期限
    • 主体名称
    • 主体公钥
    • CRL分发点
    • 扩展信息
    • 发行者签名

证书获取

  • 证书类型:
    • 证书授权机构的证书
    • 服务器
    • 用户证书
  • 获取证书两种方法:
    • 使用证书授权机构
      • 生成证书请求(csr)
      • 将证书请求csr发送给CA
      • CA签名颁发证书
    • 自签名的证书
      • 自已签发自己的公钥

安全协议

  • SSL:Secure Socket Layer,TLS: Transport Layer Security

    • 1995:SSL 2.0 Netscape
    • 1996:SSL 3.0
    • 1999:TLS 1.0
    • 2006:TLS 1.1 IETF(Internet工程任务组) RFC 4346
    • 2008:TLS 1.2 当前使用
    • 2015:TLS 1.3

    功能:机密性,认证,完整性,重放保护

  • 两阶段协议,分为握手阶段和应用阶段

    • 握手阶段(协商阶段):客户端和服务器端认证对方身份(依赖于PKI体系,利用数字证书进行身份认证),并协商通信中使用的安全参数、密码套件以及主密钥。后续通信使 用的所有密钥都是通过MasterSecret生成

    • 应用阶段:在握手阶段完成后进入,在应用阶段通信双方使用握手阶段协商好的密 钥进行安全通信

SSL/TLS

image-20200507083702027

  • Handshake协议:包括协商安全参数和密码套件、服务器身份认证(客户端身 份认证可选)、密钥交换
  • ChangeCipherSpec 协议:一条消息表明握手协议已经完成
  • Alert 协议:对握手协议中一些异常的错误提醒,分为fatal和warning两个级别, fatal类型错误会直接中断SSL链接,而warning级别的错误SSL链接仍可继续, 只是会给出错误警告
  • Record 协议:包括对消息的分段、压缩、消息认证和完整性保护、加密等
  • HTTPS 协议:就是“HTTP 协议”和“SSL/TLS 协议”的组合。HTTP over SSL”或“HTTP over TLS”,对http协议的文本数据进行加密处理后,成为二 进制形式传输

HTTPS结构

image-20200507083805300

HTTPS工作过程

image-20200507083826548

OpenSSL

  • OpenSSL:开源项目

    三个组件:

    • openssl:多用途的命令行工具,包openssl
    • libcrypto:加密算法库,包openssl-libs,主要由开发者使用
    • libssl:加密模块应用库,实现了ssl及tls,包nss,主要由开发者使用

openssl命令

  • 两种运行模式:交互模式和批处理模式

  • openssl version:程序版本号

  • 标准命令、消息摘要命令(dgst子命令)、加密命令(enc子命令)

    标准命令:enc, ca, req, …

  • 对称加密:

    • 工具:openssl enc, gpg

    • 算法:3des, aes, blowfish, twofish

  • enc命令:

    • 帮助:man enc
      • -e 加密 后+算法
      • -d 解密 后+算法
    • -a 以base64文本格式编码
      • -salt 加盐
      • -in 要加密的文件
      • -out 加密后生成的文件
    • 加密:openssl enc -e -des3 -a -salt -in testfile -out testfile.cipher
    • 解密:openssl enc -d -des3 -a -salt –in testfile.cipher -out testfile
  • 单向加密:

    工具:md5sum, sha1sum, sha224sum,sha256sum…openssl dgst

  • dgst命令:

    • 帮助:man dgst

    • openssl dgst -md5 [-hex默认] /PATH/SOMEFILE

    • openssl dgst -md5 testfile

    • md5sum /PATH/TO/SOMEFILE

  • MAC: Message Authentication Code,单向加密的一种延伸应用,用于实现 网络通信中保证所传输数据的完整性机制

    • CBC-MAC
    • HMAC:使用md5或sha1算法
  • 生成用户密码:

    passwd命令:

    • 帮助:man sslpasswd
    • openssl passwd -1 -salt SALT(最多8位) -1表示使用md5算法
    • 例:openssl passwd -1 –salt centos
  • 生成随机数:

    • 帮助:man sslrand

    • openssl rand -base64|-hex NUM

      NUM: 表示字节数,使用-hex,每个字符为十六进制,相当于4位二进制, 出现的字符数为NUM*2

  • 公钥加密:

    • 算法:RSA, ELGamal
    • 工具:gpg, openssl rsautl(man rsautl)
  • 数字签名:

    • 算法:RSA, DSA, ELGamal
    • 工具:gpg, openssl rsautl(man rsautl)
  • 密钥交换:

    • 算法:dh

    • DSA:Digital Signature Algorithm

    • DSS:Digital Signature Standard

    • RSA:

  • 生成密钥对:man genrsa

    生成私钥

    openssl genrsa -out /PATH/TO/PRIVATEKEY.FILE NUM_BITS

    (umask 077; openssl genrsa –out test.key –des 2048)

    • umask用来设定/PATH/TO/PRIVATE_KEY文件的权限
    • NUMBER_BITS 用来声明字节数,为2的整数倍
    • ( )用来表示在子shell中运行,设定的内容对当前shell不产生影响

    openssl rsa -in test.key –out test2.key 将加密key解密

    从私钥中提取出公钥

    openssl rsa -in PRIVATEKEYFILE –pubout –out PUBLICKEYFILE

    openssl rsa –in test.key –pubout –out test.key.pub

  • 随机数生成器:伪随机数字

    • 键盘和鼠标,块设备中断
    • /dev/random:仅从熵池返回随机数;随机数用尽,阻塞
    • /dev/urandom:从熵池返回随机数;随机数用尽,会利用软件生成伪随机数,非阻塞

CA和申请证书

  • PKI:Public Key Infrastructure

    • CA
    • RA
    • CRL
    • 证书存取库
  • 建立私有CA:

    • OpenCA
    • openssl
  • 证书申请及签署步骤:

    1. 生成申请请求
    2. RA核验
    3. CA签署
    4. 获取证书
  • 创建私有CA:

    • openssl的配置文件:/etc/pki/tls/openssl.cnf

    • 三种策略:match匹配、optional可选、supplied提供 match:要求申请填写的信息跟CA设置信息必须一致 optional:可有可无,跟CA设置信息可不一致 supplied:必须填写这项申请信息,

      1. 创建所需要的文件

        touch /etc/pki/CA/index.txt 生成证书索引数据库文件

        echo 01 > /etc/pki/CA/serial 指定第一个颁发证书的序列号

      2. CA自签证书

        • 生成私钥

          cd /etc/pki/CA/

          (umask 077; openssl genrsa -des3 -out private/cakey.pem 2048)

        • 生成自签名证书

          openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3650
          选项说明:

          • -new:生成新证书签署请求
          • -x509:生成自签格式证书,专用于创建私有CA时
            • -key:生成请求时用到的私钥文件
            • -days n:证书的有效期限
            • -out /PATH/TO/SOMECERTFILE: 证书的保存路径
      • 以上两步可以合成一步:
   `openssl req -newkey rsa:4096 -nodes -sha256 -keyout ca.key -x509 -days 3650 -out ca.crt`
  • 为CA提供所需的目录及文件
    • mkdir -pv /etc/pkl/CA/{certs,crl,newcerts}
  1. 颁发证书

    • 在需要使用证书的主机生成证书请求

    • 给web服务器生成私钥

      `(umask 077; openssl genrsa –out /data/test.key 2048)`

      注意:在CentOS8.1中,密钥的长度不能指定1024,否则会报错!!!

    • 生成证书申请文件

`openssl req -new -key /data/test.key -out /data/test.csr -days 365`
  • 以上两步可合成一步
    openssl req - newkey rsa:4096 -nodes sha256 -keyout client.key -out client.csr
    将证书请求文件传输给CA

  • CA签署证书

    `openssl ca -in /tmp/test.csr –out /etc/pki/CA/certs/test.crt -days 365`

    或者使用以下命令

    openssl x509 -req -days 3650 -in client.csr -CA ca.crt -CAkey ca.key - CAcreateserial out client.crt

    • 注意:默认要求国家,省,公司名称三项必须和CA一致
  • 将证书颁发给请求者

  • 查看证书中的信息:

    `openssl x509 -in /PATH/FROM/CERT_FILE -noout -text|issuer|subject|serial|dates`
    `openssl ca -status SERIAL`  查看指定编号的证书状态
    1. 吊销证书
    • 在客户端获取要吊销的证书的serial
      openssl x509 -in /PATH/FROM/CERT_FILE -noout -serial -subject

    • 在CA上,根据客户提交的serial与subject信息,对比检验是否与index.txt文件中的信息一致,
      吊销证书:
      openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem

      SERIAL要换成证书真正的序列号

    • 指定第一个吊销证书的编号,注意:第一次更新证书吊销列表前,才需要执行
      echo 01 > /etc/pki/CA/crlnumber

    • 更新证书吊销列表
      openssl ca -gencrl -out /etc/pki/CA/crl.pem

    • 查看crl文件:
      openssl crl -in /etc/pki/CA/crl.pem -noout -text

SSH

  • ssh: secure shell, protocol, 22/tcp, 安全的远程登录

  • 具体的软件实现:

    • OpenSSH: ssh协议的开源实现,CentOS默认安装
    • dropbear:另一个开源实现
  • SSH协议版本

    • v1: 基于CRC-32做MAC,不安全;man-in-middle
    • v2:双方主机协议选择安全的MAC方式
    • 基于DH算法做密钥交换,基于RSA或DSA实现身份认证

Openssh软件组成

  • OpenSSH介绍

    相关包:

    • openssh
    • openssh-clients
    • openssh-server
  • 工具:

    • 基于C/S结构
    • Linux Client: ssh, scp, sftp,slogin
    • Windows Client:xshell, putty, securecrt, sshsecureshellclient
    • Server: sshd

公钥交换

image-20200507091133009

  1. 客户端发起链接请求
  2. 服务端返回自己的公钥,以及一个会话ID(这一步客户端得到服务端公钥)
  3. 客户端生成密钥对
  4. 客户端用自己的公钥异或会话ID,计算出一个值Res,并用服务端的公钥加密
  5. 客户端发送加密后的值到服务端,服务端用私钥解密,得到Res
  6. 服务端用解密后的值Res异或会话ID,计算出客户端的公钥(这一步服务端得到客户端公钥)
  7. 最终:双方各自持有三个秘钥,分别为自己的一对公、私钥,以及对方的公钥,之后的所有通讯都会被加密

ssh加密通讯

image-20200507091336347

ssh客户端

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

  • 格式:

    ssh [user@]host [COMMAND]

    ssh [-l user] host [COMMAND]

  • 常见选项

    • -p:远程服务器监听的端口
    • -b:指定连接的源IP
    • -v:调试模式
    • -C:压缩方式
    • -X:支持x11转发
    • -t:强制伪tty分配
      ssh -t remoteserver1 ssh -t remoteserver2 ssh remoteserver3
  • 允许实现对远程系统经验证地加密安全访问

  • 当用户远程连接ssh服务器时,会复制ssh服务器/etc/ssh/ssh_host*key.pub(CentOS7默认是ssh_host_ecdsa_key.pub)文件中的公钥到客户机的~./ssh/know_hosts中。下次连接时,会自动匹配相应私钥,不能匹配,将拒绝连接

ssh服务登录验证

  • ssh服务登录的验证方式
    • 用户/口令
    • 基于密钥

基于用户/口令

image-20200507091835522

  1. 客户端发起ssh请求,服务器会把自己的公钥发送给用户

  2. 用户会根据服务器发来的公钥对密码进行加密

  3. 加密后的信息回传给服务器,服务器用自己的私钥解密,如果密码正确,则用户登录成功

基于密钥

image-20200507091958071

  • 基于密钥的登录方式

    1. 首先在客户端生成一对密钥(ssh-keygen)
    2. 并将客户端的公钥ssh-copy-id 拷贝到服务端
    3. 客户端再次发送一个连接请求,包括ip、用户名
    4. 服务端得到客户端的请求后,会到authorized_keys中查找,如果有响应的IP和用户,就会随机生成一个字符串,例如:abcdefg
    5. 服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端
    6. 得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串用服务端的公钥发送给服务端
    7. 服务端接受到客户端发来的字符串后,用自己的私钥跟之前的字符串进行对比,如果一 致,就允许免密码登录
  • 基于密钥的认证

    1. 在客户端生成密钥对

      ssh-keygen -t rsa [-P ''] [-f “~/.ssh/id_rsa"]

    2. 把公钥文件传输至远程服务器对应用户的家目录

      ssh-copy-id [-i [identity_file]] [user@]host

    3. 测试

    4. 在SecureCRT或Xshell实现基于key验证

      在SecureCRT工具—>创建公钥—>生成Identity.pub文件

      转化为openssh兼容格式(适合SecureCRT,Xshell不需要转化格式),并复制到 需登录主机上相应文件authorized_keys中,注意权限必须为600,在需登录的ssh 主机上执行:

      ssh-keygen -i -f Identity.pub >> .ssh/authorized_keys

    5. 重设私钥口令:

      ssh-keygen –p

    6. 验证代理(authentication agent)保密解密后的密钥 这样口令就只需要输入一次。在GNOME中,代理被自动提供给root用户,否则运行

      ssh-agent bash

    7. 钥匙通过命令添加给代理 ssh-add

有关ssh的命令

  • scp命令:

    scp [options] SRC... DEST/

    两种方式:

    • scp [options] [user@]host:/sourcefile/destpath
    • scp [options] /sourcefile [user@]host:/destpath

    常用选项:

    • -C 压缩数据流

    • -r 递归复制

    • -p 保持原文件的属性信息

    • -q 静默模式

    • -P PORT 指明remote host的监听的端口

  • rsync

    参考

  • sftp

    • 交互式文件传输工具

    • 用法和传统的ftp工具相似

    • 利用ssh服务实现安全的文件上传和下载

    • 使用ls cd mkdir rmdir pwd get put等指令,可用?或help获取帮助信息

      sftp [user@]host

      sftp> help

ssh端口转发

  • SSH端口转发

    SSH 会自动加密和解密所有 SSH 客户端与服务端之间的网络数据。但是, SSH 还能够将其他 TCP 端口的网络数据通过 SSH 链接来转发,并且自动提供了 相应的加密及解密服务。这一过程也被叫做“隧道”(tunneling),这是因为 SSH 为其他 TCP 链接提供了一个安全的通道来进行传输而得名。例如,Telnet, SMTP,LDAP 这些 TCP 应用均能够从中得益,避免了用户名,密码以及隐私信 息的明文传输。而与此同时,如果工作环境中的防火墙限制了一些网络端口的使 用,但是允许 SSH 的连接,也能够通过将 TCP 端口转发来使用 SSH 进行通讯

  • SSH 端口转发能够提供两大功能:

    • 加密 SSH Client 端至 SSH Server 端之间的通讯数据
    • 突破防火墙的限制完成一些之前无法建立的 TCP 连接
  • 本地转发:

    -L localport:remotehost:remotehostport sshserver

  • 选项:

    • -f 后台启用
    • -N 不打开远程shell,处于等待状态
    • -g 启用网关功能

    示例
    ssh –L 9527:telnetsrv:23 -Nfg sshsrv
    telnet 127.0.0.1 9527

    • 当访问本机的9527的端口时,被加密后转发到sshsrv的ssh服务,再解密被转发到telnetsrv:23
    • data ⬅➡ localhost:9527 ⬅➡localhost:XXXXX ⬅➡sshsrv:22 ⬅➡
      sshsrv:YYYYY ⬅➡telnetsrv:23
  • 远程转发:

    -R sshserverport:remotehost:remotehostport sshserver
    示例:
    ssh –R 9527:telnetsrv:23 –Nf sshsrv

    • 让sshsrv侦听9527端口的访问,如有访问,就加密后通过ssh服务转发请求到本机ssh客户端,再由本机解密后转发到telnetsrv:23
    • Data ⬅➡ sshsrv:9527 ⬅➡ sshsrv:22 ⬅➡ localhost:XXXXX ⬅➡
      localhost:YYYYY⬅➡ telnetsrv:23
  • 动态端口转发:
    当用firefox访问internet时,本机的1080端口做为代理服务器,firefox的访问请求被转发到sshserver上,由sshserver替之访问internet

    ssh -D 1080 root@sshserver -fNg

    在本机firefox设置代理socket proxy:127.0.0.1:1080

    curl --socks5 127.0.0.1:1080 http://www.google.com

ssh服务端

  • 服务器端:sshd, 配置文件: /etc/ssh/sshd_config

  • 常用参数:

    • Port
    • ListenAddress ip
    • LoginGraceTime 2m
    • PermitRootLogin yes
    • StrictModes yes 检查.ssh/文件的所有者,权限等
    • MaxAuthTries 6
    • MaxSessions 10 同一个连接最大会话
    • PubkeyAuthentication yes
    • PermitEmptyPasswords no
    • PasswordAuthentication yes
    • PermitEmptyPasswords no
    • PasswordAuthentication yes
    • GatewayPorts no
    • ClientAliveInterval 单位:秒
    • ClientAliveCountMax 默认3
    • UseDNS yes
    • GSSAPIAuthentication yes 提高速度可改为no
    • MaxStartups 未认证连接最大值,默认值10
    • Banner /path/file
  • 限制可登录用户的办法:

    • AllowUsers user1 user2 user3
    • DenyUsers
    • AllowGroups
    • DenyGroups
    • DenyGroups
  • 最佳实践

    • 禁止使用protocol version 1

    • 限制可登录用户

    • 设定空闲会话超时时长

    • 利用防火墙设置ssh访问策略

    • 仅监听特定的IP地址

    • 基于口令认证时,使用强密码策略

      tr -dc A-Za-z0-9_ < /dev/urandom | head -c 12| xargs

    • 使用基于密钥的认证

    • 禁止使用空密码

    • 禁止root用户直接登录

    • 限制ssh的访问频度和并发在线数

    • 经常分析日志

sudo

  • 配置文件:/etc/sudoers, /etc/sudoers.d/

  • 时间戳文件:/var/db/sudo

  • 日志文件:/var/log/secure

  • 配置文件支持使用通配符glob

    • ? 任意单一字符

    • *匹配任意长度字符

    • [wxc] 匹配其中一个字符

    • [!wxc] 除了这三个字符的其它字符

    • \x 转义

    • [[alpha]] 字母 示例: /bin/ls [[alpha]]*

  • 配置文件规则有两类

    1. 别名定义:不是必须的
    2. 授权规则:必须的

更改身份

  • su 切换身份:su –l username –c ‘command’

  • sudo

    • 来自sudo包,man 5 sudoers

    • sudo能够授权指定用户在指定主机上运行某些命令。如果未授权用户尝试使用 sudo,会提示联系管理员

    • sudo可以提供日志,记录每个用户使用sudo操作

    • sudo为系统管理员提供配置文件,允许系统管理员集中地管理用户的使用权 限和使用的主机

    • sudo使用时间戳文件来完成类似“检票”的系统,默认存活期为5分钟的“入 场券”

    • 通过visudo命令编辑配置文件,具有语法检查功能 visudo -c 检查语法

      visudo -f /etc/sudoers.d/test

sudoers

  • 授权规则格式:

    用户 登入主机=(代表用户) 命令

    user host=(runas) command

  • 示例:

    root ALL=(ALL) ALL

  • 格式说明:

    • user: 运行命令者的身份
    • host: 通过哪些主机
    • runas:以哪个用户的身份
    • command: 运行哪些命令

sudo别名和示例

别名

  • 别名有四种类型:User_Alias,Runas_Alias,Host_Alias,Cmnd_Alias

  • 别名格式:[A-Z]([A-Z][0-9]_)*

  • 别名定义:
    Alias_Type NAME1 = item1,item2,item3 : NAME2 = item4, item5

  • User和runas:

    • username
    • #uid
    • %group_name
    • %#gid
    • user_alias|runas_alias
  • host:

    • ip或hostname
    • network(/netmask)
    • host_alias
  • command:

    • command name
    • directory
    • sudoedit
    • Cmnd_Alias

示例

  • 示例1:

    Student ALL=(ALL) ALL

    %wheel ALL=(ALL) ALL

  • 示例2:

    student ALL=(root) /sbin/pidof,/sbin/ifconfig

    %wheel ALL=(ALL) NOPASSWD: ALL

  • 示例3:

    User_Alias NETADMIN= netuser1,netuser2

    Cmnd_Alias NETCMD = /usr/sbin/ip

    NETADMIN ALL=(root) NETCMD

  • 示例4

    User_Alias SYSADER=wang,mage,%admins

    User_Alias DISKADER=tom

    Host_Alias SERS=www.xxx.com,172.16.0.0/24

    Runas_Alias OP=root

    Cmnd_Alias SYDCMD=/bin/chown,/bin/chmod

    Cmnd_Alias DSKCMD=/sbin/parted,/sbin/fdisk

    SYSADER SERS= SYDCMD,DSKCMD

    DISKADER ALL=(OP) DSKCMD

  • 示例5:

    User_Alias ADMINUSER = adminuser1,adminuser2

    Cmnd_Alias ADMINCMD = /usr/sbin/useradd,/usr/sbin/usermod,/usr/bin/passwd [a-zA-Z]*, !/usr/bin/passwd root

    ADMINUSER ALL=(root) NOPASSWD:ADMINCMD,PASSWD:/usr/sbin/userdel

  • 示例6:

    Defaults:wang runas_default=tom

    xxx ALL=(tom,jerry) ALL

  • 示例7:

    wang 192.168.1.6,192.168.1.8=(root) /usr/sbin/,!/usr/sbin/useradd

  • 示例8:

    wang ALL=(ALL) /bin/cat /var/log/messages*

sudo命令

  • ls -l /usr/bin/sudo
  • sudo –i –u wang 切换身份
  • sudo [-u user] COMMAND
    • -V 显示版本信息等配置信息
    • -u user 默认为root
    • -l,ll 列出用户在主机上可用的和被禁止的命令
    • -v 再延长密码有效期限5分钟,更新时间戳
    • -k 清除时间戳(1970-01-01),下次需要重新输密码
    • -K 与-k类似,还要删除时间戳文件
    • -b 在后台执行指令
    • -p 改变询问密码的提示符号
    • 示例:-p ”password on %h for user %p:”

SELinux

安全扩展的Linux

  • 工作于Linux内核中

  • DAC:自主访问控制法则

    • MAC:强制访问控制
  • SELINUX工作级别:

  • strict: 每个进程都会受到selinux控制

    • argetd: 仅有限的进程受到selinux控制,只监控容易被入侵的进程
  • sandbox:

  • ubject: 进程

    • object:进程、文件
      • 文件这里:根据 open read close 等操作作selinux限制
    • SELINUX为每个文件提供安全变迁,也为进程提供了安全标签
      • user:role:type
      • user: selinux用户
      • role:角色
      • type:类型
  • selinux规则库:

    • 规则:哪种域能够访问哪种文件或那个进程等
    • 配置selinux:
      • selinux是否开启
      • 给文件重新打标签
      • 设定布尔值特性
  • selinux状态:

    • enforcing: 强制; 每个受限的进程都必须执行selinux策略
    • permissive: 启用,每个受限的进程违规操作不会禁止,但是会被记录到审计日志中
    • disabled: 关闭
  • 相关命令:

    • getenforce # 获取selinux当前状态

    • setenforce [0|1] # 设置当前selinux状态;

      • 0:设置为permissive
      • 1: 设置为enforcing
      • 临时设置;重启后会失效
    • 配置文件: /etc/selinux/config 永久生效
      SELINUX={ enforcing|permissive|disabled }

    • 给文件重新打标签:

      • chcon命令: Change the SELinux security context of each FILE to CONTEXT.
        使用方法:

        1
        2
        3
        4
        Usage: chcon [OPTION]... CONTEXT FILE...
        or: chcon [OPTION]... [-u USER] [-r ROLE] [-l RANGE] [-t TYPE] FILE...
        or: chcon [OPTION]... --reference=RFILE FILE...
        Change the SELinux security context of each FILE to CONTEXT.
      • -R : 能够递归打标签

    • 还原文件标签:

      1
      2
      3
      [root@test ~]# restorecon --help  
      usage: restorecon [-iFnprRv0] [-e excludedir] pathname...
      usage: restorecon [-iFnprRv0] [-e excludedir] -f file
    • 布尔型规则:

      • getsebool # 获取bool规则 -a 参数: 获取所有
      • setsebool # 设置bool规则
    • 设置布尔型规则:

      • setsebool [ -NPV ] boolean value | bool1=val1 bool2=val2...

Iptables

防火墙基本概念

  • 根据逻辑分类:

    • 主机防火墙: 对单个主机进行防护
      • window上的防火墙
      • 云上的安全组
    • 网络防火墙:对网络入口进行防护,防火墙的背后是本地局域网
      • 安全厂商设备
      • 云上的FaaS服务(对VPC网络进行防护)
    • 主机防火墙(个人)和网络防火墙(集体)相辅相成的
  • 根据物理分类

    • 物理防火墙: 硬件级别实现部分防火墙功能;性能高,但是成本也高
    • 软件防火墙: 应用软件出力逻辑运行于通用硬件平台上的防火墙;成本低,但是性能低
  • IPtables: 是一个客户端代理软件,用于将用户安全设定执行到对应的“安全框架”中;所以它能够实现的是软件防火墙

  • “安全框架” - Netfilter 位于在内核中

    • Netfilter - 内核空间;是真正去实现软件防火墙功能

    • Iptables - 用户空间;是一个用户空间的客户端代理软件

    • 在用户空间中使用IPtables工具,将安全策略执行到内核空间中netfilter上从而来实现
      Linux主机上的防火墙功能

    • Netfilter是Linux操作系统下的包过滤防火墙的“安全框架”(免费);所以说IPtables没有守护进程,不是真正的服务,而是内核提供的功能

    • 功能:

      • 网络地址转换
      • 数据包内容修改
      • 数据包过滤的防火墙功能

IPtables基础

  • IPtables能够根据它的rule匹配而进对数据包进行处理:accept drop reject

    • 不同的处理方式 -> 动作
  • rule存储在内核空间的信息过滤表中,这些规则指定:SIP DIP 传输协议类型(Tcp/Udp)等等

  • Netfilter 位于在内核空间中,设置了”关卡”: Input Output等等

  • 网卡的驱动也是位于内核空间中,所以IPtables+Netfilter可以在内核空间中设置“关卡”,
    当用户去访问应用服务的时候,数据包是通过网卡流经内核空间之后到达用户空间

  • 如果我们的报文需要转发,则不会经过Input和output链(即不会从用户空间绕一圈);只需要通过prerouting FORWARD postrouting链

    • Input链 和 Output链 : 作用于数据包于用户空间和内核空间的流入流出
    • prerouting FORWARD postrouting链: 在内核空间中关于数据包的流入流出及转发
  • 常见应用场景:

    • 到本地某个进程(服务)的报文: prerouting -> input -> ouput -> postrouting
    • 由本地进行转发的报文: prerouting -> forward -> postrouting

IPtables缺点

高并发的情况下,不建议开启IPtables,会影响性能。

没有绝对安全的操作系统,虽然防火墙有这些缺点,但还是能阻挡大多数来自于外网的攻击!

  1. 防火墙虽然可以过滤互联网的数据包,但却无法过滤内部网络的数据包。因此若有人从内部网络攻击时,防火墙没有作用。
  2. 电脑本身的操作系统亦可能因一些系统漏洞,使入侵者可以利用这些漏洞绕过防火墙过滤,从而入侵电脑。
  3. 防火墙无法有效阻挡病毒攻击,尤其是隐藏在数据中的病毒。
  4. 正常状况下,所有互联网的数据包软件都应经过防火墙的过滤,这将造成网络交通的瓶颈。例如在攻击性数据包出现时,攻击者会不时寄出数据包,让防火墙疲于过滤数据包,而使一些合法数据包软件亦无法正常进出防火墙。

链的概念

  • 防火墙的作用在于对经过的报文匹配“规则”,然后执行相对应的动作,如果有多个“规则”组合到一起,那么我们就称之“链”
  • 每经过一条链则需要把所有规则都匹配一遍;如果有符合条件的规则,则执行相应动作即可
  • 简单来说:多个规则组成链,经过链时,链上的所有规则需要匹配一遍,符合规则的条件,执行相应动作
  • prerouting链:对数据包作路由选择前应用此链中的规则(所有的数据包进来的时侯都先由这个链处理)
  • input链:进来的数据包应用此规则链中的策略
  • forward链:转发数据包时应用此规则链中的策略
  • output链:外出的数据包应用此规则链中的策略
  • postrouting链: 对数据包作路由选择后应用此链中的规则(所有的数据包出来的时侯都先由这个链处理)

表的概念

  • 每个链上都有一些规则,但是有许多相似的规则,这些规则可能是:

    • 对IP或者端口进行过滤
    • 对报文进行修改
    • 对网络地址进行转化
      ….
  • 把这些功能相似的规则的集合称之为“表”; 多张表的规则的集合叫做“链”

  • IPtables所有规则的定义:都是去定义到不同的表中

  • IPtables表:

    • raw表:决定是否开启nat上启动的连接追踪机制; iptable_raw模块
    • mangle表:解析报文,做出修改,并重新封装的功能; iptable_mangle模块
    • nat表: 网络地址转换; iptable_nat模块
    • filter表:负责过滤功能(包过滤防火墙使用到的表);iptables_filter模块
  • 表存在优先级:raw -> mangle -> nat -> filter ; 优先级越高的表中规则优先匹配处理

表链关系

  • 是不是每类链上的规则都会存在于4张表中? 肯定不是;每个链只能有某些规则 -> 拥有某些表

  • 总结:每个链中的规则都会存在于哪些表中

    • prerouting链: raw mangle nat
    • input链: mangle filter nat
    • forward链: mangle filter
    • output链:raw mangle nat filter
    • postrouting链: mangle nat
  • 实际操作过程中,往往都是通过表为操作入口,查看表中对应的规则,以及该表上规则所作用的“链”
    表 —— 链

    • raw表:prerouting output
    • mangle表: prerouting input output forward postrouting
    • nat表: prerouting input output postrouting
    • filter表: input forward output
  • 当一个数据包经过一个“链”的时候,会将当前链上的所有规则进行匹配,而定义的规则都汇聚到表中;匹配时,因此会存在于优先级,所以就拥有了表的优先级

  • 注意:想要主机支持转发功能,需要开启内核中ip_forward参数

1
echo "1">/proc/sys/net/ipv4/ip_forward

image-20200505160351522

规则概念

image-20200505162214040

  • 匹配条件 + 动作

  • 规则:规则指定的匹配条件来尝试匹配流经的报文,一旦匹配成功,则由规则后面指定的处理动作进行处理,并不再进行匹配,LOG除外。若未匹配到规则,则按默认的规则处理。

  • 匹配条件:

    • 基本匹配条件: SIP DIP等等
    • 扩展匹配条件: Sport Dport等等
    • 扩展匹配条件也是Netfilter中的一部分,以模块插件的形式存在,如果想要使用,则需要依赖对应的模块
  • 处理动作:在IPtables中称之为“target”

    • 常用动作:
      • ACCEPT: 允许数据包通过
      • DROP:直接丢弃数据包,没有任何响应信息
      • REJECT:拒绝数据包通过,必要的时候会向发送端发送一个响应的拒接消息
      • SNAT:源地址转换,解决内网用户同一个公网地址上网问题
      • MASQUERADE: 是SNAT的一种特殊处理动作,适用于动态的,临时会变的公网IP地址
      • DNAT:目的地址转换,解决外部网络访问内部局域网中的服务
      • REDIRECT:在本地端口做端口映射,即重定向
      • LOG:/var/log/message系统日志文件中记录日志信息,然后将数据包传递给下一条匹配条件,不催数据包做任何处理,只是进行记录
  • 规则查询: 以filter表进行操作,filter负责过滤功能
    [root@test ~]# iptables -t filter -L

    • -t: 指定表

    • -L: 列出表中的规则,默认是所有链的规则

      1
      2
      3
      [root@test ~]# iptables -t filter -vnL INPUT
      Chain INPUT (policy ACCEPT 172 packets, 12678 bytes)
      pkts bytes target prot opt in out source destination
    • -v : 显示详细信息

    • -n : 展开数字

    • –line-numbers: 显示有序序号

    • policy : 当前链的默认策略

    • packets: 当前链默认策略匹配到的包的数量

    • bytes: 当前链默认策略匹配到的包的大小总和

    • pkts: 对应匹配到的报文个数

    • bytes: 对应匹配到的报文大小综合

    • target: 规则对应的处理动作

    • prot: 规则对应的传输协议

    • opt: 规格对应的选项

    • in: 数据包由哪个接口流入

    • out:数据包由哪个接口流出

      • 即设置哪块网卡的报文需要匹配当前规则
    • source: 规则对应的SIP

    • destination: 规则对应的DIP

  • 规则操作 : 增删改

    iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型]

    • 增: iptables -t filter -A INPUT -s x.x.x.x -j <action>
      实例1: [root@test ~]# iptables -t filter -A INPUT -s 172.16.0.1 -j DROP # 关于源地址为172.16.0.1/16主机数据包报文的流入给drop掉

      • -A : 追加

      • -I :在链的开头插入 在链名后可加数字代表第几个序列

        iptables -t filter -I INPUT 2 -p icmp -j ACCEPT

    • -j :匹配条件中的所对应动作

    • 清除规则:iptables -t <tables..> -F <chains…>

      • 方法1:根据规则的编号去删除规则

      • 方法2:根据具体的匹配条件去删除规则

      • -D:删除指定链中的规则

      iptables -D INPUT 3

      • -F:删除操作,清空当前表的所有规则
    • 修改规则:
      [root@test ~]# iptables -t filter -R INPUT 1 -s 172.16.10.0/24 -j ACCEPT
      [root@test ~]# iptables -t filter -P FORWARD DROP

      • -R:修改规则
      • -P:修改链的默认规则的处理动作
    • 保存规则:
      iptables-save > /etc/sysconfig/iptables # 是系统启动后可导入的规则

    • 导入规则:
      iptables-restore < /etc/sysconfig/iptables

  • 注意事项:

    • 不指定表名,默认指filter表
    • 不指定链名,默认指表内的所有链
    • 除非设置链的默认策略,否则必须指定匹配条件
    • 选项、链名、控制类型使用大写字母,其余均为小写字母

匹配条件

  • 基本条件:

    • -s:指定源地址

    • -d:指定目的地址

    • -p:指定协议类型

    • -i / -o : 指定网卡流入和流出

      • -i : prerouting INPUT FORWARD
      • -o : output postrouting
    • tcp/udp扩展模块

      • –sport: 指定源端口
      • –dport:指定目的端口
    • –icmp-type ICMP类型

      示例:我可以ping别人,别人不能ping通我

      iptables -I INPUT -p icmp --icmp-type 0 -i ACCEPT

      iptables -I INPUT 2 -p icmp --icmp-type 3 -i ACCEPT

  • 扩展条件:-m 需要模块支持

    • tcp/udp扩展模块
      • multiport 多端口 (,不连续;- 连续)
        • –sports: 指定源端口
        • –dports:指定目的端口
    • iprange扩展模块
      • –src-range: 指定源地址范围
      • –dst-range:指定目的地址范围
    • string扩展模块:指定匹配报文中的字符串
      • –algo: 指定匹配算法(bm和kmp)
      • –string: 指定需要匹配的字符串
    • time扩展模块:时间段匹配,如果报文在到达时间范围内,则符合匹配条件
      • –timestart [起始时间] –tiemstop [结束时间]
      • –weekdays: 指定星期
      • –mouthdays: 指定日
      • –datastart [起始日期] –datastop [结束日期]
    • connlimit扩展模块:限制每个IP地址同时连接到Server端的连接数量,不需要指定IP地址,默认就是针对每个客户端IP地址
      • –connlimit-above : 限制每个客户端IP的并发连接数量;如果高于此数量则执行响应动作
      • –connlimit-upto : 限制每个客户端IP的并发连接数量;如果低于次数量则执行响应动作
    • state
      • –state 连接状态
    • mac
      • –mac-source 指定源mac地址

自定义链

当默认链的规则非常多的时候,不方便我们管理,如果INPUT链中放置了几百条规则,我们可以针对不同服务(httpd ftp mysql);有针对性将规则放置到自定义链中,在其他5个链进行引用即可,此时当我们想要去修改关于某个服务的规则时,只需要去对应的自定义链中修改即可

  • 创建自定义链:
1
2
3
[root@test ~]# iptables -t filter -N httpd
[root@test ~]# iptables -t filter -I httpd -s 172.16.0.0/16 -p icmp -j REJECT
[root@test ~]# iptables -t filter -I INPUT -j httpd # 去引用自定义链中的规则
  • -N: 创建自定链

  • 关于自定义链的增删改查同上

  • 删除自定义链:

    1
    2
    3
    [root@test ~]# iptables -t filter -F httpd		# 1.清除自定义链中的规则	
    [root@test ~]# iptables -t filter -D INPUT 1 # 2.删除引用自定义链中的相关规则
    [root@test ~]# iptables -t filter -X httpd # 3.通过-X参数删除自定义链
    • 关于删除自定义链规则:
      1. 自定义链中没有任何默认链的引用,即引用参数refer为0
      2. 自定义链中不能有任何规则,即自定义链为空

实验操作

1.批量添加防火墙的脚本(参考,自行更改)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/1ocal/ sbin:~/bin
export PATH

function support_distro(){
if[ -z "`egrep -i "centos" /etc/issue`" ];then
echo" Sorry,iptables script only support centos system now. "
exit 1
fi

support_distro

echo "=======================iptables configure======================="
# Only support CentOs system

#获取SSH端口
if grep "^Port" /etc/ssh/sshd_config>/dev/null;then
sshdport=`grep "^Port" /etc/ssh/sshd config|sed "s/Port\s//g"`
else
sshdport=22
fi

#获取DNS服务器IP
if [ -s /etc/resolv.conf ];then
nameserver1=`cat /etc/reso1v.conf|grep nameserver | awk 'NR==1{print $2 }'`
nameserver1=`cat /etc/reso1v.conf|grep nameserver | awk 'NR==2{print $2 }'`
fi

IPT="/sbin/iptables"

#删除已有规则
$IPT --delete-chain
$IPT --flush

#禁止进,允许出,允许回环网卡
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT ACCEPT
$IPT -A INPUT -i lo -j ACCEPT

#允许已建立的或相关连接的通行
$IPT -A INPUT -m state --state RELATED, ESTABLISHED -j ACCEPT
$IPT -A OUTPUT -m state --state RELATED, ESTABLISHED -j ACCEPT

#限制80端口单个IP的最大连接数为10
$IPT -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 10 -j DROP

#允许80 (HTTP) /873 (RSYNC) /443 (HTTPS) /20,21 (FTP) /25 (SMTP)端口的连接
$IPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
$IPT -A INPUT -p tcp -m tcp --dport 873 -j ACCEPT
$IPT -A INPUT -p tcp -m tcp --dport 443 - j ACCEPT
$IPT -A INPUT -p tcp -m tcp --dport 20 -j ACCEPT
$IPT -A INPUT -P tcp -m tcp --dport 21 -j ACCEPT
$IPT -A INPUT -P tcp -m tcp --dport 25 -j ACCEPT

#允许SSH端口的连接,脚本自动侦测目前的SSH端口,否则默认为22端口
$IPT -A INPUT -P tcp -m tcp --dport $sshdport -j ACCEPT

#允许ping
$IPT -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
$IPT -A INPUT -P icmp -m icmp --icmp-type 11 -j ACCEPT

#允许DNS
[ ! -z "$nameserver1" ] && $IPT -A OUTPUT -p udp -m udp -d $nameserver1 --dport 53 -j ACCEPT
[ ! -z "$nameserver2" ] && $IPT -A OUTPUT -p udp -m udp -d $nameserver2 --dport 53 - j ACCEPT

#保存规则并重启IPTABLES
iptables save
systemctl restart iptables
echo "==================iptables configure completed=================="

2.网络地址转换

1
2
3
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
#重启后失效

SNAT:将内网地址转化为公网地址

一个数据包在经过路由之后(或者说在通过防火墙的过滤之后)才被知道他的源IP是谁,在路由之前只能看到目标IP,如果我看不到你的源IP,那怎么匹配想过滤的数据包并进行源地址转换?我防火墙根本就不能确定你是否是符合匹配条件的IP,所以只能使用POSTROUTING

iptables -t nat -A POSTROUTING -s 192.168.123.0/24 -j SNAT --to-source 10.0.0.1

DNAT:将公网地址转化为内网地址

如果我不在路由之前就把目标地址转换完成,很显然当数据包到达入口IP之后,他的目的已经达到了,因为他本来的目标IP就是防火墙的对外公网IP,那么数据包还会往里面走吗?显然不可能了,所以只能使用PREROUTING

iptables -t nat -A PREROUTING -d 10.0.0.1 -j DNAT --to-destination 192.168.123.0

3.删除已有规则
在开始创建iptables规则之前,你也许需要删除已有规则。命令如下:

1
2
3
iptables -F
(or)
iptables –flush

4.设置链的默认策略
链的默认政策设置为”ACCEPT”(接受),若要将INPUT,FORWARD,OUTPUT链设置成”DROP”(拒
绝),命令如下:

1
2
3
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

当INPUT链和OUTPUT链都设置成DROP时,对于每一个防火墙规则,我们都应该定义两个规则。例如:一个传入另一个传出。在下面所有的例子中,由于我们已将DROP设置成INPUT链和OUTPUT链的默认策略,每种情况我们都将制定两条规则。当然,如果你相信你的内部用户,则可以省略上面的最后一行。例如:默认不丢弃所有出站的数据包。在这种情况下,对于每一个防火墙规则要求,你只需要制定一个规则——只对进站的数据包制定规则。
5. 阻止指定IP地址
例:丢弃来自IP地址x.x.x.x的包

1
2
BLOCK_THIS_IP="x.x.x.x"
iptables -A INPUT -s "$BLOCK_THIS_IP" -j DROP

注:当你在log里发现来自某ip地址的异常记录,可以通过此命令暂时阻止该地址的访问以做更深入分析
例:阻止来自IP地址x.x.x.x eth0 tcp的包

1
2
iptables -A INPUT -i eth0 -s "$BLOCK_THIS_IP" -j DROP
iptables -A INPUT -i eth0 -p tcp -s "$BLOCK_THIS_IP" -j DROP

6.允许所有SSH的连接请求
例:允许所有来自外部的SSH连接请求,即只允许进入eth0接口,并且目标端口为22的数据包

1
2
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

7.仅允许来自指定网络的SSH连接请求
例:仅允许来自于192.168.100.0/24域的用户的ssh连接请求

1
2
3
iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j
ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

8.允许http和https的连接请求
例:允许所有来自web - http的连接请求

1
2
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

例:允许所有来自web - https的连接请求

1
2
iptables -A INPUT -i eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT

9.使用multiport 将多个规则结合在一起
允许多个端口从外界连入,除了为每个端口都写一条独立的规则外,我们可以用multiport将其组合成一
条规则。如下所示:
例:允许所有ssh,http,https的流量访问

1
2
3
4
iptables -A INPUT -i eth0 -p tcp -m multiport --dports 22,80,443 -m state --state NEW,ESTABLISHED
-j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -m multiport --sports 22,80,443 -m state --state ESTABLISHED -j
ACCEPT

10.允许从本地发起的SSH

1
2
iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

请注意,这与允许ssh连入的规则略有不同。本例在OUTPUT链上,我们允许NEW和ESTABLISHED状态。
在INPUT链上,我们只允许ESTABLISHED状态。ssh连入的规则与之相反。
11.仅允许从本地发起到一个指定的网络域的SSH请求
例:仅允许从内部连接到网域192.168.100.0/24

1
2
3
iptables -A OUTPUT -o eth0 -p tcp -d 192.168.100.0/24 --dport 22 -m state --state
NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

12.允许从本地发起的HTTPS连接请求
下面的规则允许输出安全的网络流量。如果你想允许用户访问互联网,这是非常有必要的。在服务器上,这些规则能让你使用wget从外部下载一些文件

1
2
iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT

注:对于HTTP web流量的外联请求,只需要将上述命令中的端口从443改成80即可。
13.负载平衡传入的网络流量
使用iptables可以实现传入web流量的负载均衡,我们可以传入web流量负载平衡使用iptables防火墙规则。
例:使用iptables nth将HTTPS流量负载平衡至三个不同的ip地址。

1
2
3
4
5
6
iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every
3 --packet 0 -j DNAT --to-destination 192.168.1.101:443
iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every
3 --packet 1 -j DNAT --to-destination 192.168.1.102:443
iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every
3 --packet 2 -j DNAT --to-destination 192.168.1.103:443

14.允许外部主机ping内部主机

1
2
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT

15.允许内部主机ping外部主机

1
2
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT

16.允许回环访问
例:在服务器上允许127.0.0.1回环访问。

1
2
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

17.允许内部网络域外部网络的通信
防火墙服务器上的其中一个网卡连接到外部,另一个网卡连接到内部服务器,使用以下规则允许内部网
络与外部网络的通信。此例中,eth1连接到外部网络(互联网),eth0连接到内部网络(例
如:192.168.1.x)。

1
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT

18.允许出站的DNS连接

1
2
iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT
iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT

19.允许NIS连接
如果你使用NIS管理用户帐户,你需要允许NIS连接。如果你不允许NIS相关的ypbind连接请求,即使
SSH连接请求已被允许,用户仍然无法登录。NIS的端口是动态的,先使用命令rpcinfo –p来知道端口
号,此例中为853和850端口。

1
rpcinfo -p | grep ypbind

例:允许来自111端口以及ypbind使用端口的连接请求

1
2
3
4
5
6
iptables -A INPUT -p tcp --dport 111 -j ACCEPT
iptables -A INPUT -p udp --dport 111 -j ACCEPT
iptables -A INPUT -p tcp --dport 853 -j ACCEPT
iptables -A INPUT -p udp --dport 853 -j ACCEPT
iptables -A INPUT -p tcp --dport 850 -j ACCEPT
iptables -A INPUT -p udp --dport 850 -j ACCEPT

注:当你重启ypbind之后端口将不同,上述命令将无效。有两种解决方案:1)使用你NIS的静态IP 2)
编写shell脚本通过“rpcinfo - p”命令自动获取动态端口号,并在上述iptables规则中使用。
20.允许来自指定网络的rsync连接请求
例:允许来自网络192.168.101.0/24的rsync连接请求

1
2
3
iptables -A INPUT -i eth0 -p tcp -s 192.168.101.0/24 --dport 873 -m state --state NEW,ESTABLISHED
-j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 873 -m state --state ESTABLISHED -j ACCEPT

21.允许来自指定网络的MySQL连接请求
很多情况下,MySQL数据库与web服务跑在同一台服务器上。有时候我们仅希望DBA和开发人员从内部
网络(192.168.100.0/24)直接登录数据库,可尝试以下命令:

1
2
3
iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 3306 -m state --state
NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT

22.允许Sendmail, Postfix邮件服务
Sendmail和postfix都使用了25端口,因此我们只需要允许来自25端口的连接请求即可。

1
2
iptables -A INPUT -i eth0 -p tcp --dport 25 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT

23.允许IMAP和IMAPS
例:允许IMAP/IMAP2流量,端口为143

1
2
iptables -A INPUT -i eth0 -p tcp --dport 143 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 143 -m state --state ESTABLISHED -j ACCEPT

例:允许IMAPS流量,端口为993

1
2
iptables -A INPUT -i eth0 -p tcp --dport 993 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 993 -m state --state ESTABLISHED -j ACCEPT

24.允许POP3和POP3S
例:允许POP3访问

1
2
iptables -A INPUT -i eth0 -p tcp --dport 110 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 110 -m state --state ESTABLISHED -j ACCEPT

例:允许POP3S访问

1
2
iptables -A INPUT -i eth0 -p tcp --dport 995 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 995 -m state --state ESTABLISHED -j ACCEPT

25.防止DoS攻击

1
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT

上述例子中:
-m limit: 启用limit扩展
–limit 25/minute: 允许最多每分钟25个连接(根据需求更改)。
–limit-burst 100: 只有当连接达到limit-burst水平(此例为100)时才启用上述limit/minute限制。
26.端口转发
例:将来自422端口的流量全部转到22端口。
这意味着我们既能通过422端口又能通过22端口进行ssh连接。启用DNAT转发。

1
iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 --dport 422 -j DNAT --to 192.168.102.37:22

除此之外,还需要允许连接到422端口的请求

1
2
iptables -A INPUT -i eth0 -p tcp --dport 422 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 422 -m state --state ESTABLISHED -j ACCEPT

27.记录丢弃的数据表
第一步:新建名为LOGGING的链

1
iptables -N LOGGING

第二步:将所有来自INPUT链中的数据包跳转到LOGGING链中

1
iptables -A INPUT -j LOGGING

第三步:为这些包自定义个前缀,命名为”IPTables Packet Dropped”

1
iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables Packet Dropped: " --loglevel 7

第四步:丢弃这些数据包

1
iptables -A LOGGING -j DROP  

Firewalld

  • 动态防火墙后台服务程序:提供一个动态管理的防火墙,用以支持网络“Zone”,来分配对一个
    网络链接和界面一定程序的信息,它具备对IPv4和Ipv6防火墙设置的支持

  • 它支持以太网桥,并有分离运行时间和永久配置选项,可以通过服务程序直接增加规则

  • 图形化配置工具:firewall-config

  • 命令行配置工具:firewall-cmd

  • 用于配置firewalld服务永久性或者非永久性运行时间的改变,它依次用IPtables工具与执行
    数据包筛选的内核中Netfilter通信

Firewalld和IPtables的关系

  1. firewalld和IPtables本身都不具备防火墙功能
  2. 他们都是在用户空间将执行规则放到内核空间的“安全框架”- Netfilter中去实现

Firewalld和IPtables的区别

  1. iptables 在 /etc/sysconfig/iptables-config中存放IPtables规则设置;Firewalld 在
    /usr/lib/firewalld/* 中进行系统配置和/etc/firewalld/* 中关于服务xml文件格式的配置
  2. 在使用IPtables的时候,每去操作一条规则立即生效
  3. Firewalld不会创建任何新的规则,仅仅运行规则中的不同之处,因此Firewalld可以在运行时间内改变配置而不丢失现有的连接

Zone区域

不同区域对于网络连接的设置规范不同

  • 区域 默认策略规则
    trusted 允许所有的数据包
    home 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、mdns、ipp-client、 amba-client与dhcpv6-client服务相关,则允许流量
    internal 等同于home区域
    work 拒绝流入的流量,除非与流出的流量数相关;而如果流量与ssh、ipp-client与 dhcpv6-client服务相关,则允许流量
    public 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、dhcpv6-client服务相 关,则允许流量
    external 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh服务相关,则允许流量
    dmz 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh服务相关,则允许流量
    block 拒绝流入的流量,除非与流出的流量相关
    drop 拒绝流入的流量,除非与流出的流量相关

管理防火墙

每个zone中都有一套规则集,对于接收到的请求具体使用哪个zone,Firewalld通过三种方式来判断

  1. source 源地址优先级最高
  2. Interface 接收请求的网卡
  3. firewall.config 中配置的默认zone
1
2
[root@test ~]# cat /etc/firewalld/firewalld.conf | grep Zone
DefaultZone=public
  • 查看默认zone: [root@test ~]# firewall-cmd --get-default-zone
  • 设置默认zone: --set-default-zone=<zone>
  • 查看当前firewalld状态: [root@test ~]# firewall-cmd --state
  • 查看当前活动的zone:[root@test ~]# firewall-cmd --get-active-zones
  • 列出所有可用zone: [root@test ~]# firewall-cmd --list-all-zones
  • 列出所有区域设置:--list-all
  • 列出所有预定服务:--get-services # 所有已经设定好的可直接使用的服务规则
  • 将某个网络地址放置/移除某个zone
    --add-source=<source>[/<mask>]|<MAC>|ipset:<ipset>
    --remove-source=<source>[/<mask>]|<MAC>|ipset:<ipset>

管理操作

参数 作用
–get-default-zone 查询默认的区域名称
–set-default-zone=<区域名称> 设置默认的区域,使其永久生效
–get-zones 显示可用的区域
–get-services 显示预先定义的服务
–get-active-zones 显示当前正在使用的区域与网卡名称
–add-source= 将源自此IP或子网的流量导向指定的区域
–remove-source= 不再将源自此IP或子网的流量导向某个指定区域
–add-interface=<网卡名称> 将源自该网卡的所有流量都导向某个指定区域
–change-interface=<网卡名称> 将某个网卡与区域进行关联
–list-all 显示当前区域的网卡配置参数、资源、端口以及服务等信息
–list-all-zones 显示所有区域的网卡配置参数、资源、端口以及服务等信息
–add-service=<服务名> 设置默认区域允许该服务的流量
–add-port=<端口号/协议> 设置默认区域允许该端口的流量
–remove-service=<服务名> 设置默认区域不再允许该服务的流量
–remove-port=<端口号/协议> 设置默认区域不再允许该端口的流量
–reload 让“永久生效”的配置规则立即生效,并覆盖当前的配置规则
–panic-on 开启应急状况模式
–panic-off 关闭应急状况模式
  • 添加、删除、改变网络接口到制定域中(域中会有一条规则)
    • --list-interfaces
    • --add-interface=<interface>
    • --change-interface=<interface>
    • --remove-interface=<interface>
    • --query-interface=<interface>
  • 添加、删除、列出服务
    • --get-services
    • --delete-service=<service>
    • --add-service=<service>
    • --list-services
    • --remove-service=<service>
    • --query-service=<service>
  • 列出、添加、删除端口
    • --list-ports List ports added for a zone [P] [Z]
    • --add-port=<portid>[-<portid>]/<protocol>
    • --remove-port=<portid>[-<portid>]/<protocol>
    • --query-port=<portid>[-<portid>]/<protocol>
  • 永久生效: --permanent
  • 重载防火墙: --reload

实验操作

1.查看firewalld服务当前所使用的区域

1
2
[root@localhost ~]# firewall-cmd --get-default-zone
public

2.查询ens33网卡再firewalld服务中的区域

1
2
[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens33
public

3.把firewalld服务中ens33网卡的默认区域修改为external,并在系统重启后生效。分别查看当前与永久模式下的区域名称

1
2
3
4
5
6
7
[root@localhost ~]# firewall-cmd --permanent --zone=external --changeinterface=ens33
The interface is under control of NetworkManager, setting zone to 'external'.
success
[root@localhost ~]# firewall-cmd --permanent --get-zone-of-interface=ens33
no zone
[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens33
external

4.把firewalld服务的当前默认区域设置为public

1
2
3
4
5
[root@localhost ~]# firewall-cmd --set-default-zone=public
Warning: ZONE_ALREADY_SET: public
success
[root@localhost ~]# firewall-cmd --get-default-zone
public

5.启动/关闭firewalld防火墙服务的应急状况模式,阻断一切网络连接(当远程控制服务器时请慎用)

1
2
[root@localhost ~]# firewall-cmd --panic-on
[root@localhost ~]# firewall-cmd --panic-off

6.查询public区域是否允许请求SSH和HTTPS协议的流量

1
2
3
4
[root@localhost ~]# firewall-cmd --zone=public --query-service=ssh
yes
[root@localhost ~]# firewall-cmd --zone=public --query-service=https
no

7.把firewalld服务中请求HTTPS协议的流量设置为永久允许,并立即生效

1
2
3
4
5
6
7
8
[root@localhost ~]# firewall-cmd --zone=public --add-service=https
success
[root@localhost ~]# firewall-cmd --permanent --zone=public --add-service=https
success
[root@localhost ~]# firewall-cmd --reload
success
[root@localhost ~]# firewall-cmd --zone=public --query-service=https
yes

8.把firewalld服务中请求HTTP协议的流量设置为永久拒绝,并立即生效

1
2
3
4
5
[root@localhost ~]# firewall-cmd --zone=public --remove-service=https --
permanent
success
[root@localhost ~]# firewall-cmd --reload
success

9.把在firewalld服务中访问8080和8081端口的流量策略设置为允许,但仅限当前生效

1
2
3
4
[root@localhost ~]# firewall-cmd --zone=public --add-port=8080-8081/tcp
success
[root@localhost ~]# firewall-cmd --zone=public --list-ports
8080-8081/tcp

10.把原本访问本机888端口的流量转发到22端口,要且求当前和长期均有效
firewall-cmd --permanent --zone=<区域> --add-forward-port=port= <源端口号>:proto=<协议 \>:toport=<目标端口号>:toaddr=<目标IP地址>

1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# firewall-cmd --permanent --zone=public --add-forwardport=port=888:proto=tcp:toport=22:toaddr=192.168.91.128
success


[c:\~]$ ssh root@192.168.91.128 888
Connecting to 192.168.91.128:888...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
Last login: Thu Apr 18 16:20:23 2019 from 192.168.91.1
[root@localhost ~]#

firewalld中的富规则表示更细致、更详细的防火墙策略配置,它可以针对系统服务、端口号、源地址和
目标地址等诸多信息进行更有针对性的策略配置。它的优先级在所有的防火墙策略中也是最高的。比
如,我们可以在firewalld服务中配置一条富规则,使其拒绝192.168.91.0/24网段的所有用户访问本机的
ssh服务(22端口)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@localhost ~]# firewall-cmd --permanent --zone=public --add-rich-rule="rule
\ f
amily="ipv4" \
source address="192.168.91.0/24" \
service name="ssh" \
reject"
success
[root@localhost ~]# firewall-cmd --reload
success


[c:\~]$ ssh root@192.168.91.128
Connecting to 192.168.91.128:22...
Could not connect to '192.168.91.128' (port 22): Connection failed.