天天看点

Linux系统安全基础Linux系统安全

Linux系统安全

Linux系统概述

1、历史

Linux操作系统诞生于1991年,它是Unix的一种典型克隆系统。它是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统,继承了Unix以网络为核心的设计是想,也是一个性能稳定的多用户网络操作系统。由Linus Torvalds设计,在热心的支持者帮助下不断开发完善。开源、开放、免费是Linux的魅力所在,Linux还具有良好的可移植性。

2、内核简介

Linux是一个一体化内核系统。

“内核”指的是一个提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件。一个内核不是一个完整的操作系统。一套基于Linux内核的完整操作系统叫做Linux操作系统,或是GNU/Linux。设备驱动程序开源完全访问硬件,可以在系统运行时直接装载或卸载。

内核是一个操作系统最重要的部分,Linux内核目前也是在不断的更新。因为内核也是会有很多漏洞和缺陷的,出于安全性内核版本应该引起注意。

Linux内核编号形式:主版本号.次版本号.修订版本号

较小的内核隐患和安全补丁被赋予了次小数点版本号,如2.6.11.1

在Linux的终端中,查看本机内核信息的命令为:

uname -a

Linux系统安全基础Linux系统安全

加载内核模块的命令为

insmod filename

删除内核模块的命令为

rmmod filename

其中,filename为用户准备好了需要加入内核的模块文件,查看系统已经加载的内核模块如下图(比较多图里只有一部分)

Linux系统安全基础Linux系统安全

3、发行版本

发行版本是真的挺多的,各种各样的,比较著名的3个:Fedora、SUSE、Debian。著名的Ubuntu就是Debian的下游,CentOS和Oracle Linux则是Fedora的下游。我用的Kali Linux就是基于Debian发展而来的。

4、文件系统

Linux和Windows下的文件的组织结构不用,Linux不使用磁盘分区符号来访问文件系统,而是整个文件系统表示成树状结构,Linux系统没增加一个文件系统都会将其加入到这个树中。

操作系统文件结构的开始,只有一个单独的顶级目录结构,叫根目录。所有的一切都是从根开始,用“/”表示,并且延申到子目录。

DOS/Windows系统下的文件系统都是按照磁盘分区的概念分类,目录存在分区上。而Linux系统则是通过“挂载“方式把所有分区都放置在"根"下的各个目录里。我虚拟机里的Kali Linux的文件结构可以看下面。

Linux系统安全基础Linux系统安全

还可以用

tree

命令来更加直观的显示文件目录的树状结构如下图。

Linux系统安全基础Linux系统安全

由于Ubuntu系统不自带tree命令,我的kali Linux也没有tree命令,所以可以使用

apt-get install tree

(kali linux)进行安装或

sudo apt-get install tree

进行安装。

OpenSSH安全配置

OpenSSH是安全Shell协议族(SSH)的一个免费版本。SSH协议族可以用来进行远程控件,或在计算机之间传送文件。而实现此功能的传统方式,如Telnet、RCP都是极不安全的,并且使用明文传送密码。OpenSSH提供了服务端后台程序和客户端工具,来实现机密数据,并且代替原来的类似服务。

SSHD是一个典型的独立的守护进程,OpenSSH服务可以通过/etc/ssh/sshd_config文件配置。

1、禁止Root用户登录

只允许普通用户登录,设置如下。

#Authentication:
LoginGraceTime 120
PermitRootLogin no
StrictModes yes
           

2、限制SSH验证重试次数

超过5次Socket连接会断开,设置如下。

MaxAuthTries 5

3、禁止证书登录

证书登录很安全,但是正常用户和权限用户都可以给系统安装一个证书到.ssh/authorized-keys文件里,随时进入系统。对此可以禁用证书登录

PubkeyAuthenticationno

4、使用证书替代密码认证

这个与上面讲的正好相反,只允许使用key文件登录

PasswordAuthenticationno

5、图形窗口客户端记忆密码的问题

当使用XShell、Xftp、WinSCP、SecureCRT、SecureFX等软件登录时,该软件都提供记住密码的功能,使下一吃在登录就可以不输入密码进入系统。这是很方便但是在设备丢失后,就会产生巨大的风险。可以进行如下设置。

ChallengeResponseAuthentication yes

6、禁止SSH端口映射

AllowTcpForwarding no

7、IP地址限制

如果只希望特定IP地址的用户登录主机,如果只允许192.168.1.1和192.168.1.2访问登录,可以对/etc/host.allow进行修改:

sshd:192.168.1.1 192.168.1.2

如果希望禁止所有人访问主机,对/etc/hosts.deny修改,如下:

sshd:ALL

Shell安全

1、.history文件

通过~/.bash_history文件记录系统管理员的操作记录,定制.bash_history格式。

(1)以Root用户登录服务器,在/etc/profile.d/下新建一个文件history_command。

(2)编辑刚才创建的文件,写入内容。

export HISTFILE=$HOME/.bash_history
export HISTSIZE=1200
export HISTFILESIZE=1200
export HISTCONTROL=ignoredups
export HISTTIMEFORMAT=”'whoami' %F %T “
shopt -s histappend
typeset -r HISTTIMEFORMAT
           

(3)使用source/etc/profile.c/history_command,使其生效。

2、执行权限

以数据库为例,从安全角度考虑,需要进行如下的更改。

#chown mysql:mysql/usr/bin/mysql*
#chown 700 /usr/bin/mysql*
           

mysql用户是DBA专用用户,其他用户将不能执行mysql等命令。

权限管理和控制

1、权限查看

Linux系统中每一个文件和目录都有访问许可权限,通过其来确定谁可以以何种方式访问和操作文件或者目录。

文件或目录的访问权限分为只读、只写、可执行3种。文件创建时,文件所有者自动拥有对该文件的读、写和可执行权限。

-rwxrw-rw- 1 root root 24064 1月 1410:58 qq.exe

为例子

看最左边,

-

表示不具有该权限,

r

为只读,

w

为写,

x

为可执行。第一个字符如果时

-

则表示这是一个非目录文件,如果是d,表示是一个目录,后面的字符每3个为一组,分别表示属主、组用户、其他用户的访问权限。可以看出qq.exe是一个普通文件,属主可以读、写、可执行,而组用户只有读和写权限,其他用户也是只有读和写权限。同时,qq.exe文件的所有者是root用户,属于root组用户。

2、管理控制

可以使用chown命令来改变文件的所属用户和组,将指定文件的拥有者改为指定的用户或组。

命令格式:chown[选项]用户或组文件,命令选项为一下选项:

-R:递归改变指定目录及其下面的所有子目录和文件拥有者

-v:显示chown命令所做的工作

使用chown命令修改用户和组的如下:

Linux系统安全基础Linux系统安全

使用chmod命令修改文件权限可以灵活更多,它支持数字设定权限,其中,读权限r对应数字4,写权限w对应2,执行权限x对应1,chmod使用如下

Linux系统安全基础Linux系统安全

+x就是对所有的用户添加执行权限,使用u+x,指定文件的所有者增加执行权限,同理还用o+x,g+x。

数字设定权限方法如下:

777对应所有rwx权限,444对应所有的r权限。

chmod 777 b

后得到如下结果

Linux系统安全基础Linux系统安全

为了安全应该要尽量避免产生权限为777的文件,毕竟所有人都可以读、写、执行将会带来较大的安全威胁和风险。

文件系统安全

Linux对于文件权限管理是完善和全面的,但是用户通常会在权限的设置上产生批漏,

下面对于文件系统的权限和安全做进一步说明。

1.锁定系统重要文件

系统运维人员有时候可能会遇到通过Root用户都不能修改或删除某个文件的情况,产生

这种情况的大部分原因可能是这个文件被锁定了。在Linux下锁定文件的命令是chattr,通过

这个命令可以修改ext2、ext3、ext4文件系统下文件属性,但是这个命令必须有超级用户Root

来执行。和这个命令对应的命令是lsattr,这个命令用来查询文件属性。

通过chatr命令修改文件或目录的文件属性能够提高系统的安全性,下面简单介绍下

chattr和lsattr两个命令的用法。

lsattr用来查询文件属性,用法比较简单,其语法格式如下。

Isattr [-RVadIpv] [文件]

常用参数如下所示。

-a:列出目录中的所有文件,包括以.开头的文件。

-d:显示指定目录的属性。

-R:以递归的方式列出目录下所有文件及子目录以及属性值。

-v:显示文件或目录版本。

chattr命令的语法格式如下。

chattr [-RV] [-v version] [mode]文件或目录。

主要参数含义如下。

-R:递归修改所有的文件及子目录。

-V:详细显示修改内容,并打印输出。

其中,mode部分用来控制文件的属性,常用参数如下所示。

+:在原有参数设定基础上,追加参数。

-:在原有参数设定基础上,移除参数。

=:更新为指定参数。

a:即append,设定该参数后,只能向文件中添加数据,而不能删除。常用于服务器日志安全文件,只有Root用户才能设置这个属性。

c:即compresse 设定文件是否经压缩后再存储。读取时需要经过自动解压操作。

i:即immutable, 设定文件不能被修改、 删除、重命名、设定链接等, 同时不能写入或

新增内容。 这个参数对于文件系统的安全设置有极大帮助。

s:安全删除文件或目录,即文件被删除后硬盘空间被全部收回。

u:与s参数相反,当设定为u时,系统会保留其数据块以便以后能够恢复删除这个文件。

这些参数中,最常用到的是a和i,参数a常用于服务器日志文件安全设定,而参数i更为严

格,不允许对文件进行任何操作,即使是Root用户。

在Linux系统中,如果一个用户以Root的权限登录或某个进程以Root的权限运行,那么它的使用权限就不再有任何的限制了。因此,攻击者通过远程或本地攻击手段获得了系统的Root权限将是一个灾难。 在这种情况下,文件系统将是保护系统安全的最后一道防线, 合理的属性设置可以最大限度地减小攻击者对系统的破坏程度,通过chattr命令锁定系统些重要的文件或目录,是保护文件系统安全最直接、最有效的手段。

对一些重要的目录和文件可以加上“i” 属性,常见的文件和目录如下所示。

[email protected]:~/ chattr -R +i /bin /boot /lib /sbin
[email protected]:~/ chattr -R +I /usr/bin /usr/include /usr/lib /usr/sbin
[email protected]:~/ chattr +i/etc/passwd
[email protected]:~/ chattr +i/etc/shadow
[email protected]:~/ chattr +i/etc/hosts
[email protected]:~/ chattr +i/ect/resolv.conf
[email protected]:~/ chattr +i/etc/fstab
[email protected]:~/ chattr +i/ect/sudoers
           

对一些重要的日志文件可以加上“a”属性,如下所示。

[email protected]:~/ chattr +a /var/log/messages
[email protected]:~/ chattr +a /var/log/wtmp
           

对重要的文件进行加锁,虽然能够提高服务器的安全性,但是也会带来一些不便。 例如,在软件的安装、升级可能需要去掉有关目录和文件的immutable属性和append-only属性,同时,对日志文件设置了append-only属性,可能会使日志轮换(logrotate)无法进行。因此,在使用chattr命令前,需要结合服务器的应用环境来权衡是否需要设置immutable属性和append-only属性。

另外,虽然通过chattr命令修改文件属性能够提高文件系统的安全性,但是它并不适合所有的目录。chattr 命令不能保护/、/dev、 /tmp、 /var 等目录。

根目录不能有不可修改属性,因为如果根目录具有不可修改属性,那么系统根本无法工作: /dev在启动时,syslog 需要删除并重新建立/dev/log套接字设备,如果设置了不可修改属性,那么可能出问题;/tmp目录会有很多应用程序和系统程序需要在这个目录下建立临时文件,也不能设置不可修改属性; /var 是系统和程序的日志目录,如果设置为不可修改属性,那么系统写日志将无法进行,所以也不能通过chattr 命令保护。

2.文件权限检查和修改

系统中如果有不正确的权限设置,可能会危及整个系统的安全,下面列举查找系统不安全权限的方法。

(1)查找系统中任何用户都有写权限的文件或目录,查找文件,如下所示。

[email protected]:~# find/ -type f perm -2 -0 perm -20 | xargs ls -al
           

查找目录,如下所示。

[email protected]:~# find / -type d -perm -2 -o perm -20 | xargs 1s -ld
           

(2)查找系统中所有含“s”位的程序。

find/-type f-perm -4000 -o -perm -2000 -print | xargs ls -al
           

含有“s”位权限的程序对系统安全威胁很大,通过查找系统中所有具有“s”位权限的程序,可以把某些不必要的“s"位程序去掉,这样可以防止用户滥用权限或提升权限的可能性。

(3)检查系统中所有suid及sgid文件。

find/ -user root -perm -2000 -print -exec md5sum {} \;
find/ -user root -perm -4000 -print -exec md5sum {} \;
           

将检查的结果保存到文件中,可在以后的系统检查中作为参考。

(4)检查系统中没有属主的文件

find/ -nouser -o -nogroup
           

没有属主的孤儿文件比较危险,往往成为黑客利用的工具,因此,找到这些文件后,要么删除掉,要么修改文件的属主,使其处于安全状态。

iptables配置

iptables是用来设置、维护和检查Linux内核的IP分组过滤规则的。作为Linux下的一款防火墙,它的功能十分强大,它有3个表,每个表内有规则链。

(1) filter 是默认的表,包含了内建的链INPUT (处理进入的分组)、FORWARD (处理通过的分组)和OUTPUT (处理本地生成的分组)。

(2)nat表被查询时表示遇到了产生新的连接的分组,由3个内建的链构成:PREROUTING(修改到来的分组)、OUIPUT (修改路由之前本地的分组) POSTROUTING (修改准备出去的分组)。

(3 )mangle表用来对指定的分组进行修改。它有2个内建规则: PREROUTING (修改路由之前进入的分组)和OUTPUT (修改路由之前本地的分组)。下面简单介绍ipables的常用配置。

1.查看iptables规则

查看当前的iptables策略,使用iptables -L命令,默认查看的是flter表的内容,如下。

Linux系统安全基础Linux系统安全

2、设置chain策略

对于filter表,默认的chain策略为ACCEPT, 可以通过以下命令修改chain 的策略。

[email protected]:~# iptables -P INPUT DROP
[email protected]:~# iptables -P FORWARD DROP
[email protected]:~# iptbales -P OUTPUT DROP
           

以上命令配置将接收、转发和发出分组均丢弃,施行比较严格的分组管理。由于接收和

发分组均被设置为丢弃,当进一步配置其他规则的时候,需要注意针对INPUT和OUTPUT

分别配置,当然,如果信任本机器往外发分组,上面第 3条规则可不必配置。

3.清空已有规则

可以用以下规则来清空已有的规则。

[email protected]:~# iptables -F
           

4.网口转发规则

对于用作防火墙或网关的服务器,一个网口连接到公网,其他网口的分组转发到该网口

实现内网向公网通信,假设ethO连接内网,ethl 连接公网,配置规则如下。

[email protected]:~# iptables -A FORWARD -i eth0 -0 ethl -j ACCEPT
           

5.端口转发规则

命令将888端口的分组转发到22端口,因而通过888端口也可进行SSH连接。

[email protected]:~# iptables -t nat A PREROUTING ptep d 192 168.1.1 dport 888 1 DNAT -to 192. 168.1.1:22
           

6、DoS攻击防范

利用拓展模块limit,还可以配置iptables规则,实现DoS攻击防范,如下:

[email protected]:~# iptables -A INPUT -p tcp -dport 80 -m limit -limit 25/minute --limit-burst 100 -j ACCEPT
           

–limit 25/minute 指示每分钟限制最大连接数为25 。

–limit-burst 100 指示当总连接数超过100时,启动limit/minute限制。

常见的安全策略

Linux操作系统下有如下常用的安全策略。

密码长度、session超时时间、删除不用的账号和组,限制Root用户直接Telnet或rlogin、

SSHD登录。

检查是否存在除Root之外UID为0的用户,确保Root用户的系统路径中不包含父目录,

在非必要的情况下,不应包含组权限为777的目录。

检查操作系统Linux用户umask设置,检查重要目录和文件的权限,禁止除Root之外的

用户su操作,查找系统中任何人都有写权限的目录。

查找系统中没有属主的文件,查找系统中的隐藏文件,判断日志与审计是否合规,登录

超时设置,禁用不必要的服务。

参考文献

[1]网络空间安全实战基础.陈铁民.北京.2018.2

继续阅读