一、调整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

3reboot之后验证

[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、通过使用chattrchangeattributes属性)命令和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 stickyuser读写执行)、(group读写执行)、(other读写执行)

那么怎么表示呢?

分别为 4 2 1 user 4 2 1 )(group 4 2 1)(others 4 21

也就是说9-11位上的124分别代表sticky粘滞位,SGIDSUID  0-8位代表othersgroupuser4 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)、SGIDset 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粘滞位仅对目录有效,它的意思是如果一个用户对一个目录有wx权限,那么此用户在此目录下创建的文件或目录只有文件的拥有者与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/