草庐IT

Linux安全加固 附脚本

Sajor_ 2023-04-03 原文
  • [[Linux]] 安全加固主要有四个方面:账号安全、认证授权、协议安全、审计安全。也就是 4A(认证Authentication、授权Authorization、账号Account、审计Audit),即统一安全管理平台解决方案。
    • 1、用户账号---唯一身份。
      2、统一认证---你是谁。
      3、授权管理---你有什么权限。
      4、操作审计---你可以干什么。
    • 这是Linux中几个比较重要的文件,主要针对这些文件做管理配置
      collapsed:: true
      • /etc/passwd    			-- 记录了系统中各用户的一些基本属性,root可写,所有用户可读
        /etc/shadow    			-- 记录了所有用户的密码
        /etc/group     			-- 记录了用户组属性
        /etc/login.defs 		-- 密码策略文件
        /etc/pam.d/system-auth	-- 密码强度
        
    • 账号安全:对账号密码做限制
      • 修改密码策略 /etc/login.defs
        collapsed:: true
        • 配置含义
          PASS_MAX_DAYS90密码最长有效期
          PASS_MIN_DAYS10密码修改之间最小的天数
          PASS_MIN_LEN8密码长度
          PASS_WARN_AGE7口令失效前多少天开始通知用户修改密码
        • 脚本
          • #! /bin/bash
            # Author: Sajor
            # Date: 2018-10-12
            # Function: 实现对用户密码策略的设定,如密码最长有效期等
            read -p  "设置密码最多可多少天不修改:" A
            read -p  "设置密码修改之间最小的天数:" B
            read -p  "设置密码最短的长度:" C
            read -p  "设置密码失效前多少天通知用户:" D
            sed -i '/^PASS_MAX_DAYS/c\PASS_MAX_DAYS   '$A'' /etc/login.defs
            sed -i '/^PASS_MIN_DAYS/c\PASS_MIN_DAYS   '$B'' /etc/login.defs
            sed -i '/^PASS_MIN_LEN/c\PASS_MIN_LEN     '$C'' /etc/login.defs
            sed -i '/^PASS_WARN_AGE/c\PASS_WARN_AGE   '$D'' /etc/login.defs
            echo "已设置好密码策略......"
            
      • 设置密码强度 /etc/pam.d/system-auth
        collapsed:: true
        • 打开 /etc/pam.d/system-auth 文件 ,修改如下。我们设置新密码不能和旧密码相同,同时新密码至少8位,还要同时包含大字母、小写字母和数字
          • password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=  difok=1 minlen=8 ucredit=-1 lcredit=-1 dcredit=-1
            
          • difok= :此选项用来定义新密码中必须要有几个字符和旧密码不同
          • minlen=:此选项用来设置新密码的最小长度
          • ucredit= :此选项用来设定新密码中可以包含的大写字母的最大数目。-1 至少一个
          • lcredit=:此选项用来设定新密码中可以包含的小写字母的最大数目
          • dcredit=:此选项用来设定新密码中可以包含的数字的最大数目
        • :这个密码强度的设定只对普通用户有限制作用,root用户无论修改自己的密码还是修改普通用户的时候,不符合强度设置依然可以设置成功
        • 脚本
          collapsed:: true
          • #! /bin/bash
            # Author: Sajor
            # Date: 2018-10-12
            # Function: 对用户密码强度的设定,新密码不能和旧密码相同,同时新密码至少8位,还要同时包含大字母、小写字母和数字
            sed -i '/pam_pwquality.so/c\password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=  difok=1 minlen=8 ucredit=-1 lcredit=-1 dcredit=-1' /etc/pam.d/system-auth
            
      • 限制密码错误次数 /etc/pam.d/sshd
        collapsed:: true
        • 参考:CentOS7 pam 认证设置
        • 有一些攻击性的软件是专门采用暴力破解密码的形式反复进行登录尝试,对于这种情况,我们可以调整用户登录次数限制,使其密码输入3次后自动锁定,并且设置锁定时间,在锁定时间内即使密码输入正确也无法登录
        • 打开 /etc/pam.d/sshd  文件,在 #%PAM-1.0 的下面,加入下面的内容,表示当密码输入错误达到3次,就锁定用户150秒,如果root用户输入密码错误达到3次,锁定300秒。锁定的意思是即使密码正确了也登录不了
          • auth required pam_tally2.so deny=3 unlock_time=150 even_deny_root root_unlock_time300
            
        • 命令
          • pam_tally2   查看被锁定的用户
            pam_tally2  --reset  -u  username      将被锁定的用户解锁
            
        • 脚本
          • #! /bin/bash
            # Author: Sajor
            # Date: 2018-10-12
            # Function: 对用户登录输入错误密码次数做限制
            n=`cat /etc/pam.d/sshd | grep "auth required pam_tally2.so "|wc -l`
            if [ $n -eq 0 ];then
            sed -i '/%PAM-1.0/a\auth required pam_tally2.so deny=3 unlock_time=150 even_deny_root root_unlock_time300' /etc/pam.d/sshd
            fi
            
      • 设置账户超时时间 /etc/profile
        collapsed:: true
        • TMOUT=600
          
        • source /etc/profile
        • 脚本
          • read -p "设置账户自动注销时间:" F
            sed -i '/^HISTSIZE/a\TMOUT='$F'' /etc/profile
            
      • 限制登陆IP
    • 认证授权:对账号权限做限制
      • 使用PAM认证模块,禁止wheel组之外的用户su为root
        collapsed:: true
        • PAM(Pluggable Authentication Module)是一个可插入式认证模块,在Linux系统中,各种不同的应用程序都需要完成认证功能,为了实现统一调配,把所有需要认证的功能做成一个模块(认证机制特别复杂的除外,如:https),当特定的程序需要完成认证功能的时候,就去调用PMA的认证模块
        • 在linux中,有一个默认的管理组 wheel。
          collapsed:: true
          • Linux下Wheel用户组介绍
          • Wheel组是Unix系统一个遗留物。当服务器需要做比日常例行维护更高级的工作的时候,就经常需要用到root权限了。而这个wheel组就是建立用来归纳一些特殊的系统用户用的,这其中的用户都或多或少地拥有root的部分功能和权限。也就是说如果你不是wheel组成员,那就没有root身上任何的特权。也因为这样,使用wheel组成员用户的话,会尽量减少对系统“摧毁性”破坏的概率和风险。如今大多数的Linux发行版本中,仍然保留了wheel这个组,虽然它已经不像当初设计出来的那样必要了,但是有些老玩家还是忠于这种旧式经典风格的,所以他们经常还是依旧让wheel组发挥着以往的作用。他们是这样做的:在建立他们自己的用户时,将其添加入wheel组中(用wheel组作为用户的主组),或者编辑/etc/group文件,将他们的用户名追加到wheel组那行的末尾。
        • 在实际生产环境中,即使我们有系统管理员root的权限,也不推荐用root用户登录。一般情况下用普通用户登录就可以了,在需要root权限执行一些操作时,再su登录成为root用户。
        • 但是,任何人只要知道了root的密码,就都可以通过su命令来登录为root用户,这无疑为系统带来了安全隐患。所以,将普通用户加入到wheel组,被加入的这个普通用户就成了管理员组内的用户。然后设置只有wheel组内的成员可以使用su命令切换到root用户。
        • 我们修改配置文件 /etc/pam.d/su  ,将这行的注释给去掉
        • 然后去 /etc/login.defs 末尾加入 SU_WHEEL_ONLY yes 即可
        • 脚本
          • sed -i '/pam_wheel.so use_uid/c\auth            required        pam_wheel.so use_uid ' /etc/pam.d/su
            n=`cat /etc/login.defs | grep SU_WHEEL_ONLY | wc -l`
            if [ $n -eq 0 ];then
            echo SU_WHEEL_ONLY yes >> /etc/login.defs
            fi 
            
      • 检查各用户异常状态
        collapsed:: true
        • Linux中的用户、组和权限管理
        • 使用 id root命令可以显示root用户的 uid gid group 信息
          collapsed:: true
          • > id root
            uid=0(root) gid=0(root) 组=0(root)
            
        • 使用命令修改某用户的信息
          collapsed:: true
          • usermod -o -u 0 -g 0 admin
            
        • 对Linux账户进行管理
          • userdel  -r 用户名  删除不必要的账号
          • passwd -l  用户名  锁定不必要的账号
          • awk -F: '($7=="/bin/bash"){print $1}' /etc/passwd   查看具有登录权限的用户
            collapsed:: true
            • 也有使用非bash登陆的,比如zsh,可以这么写 awk -F: '($7=="/usr/bin/zsh" || $7=="/bin/bash"){print $1}' /etc/passwd
          • awk -F ':' '($3==0){print $1}' /etc/passwd    查看UID为0的账号,UID为0的用户会自动切换到root用户,所以危害很大
          • awk -F: '($2=="")' /etc/shadow   查看空口令账号,如果存在空口令用户的话必须设置密码
            collapsed:: true
            • 补充一个小知识:如何创建一个无密码的账户
            • # 创建用户帐户
              > adduser mageshm
              # 使用以下命令创建没有密码的用户“mageshm”:
              > passwd -f -u mageshm
              
              Unlocking password for user mageshm.
              passwd: Success
              
            • 参考:使用passwd、usermod命令在Linux中锁定和解锁用户帐户。
            • 注:
              collapsed:: true
              • -f,–force强制操作。
              • -u,–unlock解锁指定帐户的密码(仅root)。
        • 脚本
          collapsed:: true
          • #! /bin/bash
            # Author: Sajor
            # Date: 2018-10-11
            # Function: 对系统中的用户做检查,加固系统
            echo "系统中有登录权限的用户有:"
            awk -F: '($7=="/usr/bin/zsh" || $7=="/bin/bash"){print $1}' /etc/passwd
            echo "********************************************"
            echo "系统中UID=0的用户有:"
            awk -F: '($3=="0"){print $1}' /etc/passwd
            echo "********************************************"
            N=`awk -F: '(``2==""){print ``1}' /etc/shadow|wc -l`
            echo "系统中空密码用户有:$N"
            if [ $N -eq 0 ];then
             echo "恭喜你,系统中无空密码用户!!"
             echo "********************************************"
            else
             i=1
             while [ $N -gt 0 ]
             do
                None=`awk -F: '(``2==""){print ``1}' /etc/shadow|awk 'NR=='$i'{print}'`
                echo "------------------------"
                echo $None
                echo "必须为空用户设置密码!!"
                passwd $None
                let N--
             done
             M=`awk -F: '(``2==""){print ``1}' /etc/shadow|wc -l`
             if [ $M -eq 0 ];then
              echo "恭喜,系统中已经没有空密码用户了!"
             else
            echo "系统中还存在空密码用户:$M"
             fi
            fi
             
            
      • 对重要文件进行锁定
        collapsed:: true
        • 修改文件系统的权限属性,对重要的文件进行锁定,即使ROOT用户也无法删除
        • chattr 命令,专门用来修改文件或目录的隐藏属性,只有 root 用户可以使用
          • # 改变文件或目录的扩展属性
            chattr [+-=] [属性] 文件或目录名
            chattr [-RVf] [-+=aAcCdDeijsStTu] [-v version] files...
            # 查看文件目录的扩展属性
            lsattr  文件或目录名
            
            • a:只能附加数据
            • A:不修改访问时间
            • c:压缩文件
            • C:不执行写入时复制(COW) 。多个调用者获取同一个资源,这时,另一个调用者对这资源进行了修改,不生成一个副本给
            • d:不 dump
            • D: 同步更新目录
            • e:extent格式(一种文件系统格式)
            • i:不能修改。不能删除或重命名,不能创建到该文件的链接,也不能向该文件写入数据。只有超级用户或拥有 CAP_LINUX_IMMUTABLE 能力的进程才能设置或清除此属性。
            • j:数据日志
            • s:安全删除
            • S:同步更新
            • t:不知道文件尾部合并
            • T:目录层次的顶部
            • u:文件被删除时,其内容会被保存,后面可以请求恢复
          • 下面的只读属性,可以使用 lsattr列出,但不能被 chattr 修改:
            • E:压缩错误
            • h:巨大的文件
            • I:索引目录
            • N:内联数据
            • X:压缩原始访问
            • Z:压缩文件是脏的
        • 并不是所有文件系统都支持所有标志;参考文件系统手册了解如btrfs(5), ext4(5), 和 xfs(5)文件格式的更多详情。
        • 脚本
          • #! /bin/bash
            # Author: Sajor
            # Date:2018-10-10
            # Function: 锁定创建用户和组的文件,使之无法对用户和组进行操作!
            read -p "警告:此脚本运行后将无法添加删除用户和组!!确定输入Y,取消输入N;Y/N:" i
            case $i in
                  [Y,y])
                        chattr +i /etc/passwd
                        chattr +i /etc/shadow
                        chattr +i /etc/group
                        chattr +i /etc/gshadow
                        echo "锁定成功!"
            ;;
                  [N,n])
                        chattr -i /etc/passwd
                        chattr -i /etc/shadow
                        chattr -i /etc/group
                        chattr -i /etc/gshadow
                        echo "取消锁定成功!!"
            ;;
                   *)
                        echo "请输入Y/y or  N/n"
            esac
            
        • 参考:chattr命令详解Linux chattr命令详解:修改文件系统的权限属性
      • 检查异常进程
        • 检查cpu占用前10:ps aux|sort -rn -k +3|head
        • 检查内存占用前10:ps aux|sort -rn -k +4|head
    • 协议安全:协议加固主要阻止入侵者远程获取服务器的权限。
      collapsed:: true
      • ssh安全
        • SSH是一个协议,利用它可以登录到一个远程系统或远程执行系统命令,默认允许root登录,并且sshv1存在缺陷,我们应该在sshd_config禁止root访问和使用sshv2来让ssh更加安全。
        • 禁止root用户远程登陆,vim /etc/ssh/sshd_config 修改为:
        • PermitRootLogin    no
          
      • telnet安全
        • 早期的Linux默认开启telnet服务,telnet,ftp,rlogin都是明文传输的协议,如果必须使用telnet,则需要进行安全配置:
        • /etc/xinetd.d/telnet
          disable=yes
          
      • 禁止ping
        • # 开启
          echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all 
          # 关闭
          echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all  
          
      • 禁止匿名ftp
        • vim  /etc/vsftpd/vsftpd.conf
          # 如果存在anonymous_enable则修改,如果不存在则手动增加
          anonymous_enable=NO    
          
      • 预防Flood攻击
        • > vim  /etc/sysctl.conf
          > net.ipv4.tcp_syncookies = 1
          # 让命令生效
          > sysctl  -p 
          
    • 审计安全:日志就是计算机系统、设备、软件等在某种情况下记录的信息。具体的内容取决于日志的来源
      collapsed:: true
      • 设置历史命令保存条数
        collapsed:: true
        • HISTSIZE=100
          
        • source /etc/profile
        • 脚本
          • read -p "设置历史命令保存条数:" E
            sed -i '/^HISTSIZE/c\HISTSIZE='$E'' /etc/profile
            
      • 记录安全事件日志
        • # vim /etc/rsyslog.conf 在文件中加入如下内容
          *.err;kern.debug;daemon.notice     /var/log/messages
          
      • 建立日志服务器
        collapsed:: true
        • 日志服务器的好处在于,每个工作服务器将自己的日志信息发送给日志服务器进行集中管理,即使有人入侵了服务器并将自己的登录信息悄悄删除,但由于日志信息实时与日志服务器同步,保证了日志的完整性。以备工作人员根据日志服务器信息对服务器安全进行评测。
        • 在客户端修改配置文件/etc/rsyslog.conf
        • 想把哪种类型的日志文件发送给服务端,你就把他原来的对应的目录改成: @日志服务器ip
        • TODO 日志服务器日志上传
        • 然后重启rsyslog服务,开启防火墙,这样就完成了日志服务器的搭建。
          collapsed:: true
          • systemctl  restart  rsyslog
            firewall-cmd  --add-port=514/tcp
            
        • 日志系统RSyslog(The rocket-fast Syslog Server) Documentation #mark
    • 参考:Linux安全加固Linux主机操作系统加固规范加固

有关Linux安全加固 附脚本的更多相关文章

  1. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  2. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  3. ruby-on-rails - 独立 ruby​​ 脚本的配置文件 - 2

    我有一个在Linux服务器上运行的ruby​​脚本。它不使用rails或任何东西。它基本上是一个命令行ruby​​脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg

  4. ruby - 如何安全地删除文件? - 2

    在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?

  5. postman——集合——执行集合——测试脚本——pm对象简单示例02 - 2

    //1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json

  6. ruby - 用 YAML.load 解析 json 安全吗? - 2

    我正在使用ruby2.1.0我有一个json文件。例如:test.json{"item":[{"apple":1},{"banana":2}]}用YAML.load加载这个文件安全吗?YAML.load(File.read('test.json'))我正在尝试加载一个json或yaml格式的文件。 最佳答案 YAML可以加载JSONYAML.load('{"something":"test","other":4}')=>{"something"=>"test","other"=>4}JSON将无法加载YAML。JSON.load("

  7. ruby - 确定 ruby​​ 脚本是否已经在运行 - 2

    有没有一种简单的方法可以判断ruby​​脚本是否已经在运行,然后适本地处理它?例如:我有一个名为really_long_script.rb的脚本。我让它每5分钟运行一次。当它运行时,我想看看之前运行的是否还在运行,然后停止第二个脚本的执行。有什么想法吗? 最佳答案 ps是一种非常糟糕的方法,并且可能会出现竞争条件。传统的Unix/Linux方法是将PID写入文件(通常在/var/run中)并在启动时检查该文件是否存在。例如pid文件位于/var/run/myscript.pid然后你会在运行程序之前检查它是否存在。有一些技巧可以避免

  8. ruby - ruby 脚本可以预编译成二进制文件吗? - 2

    我正在开发一个Ruby脚本,需要在没有Ruby解释器的情况下部署到系统上。它将需要在使用ELF格式的FreeBSD系统上运行。我知道有一个ruby​​2exe项目可以编译在Windows上运行的ruby​​脚本,但是在其他操作系统上这样做容易吗?甚至可能吗? 最佳答案 您是否检查过Rubinius或JRuby是否允许您预编译您的代码? 关于ruby-ruby脚本可以预编译成二进制文件吗?,我们在StackOverflow上找到一个类似的问题: https://

  9. ruby-on-rails - 安全地显示使用回形针 gem 上传的图像 - 2

    默认情况下:回形针gem将所有附件存储在公共(public)目录中。出于安全原因,我不想将附件存储在公共(public)目录中,所以我将它们保存在应用程序根目录的uploads目录中:classPost我没有指定url选项,因为我不希望每个图像附件都有一个url。如果指定了url:那么拥有该url的任何人都可以访问该图像。这是不安全的。在user#show页面中:我想实际显示图像。如果我使用所有回形针默认设置,那么我可以这样做,因为图像将在公共(public)目录中并且图像将具有一个url:Someimage:看来,如果我将图像附件保存在公共(public)目录之外并且不指定url(同

  10. ruby-on-rails - Ruby 从 bash 脚本执行中捕获 stderr 输出 - 2

    我目前可以将stdout重定向到ruby​​/rails中的字符串变量,只需在bash中运行命令并将结果设置为我的字符串变量,如下所示。val=%x[#{cmd}]其中cmd是表示bash命令的字符串。但是,这仅捕获stdout,因为我想捕获stderr并将其设置为ruby​​中的字符串——有什么想法吗? 最佳答案 简单地重定向它:val=%x[#{cmd}2>&1]如果您只想从stderr捕获输出,请在将其复制到fd2后关闭stdout的文件描述符。val=%x[#{cmd}2>&1>/dev/null]

随机推荐