chrony、rsyslog、sudo、nginx模块

1、搭建时间服务器,日志服务器并简述sudo安全切换

  • 搭建时间服务器

Linux操作系统中大家熟悉的时期服务器有两个:

ntp
chrony
  • 这里我们以chrony来搭建时间服务器
    chrony是一个ntp协议的实现程序,既可以当做服务端,也可以充当客户端;它专为间歇性互联网连接的系统而设计,当然也能良好应用于持久互联网连接的环境;chrony有三个时间参考:硬件时钟、实时时钟以及手动同步。
    • chrony的程序安装
      [root@node01 ~]# yum -y install chrony
    
    • chrony的程序环境
    [root@node01 ~]# rpm -ql chrony
    ...
    /etc/chrony.conf        #主配置文件
    /usr/bin/chronyc        #客户端程序
    /usr/sbin/chronyd       #服务端程序
    
    • chrony配置服务端
    [root@node01 ~]# vim /etc/chrony.conf
    两个主要配置:
    server cn.pool.ntp.org iburst    #1、格式为:server  时间服务器域名  iburst
    allow 10.192.0.0/16  #允许指定网段的客户端进行时间同步
    [root@node01 ~]# systemctl  enable chronyd
    [root@node01 ~]# systemctl  start chronyd
    
    • chrony客户端配置
    [root@ceph_deploy ~]# yum -y install chrony
    [root@ceph_deploy ~]# vim /etc/chrony.conf
    一个主要配置
    server 10.192.2.222 iburst   #server指向时间服务器ip地址或域名
    [root@ceph_deploy ~]# systemctl  enable chronyd
    [root@ceph_deploy ~]# systemctl  start chronyd
    
    • 客户端测试
    [root@ceph_deploy ~]# chronyc sources
    210 Number of sources = 1
    MS Name/IP address         Stratum Poll Reach LastRx Last sample               
    ===============================================================================
    ^* ns1.peaoguo.com               3   6   377    40  +4852us[-2383us] +/-  159ms
     或者ntpdate测试
    [root@ceph_deploy ~]# ntpdate 10.192.2.222
    22 Mar 16:04:13 ntpdate[2314700]: adjust time server 10.192.2.222 offset -0.009135 sec
    
  • 搭建日志服务器收集bash命令日志

通常我们想知道某个用户在服务器上到底执行了那些命令,以备后续做故障分析和审计分析等等,这了我们用rsyslog收集日志,并转发给mysql服务器,然后通过web页面进行展示,设计方案如下:


rsyslog日志转发过程
  • 环境准备
    为了方便,我这里将web和日志转发放在一台服务器(10.192.2.222),将Mariadb和客户端放在一台服务器(10.192.1.161),
    1、客户端服务器和日志转发服务器均安装rsyslog服务,默认操作系统已经安装rsyslog服务,如果没有运行如下命令
    yum -y install rsyslog
    2、数据库服务器安装安装Mariadb,和授权
    yum -y install mariadb-server
    MariaDB [(none)]> GRANT ALL PRIVILEGES ON Syslog.* TO [email protected] IDENTIFIED BY 'rsyslog'
    3、安装LogAnalyzer及web服务
    LogAnalyzer软件下载地址http://loganalyzer.adiscon.com/
    上传 loganalyzer-4.1.7.tar.gz 安装包至web服务器

    [root@node01 ~]# tar -xzvf  loganalyzer-4.1.7.tar.gz  -C /data/
    [root@node01 ~]# cd /data
    [root@node01 data]# ln -vs loganalyzer-4.1.7  rsyslog
    [root@node01 data]# yum -y install httpd
    [root@node01 data]# vim /etc/httpd/conf.d/rsyslog.conf
    
         ServerName www.rsyslog.com
         DocumentRoot  "/data/rsyslog"
         
           Options None
           AllowOverride None
           Require all granted
        
    
    [root@node01 data]# systemctl start httpd
    
  • 客户端配置
    思路:将bash命令按照一定格式保存在一个文件中,在通过rsyslog的转发功能将其转发给日志收集服务器,

    创建一个任何人都只有追加权限的文件
    [root@ceph_deploy ~]# mkdir -p /var/log/bash/
    [root@ceph_deploy ~]# touch /var/log/bash/bash.log 
    [root@ceph_deploy ~]# chown nobody:nobody /var/log/bash/bash.log
    [root@ceph_deploy ~]# chmod 002 /var/log/bash/bash.log
    [root@ceph_deploy ~]# chattr +a /var/log/bash/bash.log
    
    添加环境变量,将每一条命令日志存入上面创建的文件中
    [root@ceph_deploy ~]# vim /etc/profile
    export HISTORY_FILE=/var/log/bash/bash.log
    export SRC_IP=`who am i |awk '{ print $5}'|sed 's/(//g'|sed 's/)//g'`
    export PROMPT_COMMAND='{ date "+%F %T #### USER:$USER  IP:$SRC_IP PS:$SSH_TTY ppid=$PPID pwd=$PWD #### $(history 1 | { read x cmd; echo "$cmd"; })";} >>$HISTORY_FILE'
    [root@ceph_deploy ~]# source /etc/profile
    
    配置rsyslog
    #load imfile module
    $ModLoad imfile
    $WorkDirectory /etc/rsyslog.d
    $PrivDropTOGroup root
    $InputFilePollInterval 1
    $InputFilePersistStateInterval 1
    
    #bash.log
    $InputFileName /var/log/bash/bash.log
    $InputFileTag bashTag:
    $InputFileStateFile bash_log
    $InputFileSeverity info
    $InputFileFacility local0
    $InputRunFileMonitor
    
    #bash audit
    local0.info     @@10.192.2.222:514
    
    
  • 日志转发服务器配置
    思路:将收集到的日志转发给MariaDB服务器保存

    安装rsyslog写入mysql数据库接口工具
    [root@node01 ~]# yum -y install rsyslog-mysql
    
    修改rsyslog配置文件
    [root@node01 ~]# vim /etc/rsyslog.conf 
    $ModLoad imtcp                    
    $InputTCPServerRun 514    设置为rsyslog收集转发服务器监听tpc514端口
    $ModLoad ommysql      加载写入mysql模块
    
    将特定的日志转发给mysql服务器
    local0.info                                              :ommysql:10.192.1.161,Syslog,rsyslog,rsyslog
    [root@node01 ~]# systemctl restart rsyslog
    
  • web服务器查看bash日志
    在客户端服务器输入两条bash命令

    [root@ceph_deploy ~]# pwd
    /root
    [root@ceph_deploy ~]# ifconfig
    

    浏览器查看


    查看bash命令记录
  • sudo安全切换

    • 功能简介:
      sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等。这样不仅减少了root用户的登录和管理时间,同样也提高了安全性。
    • sudo运行流程
      1、当用户运行sudo时,系统于/etc/sudoers文件里查找该用户是否有运行sudo的权限
      2、若具有运行sudo的权限,那么用户输入自己的password,注意这里输入的是用户自己的password
      3、假设password正确,进行sudo后面的命令,root运行sudo是不须要输入password的,切换到的身份与运行者身份同样的时候。也不须要输入password。
    • 修改sudo配置文件
      sudo配置文件有两个/etc/sudoers和/etc/sudoers.d/*
      使用visudo命令修改配置文件visudo -f /etc/sudoers.d/file
    • 授权格式
      who where=(whom) commands
      users hosts=(runas) commands
      users:username,#uid,%groupname,%#gid,user_ailas
      hosts: ip, hostname,NetAddr,host_alias,ALL
      ruanas:runas_alias,ALL
    • 示例
    别名定义了一个USERADMIN组,包含zhangsan和lisi两个用户
    User_Alias   USERADMIN=zhangsan,lisi
    
    别名定义了一组NETADM命令组,可使用ip和route这两个路径,这里必须用绝对路径
    Cmnd_Alias   NETADM=/usr/sbin/ip,/usr/sbin/route
    
    别名定义了一组USERADM命令组,用用于用户添加和删除
    Cmnd_Alias   USERADM=/usr/sbin/useradd,/sbin/userdel,/usr/bin/passwd,/sbin/reboot
    
    这里wangwu用户拥有两个命令组的权限,前一组不需要输入密码,后一组执行时需要输入用户
    wangwu  ALL=(ALL)   NOPASSWD:NETADM,PASSWD:USERADM
    
    USERADMIN 用户组拥有USERADM命令组的命令执行权限
    USERADMIN  ALL=(ALL)  USERADM
    
    xp用户拥有USERADM中命令组中除了reboot的权限
    xp      ALL=(ALL)       USERADM,!/sbin/reboot
    

2、详解nginx模块使用方法

  • nginx简介
    Nginx (engine x) 是一个高性能的HTTP和反向代理服务,也是一个IMAP/POP3/SMTP服务
    nginx高度模块化,但其模块早期不支持DSO机制,近期版本支持动态装载和卸载
  • 模块分类:
    • 核心模块:core module
    • 标准模块:
      • HTTP modules:
        • Standard HTTP modules
        • Optional HTTP modules
      • Mail modules
      • Stream modules
    • 第三方模块
  • 核心模块
    • 正常运行必备的配置:
      • 1、user;指明运行使用的用户
      • 2、pid /PATH/TO/PID_FIEL;指定存储nginx主进程进程号的文件路径
      • 3、include file | mask;指明包含进来的其它配置文件片段
      • 4、load_module file;指明要装载的动态模块
    • 性能优化相关配置
      • 1、worker_processes number |auto;
        worker进程的数量,通常应该为当前主机的cpu的物理核心数
        auto:当前主机物理CPU核心数
      • 2、worker_cpu_affinity cpumask ...;
        worker_cpu_affinity auto [cpumask];
        0001:0号CPU
        0010:1号CPU
        例如:
        worker_processes number 2
        worker_cpu_affinity 0100,1000;
        这表示机器有4颗CPU,nginx启用2个进程,分别绑定在后两颗CPU上
      • 3、worker_priority number;
        指定worker进程的nice值,设定work进程优先级:[-20到20之间]
      • 4、worker_rlimit_nofile number;
        worker进程所能够打开的文件数量上限
    • 调试、定位问题
      • 1、daemon on|off; 是否以守护进程方式运行Nginx
      • 2、master_process on|off;是否以master、worker模型运行nginx;默认为on
      • 3、error_log file [level]
    • 事件驱动相关的配置
      events {
      ...
      }
      • 1、worker_connections number;
        每个worker进程所能打开的最大并发连接数量
        nginx最大并发=worker_processes*worker_connections
      • 2、use method;指明并发连接请求的处理方法;
        例如 use epoll;
      • 3、accept_mutex on|off
        处理新的连接请求的方法,on意味着有各worker轮流处理新请求,off意味着每个新请求都会通知所有的worker进程
    • 配置示例
    user nginx ;                             #进程运行使用的用户和组
    pid logs/nginx.pid;                       #指定存储nginx主进程号的文件路径
    include vhost/*.conf;                     #指明包含进来的其他配置文件
    #include mime.type                        #指明包含进来的其他文件类型
    #load module file;                        #指明要装载的动态模块
    worker_processes 4 | auto;                #worker进程的数量,应小于等于cpu核心数,auto为当前主                         
                                          #机cpu核心数
    worker_cpu_affinity 0001 0010 0100 1000;  #将worker进程与通过cpumask与指定cpu绑定
    worker_priority -10;                      #指定worker进程的nice值,范围[-20,20]
    worker_rlimite_nofile 2000;               #指定worker进程能够打开的最大文件数
    
    #daemon on;                               #是否已守护进程方式运行Nginx
    #master_process on;                       #是否已master-worker模型运行Nginx,默认on
    
    error_log /var/log/nginx-error.log info;  #错误日志
    
    events {                                  #事件驱动相关配置
        use epoll;                            #指明并发连接请求的处理方式
        worker_connections 2048;              #每个worker进程能够打开的最大并发连接数
        #accpet mutex on | off;               #处理新连接的方式,on意味着由每个worker轮流处理新请    
                                          #求,off意味着每个新请求到达都会通知所有worker进程
    }
    
  • 标准模块-HTTP modules
    • 虚拟主机server{...}

      • listen字段
        listen PORT|address[:port]|unix:/PATH/TO/SOCKET_FILE
        listen address[:port][default_server][ssl][http2|spdy] [backlog=number] [rcvbuf=size] [sndbuf_size]
        default_server设定为默认虚拟主机
        ssl限制仅能通过ssl连接提供服务
        backlog=number后援队列长度
        rcvbuf=size接收缓冲区大小
        sndbuf=size发送缓冲区大小
      • server_name字段
        server_name name ... ;
        server_name www.peaoguo.com
        指明虚拟主机的主机名称,后可跟多个由空白字符分隔的字符串
        支持*通配任意长度的任意字符,server_name *.peguo.com www.peguo.*
        支持~起始的字符做正则表达式模式匹配,server_name ~^www\d+\.peguo\.com
        匹配顺序:
        1、首先是字符串精确匹配
        2、左侧*通配符
        3、右侧*通配符
        4、正则表达式
      • tcp_ondelay on|off;
        在keepalived模式下的连接是否启用TCP_NODELAY选项
        tcp_nopush on|off;
        在sendfile模式下,是否启用TCP_CORK选项;
      • sendfile on|off;
        是否启用sendfile功能
    • 定义路径相关配置

      • root path;
        设置web资源路径映射,用于指明用户请求的url所对应的本地文件系统上的文档所在路径,可用的位置:http、server、location,if in location
      • location [=|~|~*|^~] url {...}
        在一个server中location配置段可存在多个,用于实际从url到文件系统的路径映射,
        nginx会根据用户请求的url来检查定义的所有location,并找出一个最佳匹配,而后应
        用其配置
        =:对url做精确匹配
        ~:对url做正则表达式模式匹配,区分字符大小写
        ~*:对url做正则表达式模式匹配,不区分字符大小写
        ^~:对url左半部分做匹配检查,不区分字符大小写
        匹配优先级:=,^~,~,~/~*,不带符号
        root /vhosts/www/htdocs/
        http://www.peaoguo.com/index.html--->/vhosts/www/htdocs/index.html
      • alias path;
        定义路径别名,文档映射的另一种机制,仅能用于location
        注意:location中使用root指令和alias指令的意义不同,
        root,给定的路径对应于location中/url/左侧的/
        alias,给定的路径对应于location中的/url/右侧的/
      • index file ...;
        默认资源,http,server,location
      • error_page code ... [=[response]] url;
      • try_file file ...url;
    • 定义客户端请求的相关配置

      • keepalive_timeout timeout [header_timeout];
        设定保持连接的超时时长,0表示禁止长连接,默认为75S
      • keepalive_requests number;
        在一次长连接上所允许请求的资源的最大数量,默认为100
      • keepalive_disable none | browser ......;
        对哪种浏览器禁用长连接
      • send_timeout time;
        向客户端发送响应报文的超时时长,此处,是指两次写操作之间的间隔时长
      • client_body_buffer_size size;
        用于接收客户端请求报文的body部分的缓冲区大小,默认为16K,超出此大小时,其将被暂存到磁盘上的由client_body_path指定所定义的位置;
      • client_body_temp_path path [level1 [level2 [level3]]];
        设定用于存储客户端请求报文的body部分的临时存储路径及子目录结构和数据
        16进制的数字
        client_body_path /var/tmp/client_body 1 2 2
        1、表示用一位16进制数字表示一级子目录;0-f 16个
        2、表示用两位16进制数字表示二级子目录;00-ff 256个
        2、表示用两位16进制数字表示三级子目录;00-ff 256个
    • 对客户端进行限制的相关配置

      • limit_rate rate;
        限制响应给客户端的传输速率,单位是bytes/second,0表示无限制
      • limit_excetp method ...{...}
        限制对指定请求方法之外的其它方法的使用客户端
        limit_rate GET{
        allow 10.192.0.0/16 ;
        deny all;
        }
    • 文件操作优化的配置

      • aio on|off |threads[=pool];
        是否启用aio功能
      • directio size|off;
        在LInux主机启用O_DIRECT标记,此处意味文件大小等于给定的大小时使用,例如directio 4m;
      • open_file_cache off;
        open_file_cache max=N [inactive=time];
        nginx可以缓存以下三种信息:
        1、文件的描述符、文件大小和最近一次的修改时间
        2、打开的目录结构
        3、没有找到的或者没有权限访问的文件的相关信息
        max=N 可缓存的缓存项上限,达到上限后会使用LRU算法实现缓存管理
        lnactive=time;缓存项的非活动时间,在此处指定的时长内未被命中的或命中次数少于open_file_chache_min_uses指令所指定的非活动项
      • open_file_cache_valid time;
        缓存项有效性的检查频率,默认为60S
      • open_file_cache_min_uses number;
        在open_file_cache 指令的inactive参数指定的时长内,至少应该被命中多少次方可被归类为活动项
      • open_file_cache_errors on |off
        是否缓存查找时发送错误的文件一类信息;
    • ngx_http_access_module模块:
      实现基于IP的访问控制功能

      • allow address |CIDR|unix; all;
      • deny address |CIDR|unxi; all;
        使用范文http,server,location,limit_except
    • ngx_http_auth_basic_module模块
      实现基于用户的的访问控制,使用basic机制进行用户认证

      • auth_basic_string | off;
      • auth_basic_user_file file;
        location /admin/ {
        alias /web/app/;
        auth_basic "ADMIN AREA";
        auth_basic_user_file /etc/nginx/.ngxpasswd;
        }
        注意:htpasswd命令由httpd-tools所提供
    • ngx_http_stub_status_module模块
      用于输出nginx的基本状态信息

      • stub_status;
        配置示例:
        location /nginx_admin_status {
        stub_status;
        }
        各状态参数含义:
        Active Connections:活动状态的连接数
        accepts:已经接受的客户端请求的总数
        handled:已经处理完成的客户端请求的总数
        requests:客户端发来的总的请求数
        Reading:处于读取客户端请求报文首部的连接的连接数
        Writing:处于向客户端发送响应报文过程中的连接数
        Waiting:处于等待客户端发出请求的空间连接数
    • ngx_http_log_module模块

      • log_format name string ...;
        string可以使用nginx核心模块及其它模块内嵌的变量
      • access_log path [format [buffer=size [gzip[=level]] [flush=time [if=condition]];
        access_log off;
        访问日志文件路径,格式及相关的缓冲配置
        buffer=size
        flush=time
        • open_log_file_cache max=N [inacitve=time] [min_uses=N] [valid=time]
          open_log_file_cache off
          缓存各日志文件相关的元数据信息
          max:缓存的最大文件描述符数量
          min_uses:在inactive指定的时长内访问大于等于此值方可被当做活动项;
          inactive:非活动时长
          valid:验证缓存中各缓存项是否为活动项的时间间隔
    • ngx_http_gzip_module

      • gzip on|off;
      • gzip_comp_level level; level级别1-9
      • gzip_disable regex ...;
      • gzip_min_length length;
        启用压缩功能的响应报文大小阀值
      • gzip_buffers number size;
        支持实现压缩功能时为其配置的缓冲区数量及每个缓存区大小
      • gzip_proxled off |expired|no-cache|no-store|private|no_last_modified|no_etag|auth|any ...;
        nginx做为代理服务器接收从被代理服务器发送的响应报文,在何种情况下压缩。
        off:对代理的请求不启用
        no-cache,no-store,private:表示从被代理服务器收到的响应报文首部的Cache-Control的值为此三者中任何一个,则启用压缩功能;
      • gzip_types mime-type ...;
        压缩过滤器,仅对此处设定的MIME类型的内容启用压缩功能
        示例:
        gzip on;
        gzip_comp_level 6;
        gzip_type text/css text/xml text/html application/javascript;
    • ngx_http_ssl_moudle

      • ssl on|off;
      • ssl_certificate file;
        当前虚拟主机使用PEM格式的证书文件;
      • ssl_certificate_key file;
        当前虚拟主机上与其证书匹配的私钥文件;
      • ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];
        支持的ssl协议版本,默认为后三个;
      • ssl_session_cache off |none |[builtin[:size]] [shared:name:size];
        builtin[:size]:使用OpenSSL内建的缓存,此缓存为每个worker进程私有
      • ssl_session_timeout time;
        客户端一侧的连接可以复用ssl session cache中缓存的ssl参数的有效时长
        配置示例:
        server {
        listen 443 ssl;
        server_name www.peaoguo.com;
        root /data/www/ssl;
        ssl on;
        ssl_certificate /etc/nginx/ssl/nginx.crt;
        ssl_certificate_key /etc/nginx/ssl/nginx.key;
        ssl_session_cache shared:sslcache:20m;
        }
    • nginx_http_rewite_modules
      将用户请求的URI基于regex所描述的模式进行检查,而后完成替换

      • rewrite regex replacement [flag]
        将用户请求的URI基于regex所描述的模式进行检查,匹配到时将其替换为replacement指定的新的URI
        注意:如果在同一级配置块中存在多个rewirte规则,那么会自上而下组个检查,被某条件规则替换完成后,会重启新一轮的替换检查,因此,隐含有循环机制;[flag]所表示的标志位用于控制此循环机制;
        [flag]
        last:重写完成后停止对当前URI在当前的location中后续的其它重新操作,而后对新的URI启动新一轮重新检查,提前重 启新一轮循环。
        break: 重写完成后停止对当前URI在当前的location中后续的其它重新操作,而后直接跳转至重写规则配置块之后的其它配置,结束循环。
        redirect:重写完成后以临时重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求,不能以http:// 或https://开头。
        permanent:重新完成后以永久重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求。
      • return
        return code [text];
        return code URL;
        return URL;
      • rewrite_log on|off;
        是否开启重写日志
      • if (condition) {...}
        引入一个新的配置上下文,条件满足时,执行配置块中的配置指令;server,location,condition
        • 比较操作符:
          ==
          !=
          ~:模式匹配区分字符大小写;
          ~*:模式匹配,不区分大小写
          !~:模式不匹配,区分大小写
          !~*:模式不匹配,不区分大小写
        • 文件及目录存在性判断:
          -e,!-e
          -f,!-f
          -d,!-d
          -x,!-x
      • set $variable value;
        用户自定义变量;
    • ngx_http_referer_module

      • valid_referers none |blocked|server_names|string...;
        定义referer首部的合法可用值;
        none:请求报文首部没有referer首部
        blocked:请求报文的referer首部没有值
        server_names:参数,其可以有值作为主机名或主机名模式
        arbitrary_string:直接字符串,但可使用*做通配符
        regular expression:被指定的正则表达式模式匹配到的字符串,要使用~开头,例如~.*\.peaoguo\.com;
        配置示例:
        valid_referers none blocked server_names *.peaguo.com peaguo.* *.peaoguo.* *~\.peaoguo\.;
        if($invalid_referer) {
        return http://www.peaguo.com/invalid.jpg;
        }

你可能感兴趣的:(chrony、rsyslog、sudo、nginx模块)