20170912 加密和安全(三)

  • SSH服务器
  • dropbear
  • AIDE
  • sudo
  • TCP-Wrapper
  • PAM认证机制

一、SSH服务器:

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

  • 常用参数:

Port  22                     //默认端口号
ListenAddress ip             //监听地址,可以设置成内部地址,防止攻击
LoginGraceTime 2m            //登录超时时间
PermitRootLogin yes          //允许root账户登录
StrictModes yes              //登录前检查用户家目录和文件的权限以及所有者信息
MaxAuthTries 6               //登录认证最多尝试次数,尝试次数=设置次数/2
MaxSessions 10               //每个网络连接的最大会话连接数
PubkeyAuthentication yes     //允许基于Key的验证
PermitEmptyPasswords no      //不允许空密码
PasswordAuthentication yes   //允许基于密码验证
ClientAliveInterval          //长期没有数据连接的时间(单位:秒)算作一次
ClientAliveCountMax          //长期没有数据连接的次数达到设置次数(默认3)断开
UseDNS yes                   //将ip反向解析为域名,改为no可以提高连接速度
GSSAPIAuthentication yes     //GSSAPI验证,改为no可以提高连接速度
MaxStartups 10:30:100        //控制用户连接个数,10个以上的连接按照30%的概率被杀死,100个以上的连接全部杀死
Banner /path/file            //提示信息文件
AllowUsers user1 user2 user3     //允许登录用户
DenyUsers user1 user2 user3      //禁止登录用户
AllowGroups groups groups2       //允许登录组
DenyGroups  groups groups2       //禁止登录组
  • ssh服务器推荐的设置
    • 要使用默认端口
    • 禁止使用protocol version 1
    • 限制可登录用户
    • 设定空闲会话超时时长
    • 利用防火墙设置ssh访问策略
    • 仅监听特定的IP地址
    • 基于口令认证时,使用强密码策略
    • 使用基于密钥的认证
    • 禁止使用空密码
    • 禁止root用户直接登录
    • 限制ssh的访问频度和并发在线数
    • 做好日志,经常分析 /etc/log/secure

二、dropbear:

  • dropbear:ssh协议的轻量级实现

  • 编译安装dropbear

    • 安装准备:
      (1) 安装开发包组:yum groupinstall "Development Tools"
      (2) 下载dropbear-2017.75.tar.bz2
      (3) 解压缩:tar xf dropbear-2017.75.tar.bz2
      (4) 进入解压缩目录:cd dropbear-2017.75
      (5) 查看帮助文件:less INSTALL less README
    • 编译安装过程
      (1) ./configure
      (2) make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp"
      (3) make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" install
  • 启动ssh服务
    (1) 建立公钥和私钥的存放目录:mkdir /etc/dropbear
    (2) 生成密钥对:dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key -s 2048 dropbearkey -t dsa -f /etc/dropbear/dropbear_dsa_host_key
    (3) 修改端口号:
    (4) 启动服务:dropbear -p :2222 -F -E-F: 前台运行, -E: 显示日志信息
    dropbear -p :2222后台运行

  • 客户端登录
    dbclient -p 2222 user@ip_addr

三、AIDE:

(一)AIDE基本概念:

  • 定义:AIDE(Advanced Intrusion Detection Environment)高级入侵检测环境,用于检查文件完整性,审计哪些文件被修改过

  • 配置文件:/etc/aide.conf,可以规定监控的文件范围

  • 工作原理:构造指定文件的数据库,可以存储文件的各种属性,包括:权限(permission)、索引节点序号(inode number)、所属用户(user)、所属用户组(group)、文件大小、最后修改时间(mtime)、创建时间(ctime)、最后访问时间(atime)、增加的大小、散列值等。通过将当前文件的属性与数据库中做对比,审计文件的修改情况。

  • 不应监控经常变动的数据,基本不变的二进制程序应该监控。

(二)配置监控文件范围

  • 格式:文件路径 监控属性代码
    !文件路径 忽略对专门文件的监控

  • 监控属性代码:
    p 权限
    i 索引节点
    n 链接数
    u 用户
    g 组
    s 大小
    m 最后一次修改时间
    c 创建时间
    md5 md5校验值
    R=p+i+n+u+g+s+m+c+acl+selinux+xattrs+md5

(三)监控操作

  • 初始化默认的AIDE的库:aide --init

  • 生成检查数据库(建议初始数据库存放到安全的地方)
    cd /var/lib/aide
    mv aide.db.new.gz aide.db.gz

  • 检测:aide --check

  • 更新数据库:aide --update

  • 实验:AIDE监控
    监控/usr/bin和/usr/sbin目录下文件(排除/usr/sbin/chroot)的权限、索引节点、所有者、所属组、大小、最近的修改时间、创建时间、sha512值的变化

    • 编辑文件:/etc/aide.conf,添加如下内容
      /usr/bin p+i+u+g+s+m+c+sha512
      /usr/sbin p+i+u+g+s+m+c+sha512
      !/usr/sbin/chroot
    • 初始化数据库:aide --init
    • 修改文件/usr/bin/ls,/usr/sbin/passwd, /usr/sbin/chroot,做好备份
      cp -a /usr/bin/ls{,.bak}
      cp -a /usr/sbin/fdisk{,.bak}
      cp -a /usr/sbin/chroot{,.bak}
      echo >> /usr/bin/ls
      echo >> /usr/sbin/fdisk
      echo >> /usr/sbin/chroot
    • 生成检查数据库:
      cd /var/lib/aide 进入数据库存放目录
      cp aide.db.new.gz aide.db.gz 原数据库备份
    • 检查检测结果:aide --check

四、sudo

(一)功能:

  • 授权指定用户在指定主机执行指定命令
  • 管理员通过配置文件集中管理用户的使用权限
  • 通过日志文件记录sudo操作
  • 通过时间戳允许用户在规定时间范围内无需重复输入用户密码,默认5分钟

(二)配置sudo

(1)配置文件
  • 配置文件:/etc/sudoers(只读文件)
    配置文件存储路径:/etc/sudoer.d/
  • 时间戳文件:/var/db/sudo
  • 日志文件:/var/log/secure
  • 通过visudo命令编辑配置文件,可以检查配置文件语法错误:visudo -c
  • 配置文件的规则分为别名定义和授权规则,前者非必要,后者必要
(2)授权规则:
  • 格式:user host=(runas) command(支持通配符glob)
    • user:运行命令者的身份
    • host:通过哪些主机
    • runas:以哪个用户的身份
    • command:运行哪些命令
(3)别名定义:
  • 别名有四种类型:User_Alias, Runas_Alias, Host_Alias, Cmnd_Alias

  • 命名规则:[A-Z]([A-Z][0-9]_)*(必须以大写字母开头,后面接任意个大写字母、数字和下划线的组合)

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

  • 示例1:
    student ALL = (ALL) ALL 授权用户student在所有主机代表所有用户执行任意操作
    %wheel ALL = (ALL) ALL 授权属于wheel组的用户在所有主机代表所有用户执行任意操作

  • 示例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 引用别名,允许netuser1和netuser2在所有主机代表root用户执行ip的命令

  • 示例4
    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
    允许adminuser1, adminuser2用户在所有主机代表root用户可以不需输入密码执行useradd, usermod, passwd命令(不允许修改root密码),可以输入密码后执行userdel命令

  • 示例5
    defaults: wang runas_default=tom 当sudo不指定用户时默认为tom
    wang ALL=(tom, jerry) ALL 允许wang用户在所有主机代表tom或jerry执行所有命令

  • 示例6
    wang 192.168.175.136,192.168.175.138=(root) /usr/sbin/, !/usr/sbin/useradd
    允许wang用户在192.168.175.136,192.168.175.138地址的主机上代表root用户执行系统管理员命令(useradd除外)

  • 示例7
    wang ALL=(ALL) /bin/cat /var/log/messages*
    一般理解:允许wang用户在所有主机代表所有人执行查看/var/log/目录下以messages开头的文件
    但是:*指代任意多个字符,当wang用户执行cat /var/log/messages /etc/shadow命令时同样符合授权设置,使wang用户能够访问大量root用户不希望让其看到的文件,将造成重大安全问题,不可以这样设置

(三)sudo命令

  • sudo -i -u wang 切换身份

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

五、TCP-Wrapper

(一)基本介绍

  • 工作在传输层的TCP协议上,实现对特定服务的安全监测和访问控制

  • 以库文件的形式实现,服务是否支持由TCP-Wrapper控制取决于编译时是否针对libwrap编译

  • 判断程序是否支持由TCP-Wrapper进行访问控制
    查看文件程序是否依赖libwrap.so库文件
    which command 查看命令所在的程序路径
    ldd /PATH/TO/PROGRAM | grep libwrap.so 查询程序的依赖库文件

(二)配置TCP-Wrapper

  • 配置文件路径:/etc/hosts.allow/etc/hosts.deny

  • 检查顺序:hosts.allow,hosts.deny
    注意:一旦前面规则匹配,直接生效,将不再继续。若都不匹配,则默认允许。

  • 帮助:man 5 hosts_accessman 5 hosts_options

  • 语法格式:daemon_list@host: client_list[ :options:option… ]

  • daemon_list@host格式

    • 单个应用程序的二进制文件名,而非服务名,例如vsftpd
    • 以逗号或空格分隔的应用程序文件名列表,如sshd,vsftpd
    • ALL表示所有接受tcp_wrapper控制的服务程序
    • 主机有多个IP,可用@hostIP来实现控制
  • client_list格式

    • 以逗号或空格分隔的客户端列表
    • 基于IP地址:192.168.10.1 192.168.1.(表示192.168.1.0/24网段)
    • 基于网络/掩码:192.168.0.0/255.255.255.0
    • 基于net/prefixlen: 192.168.1.0/24(CentOS7)
    • 内置ACL:ALL,LOCAL,KNOWN,UNKNOWN,PARANOID
  • EXCEPT用法:否定前面的描述,可以多次使用
    /etc/hosts.deny
    vsftpd: 172.16. EXCEPT 172.16.100.0/24 EXCEPT 172.16.100.1
    禁止172.16.0.0/16网段的主机登录vsftpd服务,但其中172.16.100.0/24网段的主机可以登录vsftpd服务,但是其中IP为172.16.100.1的主机不能登录vsftpd

  • [:option]选项

    • deny:主要用在/etc/hosts.allow定义“拒绝”规则
      如:vsftpd: 172.16. :deny 禁止172.16.0.0/16网段的主机登录vsftpd

    • allow:主要用在/etc/hosts.deny定义“允许”规则
      如:vsftpd:172.16. :allow 允许172.16.0.0/16网段的主机登录vsftpd

    • spawn 启动一个外部程序完成执行的操作
      如:sshd: ALL :spawn echo "$(date) login attempt from %c to %s,%d" >> /var/log/sshd.log
      允许任意主机登录sshd服务,将每一登录的信息按照"时间 login attempt from 客户端 to 服务器端,服务名"的格式记录到/var/log/sshd.log文件中(扩展常量%在man hosts_access中查询)

    • twist 实际动作是拒绝访问,使用指定的操作替换当前服务,标准I/O和ERROR发送到客户端,默认至/dev/null
      vsftpd: 172.16. :twist /bin/echo "connection prohibited"
      拒绝来自172.16.0.0/16网段主机登录vsftpd服务,并在客户端输出"connection prohibited"的信息

  • 测试工具:
    tcpdmatch [-d] daemon[@host] client
    -d 测试当前目录下的hosts.allow和hosts.deny

六、PAM认证机制

(一)基本概念

  • PAM (Pluggable Authentication Modules):一种与认证相关的通用框架机制,自身不做认证

  • PAM 关注如何为服务验证用户的API,通过提供一些动态链接库和一套统一的API,将系统提供的服务和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序

  • 认证机制:

    • 系统管理员通过PAM配置文件来制定不同应用程序的不同认证策略
    • 应用程序开发者通过在服务程序中使用PAM API来实现对认证方法的调用
    • 而PAM服务模块的开发者则利用PAM SPI来编写模块,将不同的认证机制加入到系统中
    • PAM接口库(libpam)则读取配置文件,将应用程序和相应的PAM服务模块联系起来

(二)PAM认证机制

  • PAM认证一般遵循这样的顺序:Service(服务)→PAM(配置文件)→pam_*.so

  • PAM认证首先要确定哪一项服务,然后加载相应的PAM的配置文件(位于/etc/pam.d下),最后调用认证文件(位于/lib/security下)进行安全认证

  • PAM认证过程:
    (1) 程序开始呼叫PAM模块,PAM模块会搜寻程序的PAM相关设置,设置文件一般为/etc/pam.d/目录下与程序同名的文件
    (2) 通过查看设置文件,取用PAM所提供的相关模块来进行验证
    (3) 将验证结果回传给程序,程序根据PAM回传的结果决定下一个动作

(三)PAM认证设置

  • PAM相关文件:

    • 模块文件目录:/lib64/security/*.so
    • 环境相关的设置:/etc/security/
    • 主配置文件:/etc/pam.conf,默认不存在
      建议为每种应用模块提供一个专用的配置文件:/etc/pam.d/APP_NAME
      注意:如/etc/pam.d存在,/etc/pam.conf将失效
  • 注意:修改PAM配置文件将马上生效
    建议:编辑pam规则时,保持至少打开一个root会话,以防止root身份验证错误

  • 通用配置文件/etc/pam.conf格式(不推荐使用)
    application type control module-path arguments

  • 专用配置文件/etc/pam.d/*格式
    type control module-path arguments

  • 格式说明:

    • application 服务名
      如telnet,login,ftp等,"OTHER"代表所有未在该文件中明确配置的其它服务
    • module-type 模块类型
    • control PAM库处理与该服务相关的PAM模块成功或失败情况的策略
    • module-path 指明本模块对应的程序文件的路径名
    • arguments 传递给该模块的参数
  • module-type: 模块类型

    • auth 账号的认证和授权
    • account 与账号管理相关的非认证类的功能
    • password 用户修改密码时密码复杂度检查机制等功能
    • session 用户获取到服务之前或使用服务完成之后需要进行一些附加的操作
    • -type 表示因为缺失而不能加载的模块将不记录到系统日志,对于那些不总是安装在系统上的模块有用
  • control: PAM处理认证成功或失败的情况的策略

    • 两种方式实现:简单和复杂
    • 简单方式实现:一个关健词实现
      • required :一票否决,表示本模块必须返回成功才能通过认证,但是如果该模块返回失败,失败结果也不会立即通知用户,而是要等到同一type中的所有模块全部执行完毕再将失败结果返回给应用程序,即为必要条件
      • requisite :一票否决,该模块必须返回成功才能通过认证,但是一旦该模块返回失败,将不再执行同一type内的任何模块,而是直接将控制权返回给应用程序,即为一个必要条件
      • sufficient :一票通过,表明本模块返回成功则通过身份认证的要求,不必再执行同一type内的其它模块,但如果本模块返回失败可忽略,即为充分条件
      • optional :表明本模块是可选的,它的成功与否不会对身份认证起关键作用,其返回值一般被忽略
      • include:调用其他的配置文件中定义的配置信息
    • 复杂方式实现:使用一个或多个"status=action"
      [status1=action1 status2=action …]
      • Status:检查结果的返回状态
      • Action:采取行为ok, done, die, bad, ignore, reset
      ok 模块通过,继续检查
      done 模块通过,返回最后结果给应用
      bad 结果失败,继续检查
      die 结果失败,返回失败结果给应用
      ignore 结果忽略,不影响最后结果
      reset 忽略已经得到的结果
      
  • module-path: 模块路径

    • 相对路径:
      /lib64/security目录下的模块可使用相对路径
      如:pam_shells.so、pam_limits.so
    • 绝对路径:
      模块通过读取配置文件(/etc/security/*.conf)完成用户对系统资源的使用控制
  • arguments: 传递给该模块的参数,查询帮助文件

  • PAM文档说明

    • /usr/share/doc/pam-*
    • rpm -qd pam
    • man -k pam_
    • man 模块名,如man pam_rootok
    • 《The Linux-PAM System Administrators' Guide》
  • 案例:典型PAM模块
    案例1:pam_shells模块,只允许使用/etc/shells文件中列明的shell登录
    (1)编辑/etc/pam.d/login文件,行首增加auth required pam_shells.so,表明登录时需要验证pam_shells.so模块,并且一票否决

    (2)编辑/etc/shells文件,去掉行/bin/csh
    (3)新建用户testlogin,指定使用csh:useradd testlogin -s /bin/csh,并配置密码
    (4)使用testlogin用户登录系统,登录失败

    (5)查询安全日志文件,发现认证失败记录

    案例2:pam_securetty模块,只允许root用户在/etc/securetty文件列出的安全终端登录。现在修改配置,使root能够登录telnet服务。
    方法1:注销/etc/pam.d/remote中module_path为pam_securetty.so这一行

    方法2:在/etc/securetty文件中添加若干伪终端

    案例3:pam_nologin模块,如果/etc/nologin文件存在,将导致非root用户不能登陆,如果用户shell是/sbin/nologin 时,当该用户登陆时,会显示/etc/nologin.txt文件内容,并拒绝登陆

    (1)建立/etc/nologin文件:touch /etc/nologin

    (2)建立/etc/nologin.txt文件,内容为"NO LOGIN":echo "NO LOGIN" > /etc/nologin.txt

    (3)创立用户testnologin,指定shell路径为/sbin/nologin,useradd testnologin -s /sbin/nologin,指定密码:passwd testnologin

    (4)普通用户登录,发现登录失败。testnologin用户登录,发现登录失败,并显示提示信息"NO LOGIN"

    案例4:pam_limits模块,在用户级别实现对其可使用的资源的限制,例如:可打开的文件数量,可运行的进程数量,可用内存空间

    • 修改限制的实现方式:
      (1) ulimit命令,立即生效,但无法保存
      -n 最多的打开的文件描述符个数
      -u 最大用户进程数
      -S 使用soft(软)资源限制
      -H 使用hard(硬)资源限制

      (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
      
      <value>       //指定具体值
      
    • 例如:限制用户最多打开的文件数和运行进程数
      /etc/pam.d/system-auth文件中已经引入了pam_limits.so模块

    在其他主机对本机的httpd服务进行ab测试,发现打开文件过多
    ab -c 3000 -n 10000 http://192.168.136.229/

    编辑/etc/security/limits.conf文件,添加如下内容:
    apache - nofile 10240 apache用户可打开10240个文件

    再次在其他主机对本机的httpd服务进行ab测试,这次通过了压力测试

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容