首页 > 代码库 > Linux系统安全基础知识

Linux系统安全基础知识

基本的系统安全
物理安全和登录安全
禁用root登录和sudo
可插拔认证模块(PAM)
基于PAM的口令安全和口令策略
基于PAM的访问控制


1、基本的系统安全

安全的磁盘布局
使用挂装选项提高文件系统的安全性
查找并取消文件/目录的非必要的特殊权限
避免安装不必要的软件包
配置软件包更新的Email通知
关闭不必要的服务
关闭IPv6的内核功能


1) 、安全的磁盘布局

1、如果是新安装系统,对磁盘分区应考虑安全性: 
1)根目录(/)中必须包括 /etc、/lib、/bin、/sbin,即不能在此四个目录上使用独立的分区或逻辑卷
2)除了 根目录(/)、/boot 和 SWAP 之外您应该根据自己的需要尽量分离数据到不同的分区或逻辑卷
     即根目录(/)、用户目录(/home)、临时目录(/tmp)和/var目录应分开到不同的磁盘分区; 
   
3)建议创建独立的 /usr、/var、/tmp、/var/tmp 文件系统
4)根据日志管理需要,您可能应该创建独立的 /var/log、/var/log/audit 文件系统
5)若所有普通用户数据存储在本机,您还应该创建独立的 /home 文件系统
6)若系统对外提供大量服务(如Web虚拟主机等),应该创建独立的 /srv 文件系统

以上各目录所在分区的磁盘空间大小应充分考虑,避免因某些原因造成分区空间用完而导致系统崩溃;  


2 )、提高文件系统的安全性


常用如下三个挂装参数提高文件系统的安全性
noexec:不允许在本分区上执行二进制程序,即防止执行二进制程序但允许脚本执行
nodev:不解释本分区上的字符或块设备,即防止用户使用设备文件
nosuid:不允许在本分区上执行 SUID/SGID 的访问
例如:
技术分享


3 )、去除非必要的特殊权限

1)查找系统中权限为SUID/SGID 的文件:# find / -xdev \( -perm -4000 -o -perm-2000 \) -ls
2)查找指定目录/dir下的所有用户可写的设置了粘着位(sticky-bit)的目录   :# find /dir -xdev -type d \( -perm -0002 -a! -perm -1000 \) -ls

使用 chmod命令去除文件或目录的非必要的特殊权限

chmodu-s  

chmod g-s

chmod o-t


3)对于/tmp和/var目录所在分区,大多数情况下不需要有suid属性的程序,所以应为这些分区添加nosuid属性;
  方法一:修改/etc/fstab文件,添加nosuid属性字。例如:
  /dev/hda2 /tmp ext2 exec,dev,nosuid,rw 0 0
  方法二:如果对/etc/fstab文件操作不熟,建议通过Linuxconf程序来修改。
  运行Linuxconf程序;
  选择"File systems"下的"Access local drive";
  选择需要修改属性的磁盘分区;
  选择"No setuid programs allowed"选项;
  根据需要选择其它可选项;
  正常退出。(一般会提示重新mount该分区)


4)
限制具有SUID权限标志的程序数量,具有该权限标志的程序以root身份运行,是一个潜在的安全漏洞,当然,有些程序是必须要具有该标志的,象passwd程序。



4 ) 、检查重要的文件权限


1)查找指定目录/dir下的所有用户 可写的文件:# find /dir -xdev -type f -perm -0002 -ls
2)查找指定目录/dir下的非有效用户或有效组的文件:# find /dir -xdev \( -nouser -o -nogroup \) -ls

3)使用 chmod命令修改权限:#chmodo-w  

4)使用 chown命令修改文件属主或组:#chownUSER:GROUP 


5 )、避免安装不必要的软件包

在安装过程中仅仅安装必要的软件包,使用如下命令查找、删除不必要的软件包:

# yum list installed

# yum remove PackageName

通常服务器无需运行X系统,尤其是被托管的服务器。在系统运行过程中,可以安装需要的软件包:

# yum install PackageName

6 )、软件包的更新

保持系统中软件包的更新极为重要,当软件的编制者发现软件的漏洞之后将对其进行修复,修复后的软件包就会发布到相应的yum仓库中
软件包的更新的方法:
    1)启用 yum-updated       2)服务编写 cron 脚本

7 ) 、关闭不必要的服务

cd /etc/init.d #进入到系统init进程启动目录
在这里有两个方法,可以关闭init目录下的服务,

一、将init目录下的文件名mv成*.old类的文件名,即修改文件名,作用就是在系统启动的时候找不到这个服务的启动文件。

二、使用chkconfig系统命令来关闭系统启动等级的服务。

注:在使用以下任何一种方法时,请先检查需要关闭的服务是否是本服务器特别需要启动支持的服务,以防关闭正常使用的服务。



使用chkcofig命令来关闭不使用的系统服务 (level前面为2个减号)要想在修改启动脚本前了解有多少服务正在运行,输入:

ps aux | wc -l

然后修改启动脚本后,重启系统,再次输入上面的命令,就可计算出减少了多少项服务。越少服务在运行,安全性就越好。另外运行以下命令可以了解还有多少服务在运行:

netstat -na --ip

批量方式先停止服务


批量方式先停止服务

for i in acpid anacron apmd atd auditd autofs avahi-daemon avahi-dnsconfd bluetooth cpuspeed cups dhcpd firstboot gpm haldaemon hidd ip6tables ipsec isdn kudzu lpd mcstrans messagebus microcode_ctl netfs nfs nfslock nscd pcscd portmap readahead_early restorecond rpcgssd rpcidmapd rstatd sendmai
l setroubleshoot snmpd sysstat xfs xinetd yppasswdd ypserv yum-updatesd ;do service $i stop;done

关闭启动服务

for i in acpid anacron apmd atd auditd autofs avahi-daemon avahi-dnsconfd bluetooth cpuspeed cups dhcpd firstboot gpm haldaemon hidd ip6tables ipsec isdn kudzu lpd mcstrans messagebus microcode_ctl netfs nfs nfslock nscd pcscd portmap readahead_early restorecond rpcgssd rpcidmapd rstatd sendmai
l setroubleshoot snmpd sysstat xfs xinetd yppasswdd ypserv yum-updatesd ;do chkconfig $i off;done

以下为手动方式及解释,执行批量方式后不需再执行了

chkconfig --level 345 apmd off ##笔记本需要
chkconfig --level 345 netfs off ## nfs客户端
chkconfig --level 345 yppasswdd off ## NIS服务器,此服务漏洞很多
chkconfig --level 345 ypserv off ## NIS服务器,此服务漏洞很多
chkconfig --level 345 dhcpd off ## dhcp服务
chkconfig --level 345 portmap off ##运行rpc(111端口)服务必需
chkconfig --level 345 lpd off ##打印服务
chkconfig --level 345 nfs off ## NFS服务器,漏洞极多
chkconfig --level 345 sendmail off ##邮件服务, 漏洞极多
chkconfig --level 345 snmpd off ## SNMP,远程用户能从中获得许多系统信息
chkconfig --level 345 rstatd off ##避免运行r服务,远程用户可以从中获取很多信息
chkconfig --level 345 atd off ##和cron很相似的定时运行程序的服务
注:以上chkcofig 命令中的3和5是系统启动的类型,以下为数字代表意思
0:开机(请不要切换到此等级)
1:单人使用者模式的文字界面
2:多人使用者模式的文字界面,不具有网络档案系统(NFS)功能
3:多人使用者模式的文字界面,具有网络档案系统(NFS)功能
4:某些发行版的linux使用此等级进入x windows system
5:某些发行版的linux使用此等级进入x windows system
6:重新启动

如果不指定--level 单用on和off开关,系统默认只对运行级3,4,5有效

chkconfig cups off #打印机
chkconfig bluetooth off # 蓝牙
chkconfig hidd off # 蓝牙
chkconfig ip6tables off # ipv6
chkconfig ipsec off # vpn
chkconfig auditd off #用户空间监控程序
chkconfig autofs off #光盘软盘硬盘等自动加载服务
chkconfig avahi-daemon off #主要用于Zero Configuration Networking ,一般没什么用建议关闭
chkconfig avahi-dnsconfd off #主要用于Zero Configuration Networking ,同上,建议关闭
chkconfig cpuspeed off #动态调整CPU频率的进程,在服务器系统中这个进程建议关闭
chkconfig isdn off #isdn
chkconfig kudzu off #硬件自动监测服务
chkconfig nfslock off #NFS文档锁定功能。文档共享支持,无需的能够关了
chkconfig nscd off #负责密码和组的查询,在有NIS服务时需要
chkconfig pcscd off #智能卡支持,,如果没有可以关了
chkconfig yum-updatesd off #yum更新
chkconfig acpid off
chkconfig autofs off
chkconfig firstboot off
chkconfig mcstrans off #selinux
chkconfig microcode_ctl off
chkconfig rpcgssd off
chkconfig rpcidmapd off
chkconfig setroubleshoot off
chkconfig xfs off
chkconfig xinetd off
chkconfig messagebus off
chkconfig gpm off #鼠标
chkconfig restorecond off #selinux
chkconfig haldaemon off
chkconfig sysstat off
chkconfig readahead_early off
chkconfig anacron off

需要保留的服务

crond , irqbalance , microcode_ctl ,network , sshd ,syslog

因为有些服务已运行,所以设置完后需重启

chkconfig
/*

语法:chkconfig [--add][--del][--list][系统服务] 或 chkconfig [--level <等级代号>][系统服务][on/off/reset]

补充说明:这是Red Hat公司遵循GPL规则所开发的程序,它可查询操作系统在每一个执行等级中会执行哪些系统服务,其中包括各类常驻服务。

参数:

 --add  增加所指定的系统服务,让chkconfig指令得以管理它,并同时在系统启动的叙述文件内增加相关数据。
 --del  删除所指定的系统服务,不再由chkconfig指令管理,并同时在系统启动的叙述文件内删除相关数据。
 --level<等级代号>  指定读系统服务要在哪一个执行等级中开启或关毕
*/






1)使用 ntsysv 或 chkconfig 管理工具,可以编写自己的脚本文件关闭不必要的服务:
#!/bin/bash
# /root/bin/stop_services.sh
# 请将要停止的服务以空格间隔写入变量stop_services
stop_services="bluetooth hidd irqbalance rawdevices "
for i in $stop_services; do
echo "disabling $i"
chkconfig $i off
done




8 ) 、关闭IPv6的内核功能

# echo ‘install ipv6 /bin/true‘ >> /etc/modprobe.conf


# echo <<_END_>> /etc/sysconfig/network
NETWORKING_IPV6=no
IPV6INIT=no
_END_


# service network restart
# chkconfig ip6tables off
# service ip6tables stop

2、物理安全和登录安全

配置GRUB的口令
为单用户模式启用认证
禁用重启热键
为单用户模式启用认证
禁用启动时的交互热键
设置屏幕锁定
为 BASH 设置超时自动注销

一、配置GRUB的口令

1)生成 GRUB 口令:

GRUB可以允许用户绕过所有的安全验证而进入单用户模式。管理员应该设置GRUB口令避免修改启动参数从而提供安全性。
为GRUB生成MD5口令:
# grub-md5-crypt
Password:<ENTER-YOUR-PASSWORD>
Retype password:<ENTER-YOUR-PASSWORD>
$1$WqFGw/$hkFDqkoGxqescpPKVt8/I1

2)启用GRUB配置文件的口令

修改启动参数时需要口令验证
passwd 配置语句位于全局部分(第一个“title”之前)

default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
password --md5 $1$WqFGw/$hkFDqkoGxqescpPKVt8/I1   # 添加此行

进入所选择的系统前需要口令验证,passwd 配置语句位于引导参数部分(每个“title”部分之后)

title CentOS (2.6.18-194.32.1.el5)
    root (hd0,0)
    kernel /boot/vmlinuz-2.6.18-194.32.1.el5 ro root=LABEL=/
    initrd /boot/initrd-2.6.18-194.32.1.el5.img
    password --md5 $1$WqFGw/$hkFDqkoGxqescpPKVt8/I1   # 添加此行

二、为单用户模式启用认证

在 RHEL/CentOS 中默认情况下进入单用户模式无需认证。为了提高安全性启用单用户模式的用户认证

# echo “~~:S:wait:/sbin/sulogin”>> /etc/inittab

# init q

三、禁用重启热键

在 RHEL/CentOS 中默认情况下可以通过键盘热键 <Ctrl>+<Alt>+<Delete> 重启系统。为了提高安全性禁用重启热键
# vi /etc/inittab
注释如下的行:
#ca::ctrlaltdel:/sbin/shutdown -t3 -r now

# init q


四、为单用户模式启用认证


五、禁用启动时的交互热键

RHEL/CentOS 允许控制台用户在启动过程中通过热键“i”执行交互式启动设置。
为了提高安全性,禁用启动时的交互热键


# sed -i "s/PROMPT=yes/PROMPT=no/" /etc/sysconfig/init

六、设置屏幕锁定

安装vlock包
# yum -y install vlock
使用vlock命令锁定屏幕。 锁定当前屏幕:
$ vlock
锁定所有已登录的终端会话并禁止虚拟控制台切换:
$ vlock -a

七、为BASH设置超时自动注销帐号


        自动注销帐号的登录,在Linux系统中root账户是具有最高特权的。如果系统管理员在离开系统之前忘记注销root账户,那将会带来很大的安全隐患,应该让系统会自动注销。通过修改账户中“TMOUT”参数,可以实现此功能。TMOUT按秒计算。编辑你的profile文件(vi /etc/profile),在"HISTSIZE="后面加入下面这行:

TMOUT=300

300,表示300秒,也就是表示5分钟。这样,如果系统中登陆的用户在5分钟内都没有动作,那么系统会自动注销这个账户。 




# vi /etc/profile.d/autologout.sh
TMOUT=300  # 5分钟后超时
readonly TMOUT
export TMOUT

# chmod +x /etc/profile.d/autologout.sh






3、账号安全问题,禁用root登录和sudo

一、sudo简介

1)sudo 允许授权用户以超级用户或其他用户身份执行命令
       sudo 能限制指定用户在指定主机上运行某些命令
       默认情况下,只有root用户可以使用sudo命令
2)sudo  使用普通用户自己的口令
      sudo 是设置了SUID权限位的执行文件
3)sudo 使用时间戳文件来完成类似“检票”的系统
      当用户执行 sudo 时,5分钟 内不用再输入口令
4)记录所有登录(包括成功的和不成功的登录)
/var/log/secure

二、与sudo相关的文件

1)/usr/bin/sudo:以其他用户身份执行命令
2)/etc/sudoers:sudo的配置文件。
      列出哪(些)个用户在哪个(些)主机上执行哪个(些)命令
3)/usr/sbin/visudo:用于编辑 sudoers 文件
      防止两个用户同时进行修改
    进行有限的语法检查
4)/var/run/sudo/目录:包含用户的时间戳文件

三、sudo的执行过程 


在 /var/run/sudo/$USER目录中查找时间戳文件
        1)若时间戳已过期,提示用户输入自己的口令
               若口令输入错误则退出 sudo 的执行
               若口令输入正确则继续 sudo 的执行过程
        2)若时间戳未过期,继续 sudo 的执行过程
读取配置文件 /etc/sudoers,判断用户是否具有执行此 sudo 命令的权限
       1)若有权限执行则执行 sudo 后面的命令
        2)若无权执行则退出 sudo 的执行


四、快速配置sudo


将所有需要使用sudo的普通用户添加到 wheel组中
# usermod -G wheel  osmond
# usermod -G wheel  jason

配置允许wheel组可以执行sudo命令
# visudo
// 删除如下行的注释符,之后保存退出
%wheel        ALL=(ALL)       ALL

五、su与sudo比较
su
直接切换为超级用户
普通用户要切换为超级用户必须知道超级用户的口令
适用于系统中只有单个系统管理员的情况
sudo
直接使用 sudo 命令前缀执行系统管理命令
执行系统管理命令时无需知道超级用户的口令
适用于系统中有多个系统管理员的情况
允许 root 为几个用户或组委派权利,使之能运行部分或全部由 root (或另一个)用户执行的命令
sudo 设计者的宗旨:给用户尽可能少的权限但仍允许完成他们的工作
当然系统只有单个系统管理员时也可以使用

六、/etc/sudoers 的配置语法
技术分享

1)(Runas)部分可以省略,省略时表示(root)
2)四个部分均可设置多个项目,每个项目用逗号间隔。
3)在User部分使用“%组名”的形式为组中的所有用户授权。
在Cmnd部分
     使用NOPASSWD:前缀参数,表示不用输入口令即可执行Cmnd。
      使用 ! 前缀表示逻辑非。使用Shell通配符 匹配可以执行的命令。
4)ALL表示所有。以#开始的行为注释行。行末的\为续行符。

5)定义四种别名
User_Alias
Host_Alias
Runas_Alias
Cmnd_Alias

6)语法
User_Alias     USER_ALIAS_NAME = user1, user2, ......
Host_Alias     HOST_ALIAS_NAME = host1, host2, ......
Runas_Alias  RUNAS_ALIAS_NAME = runas1, runas2, ......
Cmnd_Alias   COMMAND_ALIAS_NAME = cmnd1, cmnd2, ......
6)使用别名简化授权


7)/etc/sudoers 的配置举例1:
专职系统管理员(millert,mikef和dowdy)可以在任何主机上以root用户身份执行任何命令而不需要进行身份验证。

User_AliasFULLTIMERS =millert,mikef,dowdy

FULLTIMERSALL = NOPASSWD: ALL


8)/etc/sudoers的配置举例2

兼职管理员(jalala, sonar和huge)可以在任何主机上以root用户身份运行别名BROWSE、PROCESSES、USERS 中定义的命令,同时可以修改除了root 用户之外的所有用户口令。

User_Alias       PARTTIMERS2 = jalala,sonar , huge

Cmnd_Alias      BROWSE = /bin/ls,/bin/cd,/bin/cat

Cmnd_Alias      PROCESSES = /bin/nice, /bin/kill, /usr/bin/killall

Cmnd_Alias      USERS = /usr/sbin/useradd [A-z]*,/usr/sbin/userdel -r[A-z]*

PARTTIMERS2  ALL= USERS,PROCESSES,BROWSE, /usr/bin/passwd [A-z]*!/usr/bin/passwd root

七、sudo命令

技术分享

n-H : 将环境变量中的$HOME指定为要变更身份的使用者的目录(如不加-u参数就是/root)。
n-b : 在后台执行指令。
n-u username|#uid:以指定的用户作为新的身份。省略此参数表示以root的身份执行指令。
n-i : 模拟一个新用户身份的初始Shell。
n-s : 执行环境变量$SHELL所指定的Shell,或是/etc/passwd里所指定的Shell。

sudo命令举例:

n查看当前用户可以使用sudo执行的命令列表

sudo -l

n进入交互式( interactively)登录,类似“su-”

sudo -i

n直接执行授权的命令

sudo/usr/sbin/useradd otheruser

sudo/usr/bin/passwdotheruser

sudosh -c "cd /home ; du -s * |sort -rn > USAGE"


五、限制su命令

 如果您不想任何人能够su作为root,可以编辑/etc/pam.d/su文件,增加如下两行: 
  auth sufficient /lib/security/pam_rootok.so debug 
  auth required /lib/security/pam_wheel.so group=isd 
 这时,仅isd组的用户可以su作为root。此后,如果您希望用户admin能够su作为root,可以运行如下命令: 
  # usermod -G10 admin 

六、修改ssh服务的登录权限

修改ssh服务配置文件,使的ssh服务不允许直接使用root用户来登录,这样减少系统被恶意登录攻击的机会。

#vi /etc/ssh/sshd_config
PermitRootLogin yes

将这行前的#去掉后,修改为:

PermitRootLogin no

七、修改ssh服务的sshd 端口

     ssh默认会监听在22端口,可以修改到60200端口以避过常规的扫描。
     注意:修改端口错误可能会导致你下次连不到服务器,可以先同时开着22和6022两个端口,然后再关掉22端口;
     重启sshd不会弹掉你当前的连接,可以另外开一个客户端来测试服务;

#vi /etc/ssh/sshd_config
#增加修改
#Port 22 #关闭22端口
Port 6022 #增加6022端口
#重启sshd服务
service sshd restart
检查一下sshd的监听端口对不对
netstat -lnp|grep ssh
#iptables开放sshd的6022端口
vi /etc/sysconfig/iptables
#如果使用redhat默认规则则增加
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 6022 -j ACCEPT
#或
iptables -A INPUT -p tcp --dport 6022 -j ACCEPT
iptables -A OUTPUT -p udp --sport 6022 -j ACCEPT


重启iptables 服务

service iptables restart
#测试两个端口是否都能连上,连上后再将22端口删除



八、更安全措施:禁止帐号登录,使用pubkey登录






4、系统安全记录文件

   操作系统内部的记录文件是检测是否有网络入侵的重要线索。如果您的系统是直接连到Internet,您发现有很多人对您的系统做Telnet/FTP登录尝试,可以运行\"#more /var/log/secure | grep refused\"来检查系统所受到的攻击,以便采取相应的对策,如使用SSH来替换Telnet/rlogin等。 






5、防止攻击

  1.阻止ping 如果没人能ping通您的系统,安全性自然增加了。为此,可以在/etc/rc.d/rc.local文件中增加如下一行: 
     echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all 

  2.防止IP欺骗 
    编辑/etc/host.conf文件并增加如下几行来防止IP欺骗攻击。 
# Lookup names via DNS first then fall back to /etc/hosts.
order hosts,bind
# We have machines with multiple IP addresses.
multi on
# Check for IP address spoofing.
nospoof on

         第一项设置首先通过DNS解析IP地址,然后通过hosts文件解析。

         第二项设置检测是否“/etc/hosts”文件中的主机是否拥有多个IP地址(比如有多个以太口网卡)。

        第三项设置说明要注意对本机未经许可的电子欺骗。


  3.防止DoS攻击 
 对系统所有的用户设置资源限制可以防止DoS类型攻击。如最大进程数和内存使用数量等。例如,可以在/etc/security/limits.conf中添加如下几行: 
  * hard core 0 
  * hard rss 5000 
  * hard nproc 20 
  然后必须编辑/etc/pam.d/login文件检查下面一行是否存在。 
  session required /lib/security/pam_limits.so 
 上面的命令禁止调试文件,限制进程数为50并且限制内存使用为5MB。 

 经过以上的设置,你的Linux服务器已经可以对绝大多数已知的安全问题和网络攻击具有免疫能力,但一名优秀的系统管理员仍然要时刻注意网络安全动态,随时对已经暴露出的和潜在安全漏洞进行修补。













4、可插播认证模块(PAM)




可插拔认证模块(PAM)

5、基于PAM的口令安全和口令策略




可插拔认证模块(PAM)
基于PAM的口令安全和口令策略
基于PAM的访问控制


基于PAM的口令安全和口令策略


6、基于PAM的访问控制



基于PAM的访问控制

5、基于PAM的口令安全和口令策略




可插拔认证模块(PAM)
基于PAM的口令安全和口令策略
基于PAM的访问控制

4、可插播认证模块(PAM)



Linux系统安全基础知识