一、调整linux系统文件描述符数量(应用于生产环境中高并发服务器)
1、先查看系统打开最大文件描述符(所有进程)
[root@PAN-Server~]# cat /proc/sys/fs/file-max #查看系统即所有进程打开最大文件描述符数量 150570
2、修改配置文件实现永久变更
echo“fs.file-max = 5000000” >> /etc/sysctl.conf
临时性变更 echo 3000000 >>/proc/sys/fs/file-max
3、reboot之后验证
[root@PAN-Server~]# cat /proc/sys/fs/file-max
5000000
4、 查看当前系统使用的
[root@PAN-Server~]# cat /proc/sys/fs/file-nr 5344 0 5000000
5344表示当前系统已分配使用的
0表示分配后释放的
5000000表示file-max数
5、单个进程打开的最大文件描述符数
[root@PAN-Server~]# ulimit –Hn #hardlimit 硬限制 4096 [root@PAN-Server~]# ulimit –Sn #softlimit 软限制不能超过hardlimit 单个进程打开的文件描述符数不能超过softlimit 1024 [root@PAN-Server~]# cat /proc/sys/fs/nr_open #hardlimit硬限制不能超过这个数 否则无法正常登陆系统 1048576
6、更改进程打开的最大文件描述符数(永久生效)
[root@PAN-Server~]# echo "* - nofile 1000000" >> /etc/security/limits.conf [root@PAN-Server~]# [root@PAN-Server~]# tail -n 1 !$ tail -n 1/etc/security/limits.conf * - nofile 1000000 <domain> <type> <item> <value> Reboot
[root@PAN-Server~]# ulimit –Hn #hard limit 1000000 [root@PAN-Server~]# ulimit –Sn #soft limit 1000000 [root@PAN-Server~]# cat /proc/sys/fs/nr_open #进程硬限制不能超过此数 1048576 [root@PAN-Server~]#
二、文件系统安全策略
首先认识一下linux文件系统中比较重要的目录
/bin 二进制可执行命令也就是基本系统所需要的命令,普通用户也可以执行 /sbin 超级管理命令,这里存放的是系统管理员使用的管理程序只能超级用户使用 /dev 设备特殊文件 /etc 系统管理和配置文件 /etc/rc.d 启动的配置文件和脚本 /home 用户主目录的基点,比如用户user的主目录就是/home/user,可以用~user表示 /lib 标准程序设计库,又叫动态链接共享库,作用类似windows里的.dll文件。库文件和内核模块存放目录,包含系统程序所需要的所有共享文件 /tmp 公共的临时文件存储点 同 /var/tmp /opt 第三方软件的存放目录,比如用户自定义软件包和编译的软件包就安装到这个目录中。 /root 系统管理员的主目录 /mnt 系统提供这个目录是让用户临时挂载其他的文件系统 /lost+found这个目录平时是空的,系统非正常关机而留下“无家可归”的文件(windows下叫什么.chk)就在这里 /proc 虚拟的目录,是系统内存的映射。可直接访问这个目录来获取系统信息。 /var 某些大文件的溢出区,比方说各种服务的日志文件,存放经常变动的数据日志邮件等。
/usr 最庞大的目录,要用到的应用程序和文件几乎都在这个目录,其中包含: /usr/x11R6 存放x window的目录 /usr/bin 众多的应用程序 /usr/sbin 超级用户的一些管理程序 /usr/doc linux文档 /usr/includelinux下开发和编译应用程序所需要的头文件 /usr/lib 常用的动态链接库和软件包的配置文件 /usr/man 帮助文档 /usr/src 源代码,linux内核的源代码就放在/usr/src/linux里 /usr/local/bin 本地增加的命令 /usr/local/lib 本地增加的库根文件系统
了解完文件系统目录的情况下面我们可以通过如下命令来改变其属性增强其安全性。
1、通过使用chattr(changeattributes属性)命令和lsatt命令来修改文件属性来锁定文件或目录
Chattr 命令语法: 以下语法仅供参考更多信息可以通过manchattr 获取 Usage: chattr [-RVf] [-+=AacDdeijsSu] [-v version]files... 常用参数: -R 递归 用法同cp –r命令 -V 显示详细内容 -f 强制 忽略错误信息 - 移除参数 + 追加参数 = 设定为 a append only (a)只能添加数据 不能删除 历史记录和日志文件的安全可以使用此参数 c compressed (c)文件压缩存储 D synchronous directory updates (D)同步目录更新 i immutable (i)不可变,也就是不能变更其内容,所有对此文件的操作禁止 s secure deletion (s) 安全删除,空闲释放了,数据无法恢复 u undeletable (u) 与s相反,可以恢复被删除的数据
通过上面的参数描述可以对系统的目录和文件进行安全加固,先来介绍一下目录
目录 /boot /sbin /bin /lib /usr/bin /usr/incude/usr/lib /usr/sbin
文件 /etc/passwd/etc/shadow /etc/hosts /etc/group /etc/gshadow /etc/resolv.conf /etc/fstab/etc/inittab /etc/sudoers 以及日志文件/var/log/messages /var/log/wtmp
对目录和文件加上immutable属性使其不能发生变更实例如下:
[root@PAN-Server~]# chattr -R +i /boot /sbin /bin /lib /usr/bin /usr/include /usr/lib /usr/sbin [root@PAN-Server~]# chattr +i /etc/{passwd,shadow,gshadow,hosts,resolv.conf,fstab, sudoers,group}
对日志文件加上appendonly属性
[root@PAN-Server ~]# chattr +a /var/log/{messages,wtmp}
这里我想提醒一下,虽然通过上面的命令可以起到加固文件系统安全的作用,但是也有一些不方便的地方,比如安装,编译软件时,需要去掉append only属性,但是我觉得相对于安全来说,麻烦一点也无所谓。假如grub开机启动加密了不也麻烦了吗?如果服务器意外断电了,而恰好人在外地,同时设置了BIOS里,来电自动开启。不输入密码系统也是打不开的。当然还是应该评估一下生产环境的应用环境来取舍利弊。
举个栗子:
[root@PAN-Server~]# useradd mm && echo 123456 | passwd --stdin mm useradd: cannotopen /etc/passwd [root@PAN-Server~]# chattr -i /etc/passwd [root@PAN-Server~]# useradd mm && echo 123456 | passwd --stdin mm useradd: cannotopen /etc/shadow [root@PAN-Server~]# chattr -i /etc/shadow [root@PAN-Server~]# useradd mm && echo 123456 | passwd --stdin mm useradd: cannotopen /etc/group [root@PAN-Server~]# chattr -i /etc/group /etc/gshadow [root@PAN-Server~]# useradd mm && echo 123456 | passwd --stdin mm Changingpassword for user mm. passwd: allauthentication tokens updated successfully.
2、通过修改权限来增强文件系统安全的方法和解析
示例:
[root@PAN-Server~]# ls /tmp -ld
drwxrwxrwt 18root root 4096 Jun 28 11:08 /tmp
目录的权限格式为drwxrwxrwt,其实应该是12位少了3位 “S” 位、”G”位、”T位”
这里我用11 10 9 8 7 6 5 43 2 1 0来表示这12位
分别对应的是SUID SGID sticky(user读写执行)、(group读写执行)、(other读写执行)
那么怎么表示呢?
分别为 4 2 1 (user 4 2 1 )(group 4 2 1)(others 4 21 )
也就是说9-11位上的124分别代表sticky粘滞位,SGID,SUID 0-8位代表others,group,user的4读 2写 1 执行权限
(1)、SUID 为set UID 此仅可以对二进制文件生效,不能用于批处理文件,它的意思是使用户在执行过程中暂时拥有该程序拥有者的权限
示例:
[root@PAN-Server ~]# ll /etc/passwd -rw-r--r-- 1 root root 1708 Jun 28 01:19 /etc/passwd [root@PAN-Server ~]# ll /usr/bin/passwd -rwsr-xr-x. 1 root root 30768 Feb 17 2012 /usr/bin/passwd #S在user位即为SUID
(2)、SGID为set GID 此可以对文件和目录生效,当SGID设置在文件上,则不管用哪个用户执行该程序,他的有效用户组将会变成该程序的GID。当SGID设置在目录上时,则目录下所建立的文件或者目录的用户组为此目录的用户组
示例:
[root@PAN-Server ~]# chmod 2777 /dog #SGID [root@PAN-Server ~]# ll -d /dog drwxrwsrwx 2 root root 4096 Jun 28 13:26 /dog [mrpan@PAN-Server root]$ cd [mrpan@PAN-Server ~]$ mkdir /dog/apple [mrpan@PAN-Server ~]$ touch /dog/apple/a.txt [mrpan@PAN-Server ~]$ ls -l /dog total 4 drwxrwsr-x 2 mrpan root 4096 Jun 2813:30 apple #红色部分所属组为root [mrpan@PAN-Server ~]$ ls -l /dog/apple/a.txt -rw-rw-r-- 1 mrpan root 0 Jun 2813:30 /dog/apple/a.txt #红色部分所属组为root [mrpan@PAN-Server ~]$
(3)、Sticky粘滞位仅对目录有效,它的意思是如果一个用户对一个目录有w、x权限,那么此用户在此目录下创建的文件或目录只有文件的拥有者与root才能删除。
示例:还用刚才的dog目录
[root@PAN-Server~]# ll -d /dog/ drwxrwsrwx 3root root 4096 Jun 28 13:30 /dog/ [root@PAN-Server~]# chmod 1777 /dog/ [root@PAN-Server~]# chmod g-s !$ chmod g-s /dog/ [root@PAN-Server~]# ll -d /dog/ drwxrwxrwt 3root root 4096 Jun 28 13:30 /dog/ [root@PAN-Server~]# mkdir /dog/wolf [root@PAN-Server~]# touch /dog/ww.txt [root@PAN-Server~]# su mrpan [mrpan@PAN-Serverroot]$ cd [mrpan@PAN-Server~]$ rm -rf /dog/wolf/ rm: cannotremove `/dog/wolf': Operation not permitted [mrpan@PAN-Server~]$ sudo chmod o-t /dog #这里用了sudo提权为root权限参照上面 四、sudo命令 [mrpan@PAN-Server~]$ sudo ls -ld /dog/ drwxrwxrwx 4root root 4096 Jun 28 13:48 /dog/ [mrpan@PAN-Server~]$ rm -rf /dog/wolf/ [mrpan@PAN-Server~]$
3、文件的权限检查
针对2中的权限问题引申出3通过设置正确的权限来加固ours服务器安全
完成4步如下:
step1、找出系统中没有属主或属组的文件 Step2、找出系统中有“S”位的文件 Step3、找出属主为root用户且有“S”位的文件并检查其MD5值保存备用 Step4、找出系统中任何用户都有w权限的文件或目录
这里我详细列一下find命令的用法(基础的用法可以manfind 查看)
Find模式为:
find[path...] [expression]
其中[expression]又有选项、条件(其结果有true或者false默认为true即条件省略时,如果为true则执行动作)、动作(默认print)
find . -wholename ’./src/emacs’ -prune -o–print 等同于 find . –path ’./src/emacs’ -prune -o –print注意这里的-prune是action动作express被-o拆分为两个子句,即 –path ’./src/emacs’–prune 和-print 第一个子句:–path ’./src/emacs’ –prune
条件为-path 动作为-prune 条件为true则执行动作,这个子句返回值为true 条件为false则不执行动作,这个子句返回值为false 第二个子句:-print 条件省略了默认为true , 第一个子句为true时,后面的就省略了不用看了。 只有当第一个子句为false时才执行action
相当于如下表达式:
if-path ‘/src/emacs‘then -prune else -print
Step1、找出系统中没有属主或属组的文件或目录
[root@PAN-Server~]# find / -type d \( -nouser -o -nogroup \) | xargs ls -ld | more [root@PAN-Server~]# find / -type f \( -nouser -o -nogroup \) | xargs ls –l | more
可以用find / -nouser -o -nogroup
Step2、找出系统中有“S”位的文件
[root@PAN-Server~]# find / -type f \( -perm -4000 -o -perm -2000 \) | xargs ls -l | more
Step3、找出属主为root用户且有“S”位的文件并检查其MD5值保存备用
(1)、先查看一下是否正确 [root@PAN-Server~]# find / -type f -user root \( -perm -4000 -o -perm -2000 \) -print | xargsls -l | more (2)、保存上述结果到文件 [root@PAN-Server~]# find / -type f -user root \( -perm -4000 -o -perm -2000 \) -exec md5sum {}\; >> /root/md5sum-root-s.txt (3)、备份到其他地方以备将来检查作为参考。
Step4、找出系统中任何用户都有写权限的文件或者目录
[root@PAN-Server~]# find / -type f \( -perm -2 -o -perm -20 \) | xargs ls -l | more [root@PAN-Server ~]# find / -type d \( -perm -2 -o -perm -20 \) | xargsls -ld | more
4、临时文件及共享内存设备文件安全策略
(1)、共享内存设备文件:/dev/shm这是一个特殊并且很有用的文件,它不再磁盘上而是在内存里,可以使用内存也可以使用交换分区,可以用df命令查看
[root@PAN-Server~]# df –h /dev/shm Filesystem Size Used Avail Use% Mounted on tmpfs 754M 72K 754M 1% /dev/shm #最大为内存的一半 [root@PAN-Server~]# cat /etc/fstab | grep shm tmpfs /dev/shm tmpfs defaults 0 0 修改属性为: [root@PAN-Server~]# cat /etc/fstab | grep shm #限制所有的suid属性,可执行权限 tmpfs /dev/shm tmpfs defaults,nosuid,noexec,rw 0 0
(2)、临时文件存放在两个地方:/tmp /var/tmp 任何用户可读可写可执行
[root@PAN-Server~]# ls /var/tmp/ -l total 0 [root@PAN-Server~]# ls /var/tmp/ -ld drwxrwxrwt. 2root root 4096 Jun 27 14:35 /var/tmp/ [root@PAN-Server~]# ln -s /tmp/ /var/tmp #创建软链接
对于/tmp目录可以如下操作,创建一个loopback文件系统,利用内核的loopback特性挂载到/tmp下,同时加上挂载属性。
[root@PAN-Server~]# dd if=/dev/zero of=/dev/fstmp bs=1M count=10000 dd: writing `/dev/fstmp': No spaceleft on device 744+0 records in 743+0 records out 779173888 bytes (779 MB) copied, 3.96827 s, 196 MB/s [root@PAN-Server ~]# [root@PAN-Server ~]# mkfs.ext4 /dev/fstmp [root@PAN-Server~]# mount -o loop,noexec,nosuid,rw /dev/fstmp /tmp [root@PAN-Server ~]# chmod 1777 /tmp #sticky权限设置 [root@PAN-Server ~]# mv -f /tmp tmp/ tmp.bak/ [root@PAN-Server ~]# ls /tmp tmp/ tmp.bak/ [root@PAN-Server ~]# ls /tmp/ lost+found [root@PAN-Server ~]# cp -a /tmp.bak/* /tmp #所有文件转移回到/tmp下 [root@PAN-Server ~]# ls /tmp 88.tzt keyring-mU6Sl4 pulse-96s77dE0E17c virtual-root.CRQGjR VMwareDnD a.txt lost+found pulse-IekGR76T4J4X virtual-root.hD8jmS vmware-root backup orbit-gdm test virtual-root.m1YY1B vmware-tools-distrib keyring-FCTtyG pan.txt virtual-root.9nAHTV virtual-root.XV8QYt
[root@PAN-Server ~]# blkid /dev/fstmp #获取UUID /dev/fstmp: UUID="95fea017-5aa8-47a4-bf08-aa021cd7d843"TYPE="ext4" [root@PAN-Server ~]# echo"UUID="95fea017-5aa8-47a4-bf08-aa021cd7d843" /tmp ext4loop,nosuid,noexec,rw 0 0" >> /etc/fstab -bash: /etc/fstab: Permission denied [root@PAN-Server ~]# chattr -i /etc/fstab [root@PAN-Server ~]# echo"UUID="95fea017-5aa8-47a4-bf08-aa021cd7d843" /tmp ext4loop,nosuid,noexec,rw 0 0" >> /etc/fstab [root@PAN-Server ~]# mount -a [root@PAN-Server ~]# df -Th Filesystem Type Size Used Avail Use% Mounted on /dev/sda2 ext4 7.7G 6.3G 1.1G 86% / tmpfs tmpfs 754M 72K 754M 1% /dev/shm /dev/sda1 ext4 485M 35M 426M 8% /boot /dev/sr0 iso9660 3.6G 3.6G 0 100% /mnt /dev/fstmp ext4 732M 21M 674M 4% /tmp [root@PAN-Server ~]#
2、 定期清理postfix服务的垃圾文件
[root@PAN-Server ~]# ls /var/spool/postfix/maildrop/