Linux 企业级安全原理和防范技巧以及网络和安全-Linux安全架构、安全威胁模型、以及加密、解密等原理,常见攻击和防范⼿段
企业级Linux系统安全威胁列表
分类 | 解决的主要安全威胁 | 安全威胁牵涉到的人员及操作 |
---|---|---|
文件系统防护 | 避免有意/无意的文件篡改、越权访问,根用户(root)权限泛滥 | 企业内部用户误操作、外部黑客的恶意删除 |
进程安全防护 | 避免非法进程运行、正常进程非法终止 | 外部黑客的后门注入及非法进程运行 |
用户安全管理 | 避免弱密码被攻破 | 外部黑客使用暴力破解等方式获取密码 |
日志管理 | 通过对企业内部用户及外部黑客在系统中行动产生相应的日志进行审计,发现安全问题和蛛丝马迹 | 用户、黑客在系统中的行动产生日志记录 |
Linux系统中所有的设备都是通过文件进行操作和管理。
文件系统一致性检查
工具:tripwire 百度百科
请参考:tripwire安装与使用
四种操作模式:
根用户安全管理,sudo权限
进程是现代操作系统的一个核心概念,很多攻击的发动、黑客的入侵都是通过进程来实现的。
每个进程都有其自己的特点和属性
who,w,ps,top
查看进程信息的系统调用。文件路径 | 说明 | 应用建议 |
---|---|---|
/proc | 存放的是各种内存中的进程信息,linux内核配置,系统信息。这个是虚拟目录,不会占用磁盘空间 | |
/proc/cpuinfo | cpu信息 | 未来监控使用,获取cpu指标 |
/proc/meminfo | 内存信息 | 未来监控使用,获取内存指标 |
/proc/loadavg | 系统负载信息,衡量系统繁忙程度 | |
/proc/mounts | 系统挂载信息 | |
/proc/x | 这里的x表示进程号,每个进程在proc下有一个名为其进程号的目录 | |
/proc/devices | 当前运行的核心配置的设备驱动的列表 | |
/proc/dma | 显示当前使用的dma通道 | |
/proc/filesystems | 核心配置的文件系统 | |
/proc/interrupts | 显示使用的中断 | |
/proc/ioports | 当前使用的I/O端口 | |
/proc/kcore | 系统物理内存映象 | |
/proc/kmsg | 核心输出的消息,也被送到syslog | |
/proc/ksyms | 核心符号表 | |
/proc/modules | 当前加载了哪些核心模块 | |
/proc/net | 网络协议状态信息 | |
/proc/stat | 系统的不同状态 | |
/proc/version | 核心版本 | |
/proc/uptime | 系统启动的时间长度 | |
/proc/cmdline | 命令行参数 |
Linux作为一个多任务、多用户的操作系统,在同一时段可能为众多用户使用,且用户的管理直接关系到整个系统的安全。
入侵者大多是通过各种系统和设置漏洞,获得管理员密码来获得管理员权限的,然后,再实现对系统的恶意攻击
密码破解软件一般使用3种方法进行破解:字典猜解、组合猜解和暴力猜解。
密码的设置原则
不可让账号与密码相同
不可使用自己的姓名
不可使用英文词组
不可使用特定意义的日期
不可使用简单的密码:一个密码暴力猜解软件每秒钟可以尝试10万次之多。字数越少,字符越简单化,排列组合的结果就越少,也就越容易被攻破
若要保证密码的安全,应当遵循以下规则:
用户密码应包含英文字母的大小写、数字、可打印字符,甚至是非打印字符。建议将这些符号排列组合使用,以期达到最好的保密效果
用户密码不要太规则,不要使用用户姓名、生日、电话号码以及常用单词作为密码
根据Windows系统密码的散列算法原理,密码长度设置应超过7位,最好为14位
密码不得以明文方式存放在系统中,确保密码以加密的形式写在硬盘上并包含密码的文件是只读的
密码应定期修改,应避免重复使用旧密码,并采用多套密码的命名规则
建立账号锁定机制。一旦同一账号密码校验错误若干次,即断开连接并锁定该账号,经过一段时间才解锁。
密码策略包含以下6个策略。
密码必须符合复杂性要求
密码长度最小值
密码最长使用期限
密码最短使用期限
强制密码历史
用可还原的加密来储存密码
John the Ripper 用于在已知密文的情况下尝试破解出明文的破解密码软件:主要支持对DES、MD5两种加密方式的密文进行破解工作
https://www.openwall.com/john/
Linux系统历来以强大、丰富和完整文档日志系统著称。通过管理日志,可以清晰地了解系统的运行状况,也能从各种蛛丝马迹中国发现入侵和快速阻止入侵。
日志主要功能:审计和监测。实行地监测系统状态,监测和追踪侵入者。
可参考:CentOS的日志系统(日志文件)
造成很多用户账号泄露、机密数据泄密等安全事件的原因:
对称加密、解密是加密和解密使用相同的密码,有代表性的有DES、Blowfish、TEA、Base64。
对称加密、解密的特点是运算相对非对称加密、解密简单,速度快
主要应用于需要加密大量数据的场合
非对称加密、解密是加密和解密使用不同的密码,有代表性的有RSA、DSA、ElGamal和ECDSA。
非对称加密、解密的安全性是基于复杂数学难题,特点是运算复杂、速度慢
主要应用于金融、军事等重大机密系统
下载地址 https://www.gnupg.org/download/index.html
GnuPG(GNU Privacy Guard)就是用来加密数据与制作证书的一套工具,其作用与PGP类似。
PGP使用了许多专利算法,属于“臭名昭著”的美国加密出口限制之列。GnuPG是GPL软件,并且没有使用任何专利加密算法,所以使用起来有着更多的自由
GnuPG使用非对称加密算法,安全程度比较高。所谓非对称加密算法,就是每一个用户都拥有一对密钥:公钥和私钥。其中,密钥由用户保存,公钥则由用户尽可能地散发给其他人,以便用户之间的通信
GnuPG支持的算法如下:
其使用的基本语法为:
gpg [选项] [文件名]
其实现的功能包括签名、检查、加密或解密,默认的操作依输入数据而定
安全扫描技术是一类重要的网络安全技术。安全扫描技术与防火墙、入侵检测系统互相配合,能够有效提高网络的安全性。通过对网络的扫描,网络管理员可以了解网络的安全配置和运行的应用服务,及时发现安全漏洞,客观评估网络风险等级。网络管理员可以根据扫描的结果更正网络安全漏洞和系统中的错误配置,在黑客攻击前进行防范
安全扫描技术分类
网络安全扫描技术是一种基于Internet远程检测目标网络或本地主机安全性脆弱点的技术。
通过网络安全扫描,系统管理员能够发现所维护的Web服务器的各种TCP/IP端口的分配、开放的服务、Web服务软件版本和这些服务及软件呈现在Internet上的安全漏洞。
网络安全扫描技术也是采用积极的、非破坏性的办法来检验系统是否有可能被攻击崩溃。它利用了一系列的脚本模拟对系统进行攻击的行为,并对结果进行分析。这种技术通常被用来进行模拟攻击实验和安全审计。网络安全扫描技术与防火墙、安全监控系统互相配合就能够为网络提供很高的安全性。
包括PING扫射(Ping sweep):用于网络安全扫描的第1阶段,可以帮助我们识别系统是否处于活动状态
操作系统探测(Operating system identification):第2阶段,对目标主机运行的操作系统进行识别
如何探测访问控制规则(firewalking):第2阶段,用于获取被防火墙保护的远端网络的资料
端口扫描(Port scan):第2阶段,通过与目标系统的TCP/IP端口连接,并查看该系统处于监听或运行状态的服务
漏洞扫描(vulnerability scan):第3阶段,在端口扫描的基础上,对得到的信息进行相关处理,进而检测出目标系统存在的安全漏洞
端口扫描技术和漏洞扫描技术是网络安全扫描技术中的两种核心技术,并且广泛运用于当前较成熟的网络扫描器中,如著名的Nmap
和Nessus
端口扫描向目标主机的TCP/UDP服务端口发送探测数据包,并记录目标主机的响应。通过分析响应来判断服务端口是打开还是关闭,就可以得知端口提供的服务或信息。
端口扫描也可以通过捕获本地主机或服务器的流入、流出IP数据包来监视本地主机的运行情况,不仅能对接收到的数据进行分析,而且能够帮助用户发现目标主机的某些内在的弱点,而不会提供进入一个系统的详细步骤。
全连接扫描
全连接扫描是TCP端口扫描的基础,现有的全连接扫描有TCP connect()扫描
和TCP反向ident扫描
等
TCP connect()扫描的实现原理如下:扫描主机通过TCP/IP协议的三次握手与目标主机的指定端口建立一次完整的连接。连接由系统调用connect开始。如果端口开放,则连接将建立成功;否则,若返回-1,则表示端口关闭。如果建立连接成功,则响应扫描主机的SYN/ACK连接请求,这一响应表明目标端口处于监听(打开)的状态。
TCP半连接(SYN)扫描
TCP半连接(SYN)扫描:若端口扫描没有完成一个完整的TCP连接,在扫描主机和目标主机的一指定端口建立连接的时候只完成了前两次握手,在第三步时,扫描主机中断了本次连接,使连接没有完全建立起来,这样的端口扫描称为半连接扫描,也称为间接扫描。现有的半连接扫描有TCP SYN扫描
和IP ID头dumb扫描
等
SYN扫描的优缺点:
UDP扫描
UDP扫描中不使用工具来设定特定的状态标志。如果源UDP包的响应(即ICMP端口不可达消息)说明端口已经“关闭”,UDP扫描的过程比较长,速度比较慢
标志获取扫描
标志获取扫描是指连接到系统的特定端口,检查监听该端口的应用软件标志的过程。它可以利用TCP端口连接来获得特定系统上运行的软件和程序版本信息。在实际的应用过程中,系统管理员可能会更改或者删除相关标志,从而隐藏被监听的应用程序。
包分片
许多端口扫描器都支持包分片功能。这个功能有助于包穿透、包过滤设备并逃避入侵检测系统的监测。包分片技术将TCP或者UDP包头分成多个包,增加访问控制设备检测端口扫描信息的难度
欺骗扫描
Nmap和其他一些端口扫描工具都有“欺骗”功能,能够在直接扫描的同时进行一个或者多个欺骗性的扫描
标识扫描
标识扫描能够用来识别与特定TCP连接绑定的用户账户,它可以通过与113号TCP端口进行通信来完成,该端口会返回该连接所有者的身份信息。这种扫描仅仅对于运行ident服务的系统有效,也可以用于识别使用特权账号(例如root)的服务
FTP反弹扫描
FTP反弹扫描利用FTP服务器进行欺骗扫描,它利用的是FTP协议对代理FTP连接的支持这一特性。利用FTP服务器作为反弹“代理”,黑客能够隐藏源扫描器的原始地址
源端口扫描
端口扫描工具中的源端口扫描允许扫描者设置静态的TCP或者UDP源扫描端口,以避开包过滤访问控制设备。用于扫描的源端口通常与常用服务的端口相关联(比如HTTP、DNS、SMTP、FTP等),这些端口经常处于访问控制设备的许可范围之内
主机扫描
主机扫描的目的是确定在目标网络上的主机是否可达。这是信息收集的初级阶段,其效果直接影响到后续的扫描
漏洞扫描就是对计算机系统或者其他网络设备进行安全相关的检测,以找出安全隐患和可被黑客利用的漏洞。显然,漏洞扫描软件是把双刃剑,黑客利用它入侵系统,而系统管理员掌握它以后又可以有效地防范黑客入侵。因此,漏洞扫描是保证系统和网络安全必不可少的手段,必须仔细研究和利用
漏洞扫描通常采用两种策略,第一种是被动式策略
,第二种是主动式策略
。
Nessus
Nessus是一个功能强大而又易于使用的远程安扫描器,它不仅免费而且更新极快。安全扫描器的功能是对指定网络进行安全检查,找出该网络是否存在导致对手攻击的安全漏洞。
Nessus的优点如下:
微软的 STRIDE 模型是常用的威胁模型之一。STRIDE 的6个字母分别代表着
STRIDE 模型针对的属性、定义和例子参考
针对的属性 | 威胁 | 定义 | 例子 |
---|---|---|---|
认证 | 身份欺骗 | 冒充他人或者他物 | A用户使用B用户的账号和密码登录使用系统 |
完整性 | 篡改数据 | 修改数据或者代码 | 未授权的情况下,恶意修改了数据库中的字段数值 |
不可否认性 | 否认性 | 抵赖,声称没有做 | 我没有发送那封邮件 |
机密性 | 信息泄露 | 把信息展示给未授权去看的人 | 航空旅客的身份信息被传播在互联网上 |
可用性 | 拒绝服务 | 使服务对已授权的用户不可用 | 使网站瘫痪,让已授权用户无法进行线上交易 |
授权 | 提权 | 在未授权的情况下,把自己的权限提升到更高的水平 | Linux普通用户利用系统漏洞变成了root用户 |
在分析面对的威胁时,我们应该利用 STRIDE 模型来进行分门别类的总结梳理,这样才能更完整清晰的整理出所有的潜在威胁,并制定出相应的解决方案。
常见的安全威胁来源
在实际的安全工作中,我们常常见到的信息安全所面对的威胁来自于多个方面
Linux系统安全机制包括:
- 硬件机制
- 操作系统机制(包括访问控制、文件系统安全等)
- 安全应用程序(如杀毒软件、入侵检测系统)。
硬件机制是一种通过物理上的“钥匙”来控制访问的机制,例如使用身份验证硬件令牌,它可以授予唯一的权限,提高系统的安全性。
操作系统机制是通过操作系统的访问控制来防止未认证的用户访问系统资源的安全策略。例如,Linux系统的权限控制采用的是Unix的访问控制模型,它允许管理员通过文件或目录的访问权限来控制用户,进程,文件等系统资源的访问权限。
此外,Linux系统采用了PAM
(Linux提供的认证模块)和SELinux
(安全监督),可以针对各种网络攻击(如拒绝服务攻击,信息泄露攻击,身份欺诈攻击等)实施有效的防护控制。例如,PAM(Pluggable Authentication Module)可以控制用户认证,SELinux可以控制内存访问,并可以根据规则设置安全响应,从而有效地防范黑客的网络攻击。
Linux还可以利用安全应用程序来提高安全性。主要的安全应用程序有杀毒软件、入侵检测系统
,用于防范不断发展的新型病毒和木马攻击。例如,使用入侵检测系统可以有效地检测和报告网络的安全事件,并可以查找潜在的安全问题。
Linux系统也可以利用安全工具脚本来提高系统安全。比如:
以上是Linux操作系统的安全机制,它们可以帮助加强系统的安全性以抵御不断发展的网络攻击。
# less /etc/passwd
# grep :0: /etc/passwd
注意新的用户,和UID/GID是0的用户。
注意“entered promiscuous mode”
(进入混杂模式)
混杂模式就是接收所有经过网卡的数据包,包括不是发给本机的包。默认情况下,网卡只把发给本机的包(包括广播包)传递给上层程序,其他的包一律丢弃。
一般会出现在/var/log/messages中
# ps -aux
注意UID是0的进程
lsof -p [可疑的进程号]
察看该进程所打开端口和文件
# find / -uid 0 -perm -4000 -print #-perm:匹配特殊权限 -4000表示SUID
# find / -size +10000k -print
# find / -name '…' -print
# find / -iname ' ' -print
# find / -name '。' –print
注意SUID文件
,可疑大于10M,…,。
和空格
文件
当一个设置了SUID 位的可执行文件被执行时,该文件将以所有者的身份运行,也就是说无论谁来执行这个文件,他都有文件所有者的特权。
如果所有者是 root 的话,那么执行人就有超级用户的特权了
用八进制数4000表示setuid权限位,2000表示sgid权限位。
校验所有的RPM软件包,查找丢失的文件
[root@node-251 yurq]# rpm -Va
S.5....T. c /etc/elasticsearch/elasticsearch.yml
S.5....T. c /etc/profile
输出格式:
S 表示文件长度发生了变化
M 表示文件的访问权限或文件类型发生了变化
5 表示MD5校验和发生了变化
D 表示设备节点的属性发生了变化
L 表示文件的符号链接发生了变化
U 表示文件/子目录/ 设备节点的owner 发生了变化
G 表示文件/子目录/ 设备节点的group 发生了变化
T 表示文件最后一次的修改时间是发生了变化
注意和这些相关的 /sbin, /bin, /usr/sbin, and /usr/bin
平时养成安装第三方文件时check MD5
的习惯,要不太恐怖了
运行的时候会出很多5或者missing的提示,如果不是上面及格目录的,不用太注意
# ip link | grep PROMISC
正常网卡不该进入promisc模式,当然安全server除外,否则可能是有人入侵在sniffer
# lsof -i
# netstat -nap
察看不正常打开的TCP/UDP端口,需要平时注意
arp -a
注意root和UID是0的schedule
# crontab -u root -l
# cat /etc/crontab
# ls /etc/cron.*
使用passwd -l
锁定不必要的账号,这里是把除了root以外所有的账号都锁定,可通过passwd -u
解锁
#!/bin/bash
for temp in cut -d ":" -f 1 /etc/passwd | grep -v "root"
do
passwd -l $temp
done
新建用户的默认设置
[root@localhost ~]# vim /etc/login.defs
PASS_MAX_DAYS 90 # 新建用户密码最长使用天数
PASS_MIN_DAYS 0 # 新建用户密码最短使用天数
PASS_MIN_LEN 7 # 新建用户密码到期提示天数
PASS_WARN_AGE 10 # 最小密码长度
复杂程度至少一个大写字母一个小写字母一个数字一个特殊符号,且长度至少为10位
[root@localhost ~]# vim /etc/pam.d/system-auth
password required pam_cracklib.so try_first_pass retry=3 dcredit=-1 lcredit=-1 ucredit=-1 ocredit=-1 minlen=10
超时时间为5分钟,5分钟没有动作自动注销登陆
[root@localhost ~]# vim /etc/profile
TMOUT=300
export TMOUT
限制错误登陆次数防止暴力破解
[root@localhost ~]# vim /etc/pam.d/login
#%PAM-1.0
auth required pam_tally2.so deny=3 lock_time=300 even_deny_root root_unlock_time=10
#查询远程登录次数
pam_tally2 --user lyshark
[root@localhost ~]# useradd lyshark
[root@localhost ~]# passwd lyshark
[root@localhost ~]# vim /etc/sudoers
##The COMMANDS section may have other options added to it.
##Allow root to run any commands anywhere
root ALL=(ALL) ALL
lyshark ALL=(ALL) ALL
#--------------------------------------------------------------------------------------------
[root@localhost ~]# vim /etc/ssh/sshd_config
PermitRootLogin no
[root@localhost ~]# systemctl restart sshd
[root@localhost ~]# vim /etc/ssh/sshd_config
Port 65534 # 登录端口改为65534
MaxAuthTries=3 # 密码最大尝试次数3
[root@localhost ~]# systemctl restart sshd
[C:\Users]$ ssh [email protected] 65534
vi /etc/hosts.allow
sshd:192.168.220.1 #允许单个IP
sshd:192.168.220. #允许地址段
vi /etc/hosts.deny
sshd:ALL #除了上面允许的其他都拒绝
使用xshell等工具自带的公钥向导生成公钥,然后将公钥内容复制到服务器的/root/.ssh/ authorized_keys
将二进制文件进行锁定可以防止被修改
[root@localhost sbin]# chattr +i /sbin/
[root@localhost sbin]# chattr +i /usr/sbin/
[root@localhost sbin]# chattr +i /bin/
[root@localhost sbin]# chattr +i /sbin/
[root@localhost sbin]# chattr +i /usr/lib
[root@localhost sbin]# chattr +i /usr/lib64
[root@localhost sbin]# chattr +i /usr/libexec
系统默认的umask值为0022,将umask值改为0777的时候,用户默认创建的文件不具有可执行权限,防止被上传木马
[root@localhost ~]# echo “umask 0777” >> /etc/bashrc
[root@localhost ~]# touch test1
[root@localhost ~]# mkdir test2
[root@localhost ~]#
[root@localhost ~]# ls -lh
total 0
----------. 1 root root 0 Aug 25 05:46 test1
d---------. 2 root root 6 Aug 25 05:46 test2
限制编译可以防止黑客编译生成可执行文件用来提权
[root@node-251 yurq]# rpm -q --filesbypkg gcc | grep 'bin'
gcc /usr/bin/c89
gcc /usr/bin/c99
gcc /usr/bin/cc
gcc /usr/bin/gcc
gcc /usr/bin/gcc-ar
gcc /usr/bin/gcc-nm
gcc /usr/bin/gcc-ranlib
gcc /usr/bin/gcov
gcc /usr/bin/x86_64-redhat-linux-gcc
[root@localhost ~]# chmod 000 /usr/bin/c89
[root@localhost ~]# chmod 000 /usr/bin/c99
[root@localhost ~]# chmod 000 /usr/bin/cc
[root@localhost ~]# chmod 000 /usr/bin/gcc
[root@localhost ~]# chmod 000 /usr/bin/gcc-*
[root@localhost ~]# chmod 000 /usr/bin/gcc-*
黑客入侵后大都会对日志文件进行清空或删除,所以要将日志文件进行不能删除只能增加限制
[root@localhost ~]# cd /var/log/
[root@localhost log]# chattr +a dmesg cron lastlog messages secure wtmp
[root@localhost log]# lsattr secure
最小化防火墙规则只开放http和https等对外提供服务的端口和ssh远程连接服务
vim /etc/firewalld/zones/public.xml
<service name=“ssh”/>
<port protocol=“tcp” port=“80”/>
<port protocol=“tcp” port=“443”/>
firewall-cmd –reload
默认selinux也是开放的,但是经常会有一些未知的问题,如果没有出现未知问题可以继续开放,下面是selinux允许ssh服务
[root@localhost ~]# yum install -y policycoreutils-python-2.5-29.el7.x86_64
[root@localhost ~]# semanage port -l | grep ssh
ssh_port_t tcp 22
[root@localhost ~]# semanage port -a -t ssh_port_t -p tcp 6553
[root@localhost ~]# semanage port -l | grep ssh
ssh_port_t tcp 6553, 22
[root@localhost html]# semanage fcontext -a -t httpd_sys_content_t /var/www/html/index.html
[root@localhost html]# ls -Z
-rw-r–r–. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.html
vi /etc/profile
#在文件的末尾添加参数
export HISTTIMEFORMAT="%F %T whoami "
cp -a /usr/lib/systemd/system/ctrl-alt-del.target /usr/lib/systemd/system/ctrl-alt-del.target.default
rm -rf /usr/lib/systemd/system/ctrl-alt-del.target
cp -a /etc/grub.d/00_header /etc/grub.d/00_header.default
密码自己定义,但是一定得保存好否则最后连自己都登录不进去
[root@localhost ~]# grub2-mkpasswd-pbkdf2
Enter password:
Reenter password:
PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.B157F42E96462AB239C03000F113D32EB18FD48073F1FC7D8F87A8F3B3F89F662424ECCAB901F3A812A997E547FD520F3E99D0E080F4FE8B05E019757E34F75B.29C83F87B4B6C086FC9A81E046CC3623CC5CF2F82128EDC3A0364894E429D4993B28563F82D71BF346188108CBD4341FC4A71B90E543581646B4E7EAE920C54A
添加以下配置到该文件的最后面(特别需要注意 用户名root和密文之间是空格分隔,而不是换行)
cat <<EOF
set superusers=‘root’
password_pbkdf2 root grub.pbkdf2.sha512.10000.B157F42E96462AB239C03000F113D32EB18FD48073F1FC7D8F87A8F3B3F89F662424ECCAB901F3A812A997E547FD520F3E99D0E080F4FE8B05E019757E34F75B.29C83F87B4B6C086FC9A81E046CC3623CC5CF2F82128EDC3A0364894E429D4993B28563F82D71BF346188108CBD4341FC4A71B90E543581646B4E7EAE920C54A
E0F
grub2-mkconfig -o /boot/grub2/grub.cfg