FAQ 最佳实践 Linux相关
Linux临时目录安全优化

一、/tmp、/var/tmp、/etc/fstab

在Linux系统中,用来存放临时文件主要有两个目录或分区,分别是/tmp和/var/tmp。

存储临时文件的目录或分区有个共同点,就是所有用户可读写、可执行,这就为系统留下了安全隐患。

攻击者可以将病毒或者木马脚本放到临时文件的目录下进行信息收集或伪装,严重影响服务器的安全。

此时,如果修改临时目录的读写执行权限,还有可能影响系统上应用程序正常运行,因此,如果要兼顾两者,就需要对这两个目录或分区进行特殊设置。

1.1、/etc/fstab 的作用

/etc/fstab是用来存放文件系统的静态信息的文件。

位于/etc/目录下,可以用命令less /etc/fstab 来查看,如果要修改的话,则用命令 vi /etc/fstab 来修改。

当系统启动的时候,系统会自动地从这个文件读取信息,并且会自动将此文件中指定的文件系统挂载到指定的目录。

1.2、/tmp的安全设置

(1)/tmp 是独立磁盘分区的安全设置

对于/tmp的安全设置,需要看/tmp是一个独立磁盘分区,还是一个根分区下的文件夹。

如果/tmp是一个独立的磁盘分区,那么设置非常简单,修改/etc/fstab文件中/tmp分区对应的挂载属性,加上nosuid、noexec、nodev三个选项即可,修改后的/tmp分区挂载属性类似如下:

vim /etc/fstab/

LABEL=/tmp     /tmp          ext3    rw,nosuid,noexec,nodev   0 0

其中,nosuid、noexec、nodev选项表示不允许任何suid程序,在这个分区不能执行任何脚本等程序,以及不存在设备文件。

在挂载属性设置完成后,重新挂载/tmp分区,保证设置生效。

mount -o rw,noexec,nosuid,nodev /tmp/

参数详解:

-o - 挂载时使用的参数,注意有些 参数是特定文件系统才有的。

rw - 以读写模式挂载文件系统。

noexec - 不允许执行此文件系统上的二进制文件。

nosuid - 禁止 suid 操作和设定 sgid 位。

nodev - 不解析文件系统上的块特殊设备。

(2)/tmp 是目录的安全设置

如果/tmp是根目录下的一个目录,那么设置稍微复杂,可以通过创建一个loopback文件系统来利用Linux内核的loopback特性将文件系统挂载到/tmp下,然后在挂载时指定限制加载选项即可。一个简单的操作示例如下:

[root@Cloudbility ~]# dd if=/dev/zero of=/dev/tmpfs bs=1M count=900 # 这里生成的文件大小是1G,如果需要更改大小,修改count后面的值就可以了 

[root@Cloudbility ~]# mke2fs -t ext4 /dev/tmpfs  # 格式化文件系统

[root@Cloudbility ~]# cp -av /tmp /tmp.old  

[root@Cloudbility ~]# mount -o loop,noexec,nosuid,rw /dev/tmpfs /tmp  

[root@Cloudbility ~]# chmod 1777 /tmp  

[root@Cloudbility ~]# mv -f /tmp.old/* /tmp/  

[root@Cloudbility ~]# rm -rf /tmp.old 

[root@Cloudbility ~]#echo "/dev/tmpfs  /tmp ext4 loop,nosuid,noexec,rw 0 0">>/etc/fstab # 写入配置文件,下次开机自动挂载

这里如果在/dev/下的tmpfs 重启会消失的话,可以不要放在/dev下。

参数详解:

dd :命令用于复制文件并对原文件的内容进行转换和格式化处理。

dd命令功能很强大的,对于一些比较底层的问题,使用dd命令往往可以得到出人意料的效果。

用的比较多的还是用dd来备份裸设备。但是不推荐,如果需要备份oracle裸设备,可以使用rman备份,或使用第三方软件备份,使用dd的话,管理起来不太方便。

if - 输入文件(或设备名称)。

of - 输出文件(或设备名称)。 

bs - bytes 同时设置读/写缓冲区的字节数(等于设置ibsobs)。 

count - blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。


/dev/zero - 是一个输入设备,你可你用它来初始化文件。该设备无穷尽地提供0,可以使用任何你需要的数目——设备提供的要多的多。他可以用于向设备或文件写入字符串0/dev/zero也是一个伪文件,但它实际上产生连续不断的null的流(二进制的零流,而不是ASCII型的)。 写入它的输出会丢失不见,而从/dev/zero读出一连串的null也比较困难, 虽然这也能通过od或一个十六进制编辑器来做到。 

/dev/zero主要的用处是用来创建一个指定长度用于初始化的空文件,就像临时交换文件。

mke2fs:创建ext2/ext3/ext4文件系统,默认配置在/etc/mke2fs.conf,相关命令有mkfs{,.ex{2,3,4}}

-j 创建journal

#把该设备格式化成ext3文件系统 mke2fs -j /dev/sda6  

#把该设备格式化成ext2文件系统  mke2fs /dev/sda6 

cp:

-a - 此参数的效果和同时指定"-dpR"参数相同;

-d - 当复制符号连接时,把目标文件或目录也建立为符号连接,并指向与源文件或目录连接的原始文件或目录;

-p - 保留源文件或目录的属性;

-R/r - 递归处理,将指定目录下的所有文件与子目录一并处理;

-v - 详细显示命令执行的操作。

mount

loop设备介绍

在类 UNIX 系统里,loop设备是一种伪设备(pseudo-device),或者也可以说是仿真设备。它能使我们像块设备一样访问一个文件。

在使用之前,一个 loop设备必须要和一个文件进行连接。这种结合方式给用户提供了一个替代块特殊文件的接口。因此,如果这个文件包含有一个完整的文件系统,那么这个文件就可以像一个磁盘设备一样被 mount 起来。

 loop 含义:对于第一层文件系统,它直接安装在我们计算机的物理设备之上;而对于这种被 mount 起来的镜像文件(它也包含有文件系统),它是建立在第一层文件系统之上,这样看来,它就像是在第一层文件系统之上再绕了一圈的文件系统,所以称为 loop

chmod :用来变更文件或目录的权限。在UNIX系统家族里,文件或目录权限的控制分别以读取、写入、执行3种一般权限来区分,另有3种特殊权限可供运用。用户可以使用chmod指令去变更文件与目录的权限,设置方式采用文字或数字代号皆可。符号连接的权限无法变更,如果用户对符号连接修改权限,其改变会作用在被连接的原始文件。

1777: drwxrwxrwt             /tmp
0777: drwxrwxrwx             /tmp

即当一个目录被设置为"粘着位"(chmod a+t),则该目录下的文件只能由

一、超级管理员删除
二、该目录的所有者删除
三、该文件的所有者删除

也就是说,即便该目录是任何人都可以写,但也只有文件的属主才可以删除文件。

粘滞位权限在生产环境中也被广泛应用,当需要为用户提供一个开放目录而又不希望造成管理混乱时,通过为目录设置粘滞位权限便可以解决问题。

如欲了解更多:Google Linux 粘滞位

最后,编辑/etc/fstab,添加如下内容,以便系统在启动时自动加载loopback文件系统

vim /etc/fstab/

/dev/tmpfs /tmp ext3 loop,nosuid,noexec,rw 0 0

为了验证挂载时指定限制加载选项是否生效,可以在/tmp分区创建一个test文件,操作如下:

[root@Cloudbility tmp]# echo "Hello Cloudbility.com" > /tmp/test.sh                                 

[root@Cloudbility tmp]# cat /tmp/test.sh                                                                                           
Hello Cloudbility.com                                                                            

[root@Cloudbility tmp]# ll /tmp/test.sh                                                                                            
-rwxr-xr-x 1 baobao baobao 22 Apr 15 14:42 /tmp/test.sh                                                 

[root@Cloudbility tmp]# pwd                                                                                                        
/tmp                                                                                       

[root@Cloudbility tmp]# ./test.sh                                                                                                  
-bash: ./test.sh: Permission denied     

从测试结果可以看到虽然具有执行权限,但是在 /tmp下面已经无法执行任何文件了.

1.3、/var/tmp 的安全设置

对于/var/tmp,如果是独立的磁盘分区,安装/tmp的设置方法是修改/etc/fstab文件即可(方法与上述 /tmp 是独立磁盘分区的安全设置相同 );

如果是/var分区下的一个目录,那么可以将/var/tmp目录下所有数据移动到/tmp分区下,然后在/var下做一个指向/tmp的软连接即可。也就是执行如下操作:

[root@Cloudbility ~]# mv /var/tmp/* /tmp  

[root@Cloudbility ~]# ln -s  /tmp /var/tmp 

二、/dev/shm

/dev/shm是Linux下的一个共享内存设备,在Linux启动的时候系统默认会加载/dev/shm,被加载的/dev/shm使用的是tmpfs文件系统,而tmpfs是一个内存文件系统,存储到tmpfs文件系统的数据会完全驻留在RAM中,这样通过/dev/shm就可以直接操控系统内存,这将非常危险,因此如何保证/dev/shm安全也至关重要。

2.1、/dev/shm的安全设置

由于/dev/shm是一个共享内存设备,因此也可以通过修改/etc/fstab文件设置而实现,在默认情况下,/dev/shm通过defaults选项来加载,这样保证其安全性是不够的,需要修改/dev/shm的挂载属性,操作如下:

tmpfs   /dev/shm    tmpfs   defaults,nosuid,noexec,rw  0 0

通过这种方式限制了任何suid程序,同时也限制了/dev/shm的可执行权限,系统安全性得到进一步提升。

三、FAQ

3.1、修改/etc/fstab重起后,无法启动的解决办法

在/etc/fstab中增加了一个条目,让系统启动时自动挂载这个文件系统。

启动过程出现下面的提示:

Give root password for maintenance (or type Control-D to continue):

键入密码后进入shell 可以对机器进行操作. 本以为修改回原来的文件就行了, 但这时文件系统是只读(root 也没用),也就是说无法存盘.

解决办法: 这是所有的文件系统是只读的,输入root密码后,使用这个命令

mount -o remount,rw /

这样就可以修改/etc/fstab了