首页 / 帮助文档 / ubuntu安全设置umask默认值限制新文件权限过宽

ubuntu安全设置umask默认值限制新文件权限过宽

Ubuntu系统默认的umask值是0022,这意味着新创建的文件权限是644(rw-r--r--),新创建的目录权限是755(rwxr-xr-x)。在大多数个人桌面场景下这个设置够用,但在多用户服务器、生产环境或者安全要求较高的场景中,这个权限就太宽松了——其他用户可以读取你的文件,这是一个实实在在的安全隐患。解决办法很直接:把umask改成0027或者0077,让同组用户和其他用户都无法读取新创建的文件和目录。下面我会从原理、检查方法、修改方式、持久化配置、验证手段到常见踩坑,全部给你讲透。

一、umask到底是什么,为什么它决定文件权限

umask(user file-creation mode mask)是一个权限掩码,它的作用是从系统默认的最大权限中"减去"一部分,得到实际创建文件时的权限。Linux系统给文件的基础权限是666(rw-rw-rw-),给目录的基础权限是777(rwxrwxrwx)。umask的值就是要屏蔽掉的权限位。

举个例子:umask为0022时,文件权限 = 666 - 022 = 644,目录权限 = 777 - 022 = 755。这意味着同组用户和其他用户都有读和执行(目录)的权限。如果你的服务器上有多个用户,别人就能翻看你家目录下的文件内容,这在共享主机、容器环境、Web服务器上是不可接受的。

二、如何查看当前umask值

在终端里直接输入以下命令就能看到当前的umask设定:

umask

输出通常是四位数字,比如0022或者0002。如果你想看符号形式,可以用:

umask -S

输出类似u=rwx,g=rx,o=rx这样的格式。另外,你还可以用一个小技巧来验证实际效果——创建一个测试文件和测试目录,然后用ls -l查看权限:

touch testfile
mkdir testdir
ls -ld testfile testdir

你会看到testfile的权限是-rw-r--r--,testdir是drwxr-xr-x,这就是0022 umask下的真实结果。

三、Ubuntu默认umask为什么是0022

Ubuntu从18.04开始使用PAM(Pluggable Authentication Modules)来管理umask。具体来说,/etc/login.defs文件中定义了USERGROUPS_ENC变量,当它设为yes时,系统会为每个用户创建一个与用户名同名的私有组,然后umask默认设为0002(文件664,目录775)。但如果USERGROUPS_ENC设为no,或者用户已经属于某个现有组,那么umask就回退到0022。

这套机制的设计初衷是方便多用户协作,但从安全角度看,它假设了"同组用户是可信的"。在实际生产环境中,这个假设经常不成立。特别是在Docker容器、云主机、共享VPS上,你根本不知道同组还有谁。

四、临时修改umask的方法

如果你只是想在当前会话中测试一下,直接在终端执行:

umask 0027

这样新创建的文件权限就是640(rw-r-----),目录权限是750(rwxr-x---)。同组用户可以读和进入目录,但其他用户完全没有权限。如果你想更严格,设成0077:

umask 0077

文件权限变成600(rw-------),目录权限变成700(rwx------),只有文件所有者能访问。这种设置适合单用户服务器或者高度敏感的数据目录。注意,临时修改只对当前终端会话有效,关掉终端或者新开一个登录会话就会恢复默认值。

五、永久修改umask的四种方式

要让umask修改永久生效,有以下几种途径,根据你的使用场景选择:

方式一:修改/etc/login.defs(全局生效)

这是最直接的全局配置文件。用编辑器打开:

sudo nano /etc/login.defs

找到UMASK那一行,把它改成:

UMASK 027

注意这里不需要写前导零,系统会自动补齐。改完保存,所有新登录的用户都会使用这个umask。但已经登录的用户不受影响,需要重新登录才能生效。

方式二:修改/etc/profile或/etc/bash.bashrc(针对所有bash用户)

在/etc/profile末尾添加:

umask 0027

或者在/etc/bash.bashrc中添加同样的内容。这对所有使用bash shell的用户生效,包括通过SSH登录的用户。但通过其他方式登录(比如sftp、cron任务)可能不会加载这些文件。

方式三:修改用户级配置文件~/.bashrc或~/.profile(针对单个用户)

如果你只想改自己的umask,编辑自己家目录下的配置文件:

nano ~/.bashrc

在文件末尾加上:

umask 0027

保存后执行source ~/.bashrc让它在当前会话立即生效。这种方式只影响你自己,不影响其他用户,适合多用户系统中的个人安全加固。

方式四:通过PAM模块配置(最规范的方式)

Ubuntu使用pam_umask模块来控制umask。配置文件在/etc/pam.d/common-session和/etc/pam.d/common-session-noninteractive中。你可以在common-session文件中找到类似这样的行:

session optional pam_umask.so umask=0022

把它改成:

session optional pam_umask.so umask=0027

这种方式是Ubuntu官方推荐的标准做法,对所有通过PAM认证的登录方式都生效,包括本地登录、SSH、图形界面登录等。修改后不需要重启,新的登录会话自动使用新值。

六、不同umask值的权限对照表

为了让你更直观地理解不同umask值的效果,这里列出常用值的权限结果:

umask 0022 → 文件644(rw-r--r--) 目录755(rwxr-xr-x)  [Ubuntu默认]
umask 0027 → 文件640(rw-r-----) 目录750(rwxr-x---)  [推荐安全值]
umask 0077 → 文件600(rw-------) 目录700(rwx------)  [最严格]
umask 0002 → 文件664(rw-rw-r--) 目录775(rwxrwxr-x)  [协作模式]
umask 0007 → 文件660(rw-rw----) 目录770(rwxrwx---)  [组内协作]

对于大多数生产服务器,0027是一个平衡点——既不会影响同组用户的正常协作(如果你确实需要的话),又能阻止其他用户窥探你的文件。如果是存放敏感数据的目录,直接用0077。

七、修改后如何验证是否生效

修改配置后,最重要的一步是验证。不要假设改了就一定生效,特别是在多用户环境中。按以下步骤操作:

第一步:重新登录或者新开一个终端会话。

第二步:执行umask命令确认值已经变化。

第三步:创建测试文件和目录,用ls -l查看实际权限。

umask
touch /tmp/verify_file
mkdir /tmp/verify_dir
ls -ld /tmp/verify_file /tmp/verify_dir

如果输出显示文件权限是-rw-r-----(640),目录是drwxr-x---(750),说明0027已经正确生效。如果还是644和755,说明你改的配置文件没有被加载,需要检查是不是改错了文件,或者是不是有其他地方覆盖了你的设置。

八、常见踩坑和注意事项

坑一:改了/etc/profile但SSH登录没生效。这是因为SSH登录通常不加载/etc/profile,而是加载~/.bashrc或/etc/bash.bashrc。解决办法是同时在多个文件中设置,或者用PAM方式统一管理。

坑二:cron任务中的umask不受用户配置影响。cron有自己独立的环境,默认umask是0022。如果你的定时脚本创建了文件,权限可能比你预期的宽松。解决办法是在crontab中显式设置:

0 2 * * * umask 0027 && /path/to/script.sh

坑三:systemd服务的umask由服务单元文件中的UMask指令控制,跟用户的umask无关。如果你运行的是systemd管理的服务,需要在对应的.service文件中设置:

[Service]
UMask=0027

坑四:不要把umask设成0000。虽然这样最方便,但任何用户都能读写你的文件,等于完全放弃了权限保护。安全和便利之间要找到平衡。

九、进阶建议:结合其他安全措施

单纯修改umask只是第一步。在生产环境中,建议同时做以下几件事:第一,定期用find命令检查权限异常的文件,比如查找所有权限为644的敏感文件:

find /home -type f -perm 644 -name "*.conf" -o -name "*.key" -o -name "*.pem"

第二,对已有的文件批量修正权限,比如把某个目录下所有文件改成640:

find /var/www/html -type f -exec chmod 640 {} \;
find /var/www/html -type d -exec chmod 750 {} \;

第三,启用审计工具如auditd来监控文件权限变更,及时发现异常操作。umask只能控制新文件的默认权限,对已经存在的文件无能为力,所以存量文件的权限治理同样重要。

十、总结

Ubuntu默认umask 0022在安全性上存在明显不足,尤其在多用户和服务器场景下,其他用户可以随意读取你的新文件。将umask调整为0027或0077是一个简单但有效的安全加固手段。推荐通过PAM模块(/etc/pam.d/common-session)进行全局配置,同时在用户级~/.bashrc中做备份设置,确保各种登录方式都能生效。修改后务必验证,并结合find、chmod、auditd等工具做持续的权限管理。安全不是一次性的操作,而是持续的习惯。