首页 > 系统相关 >大年学习linux(第四节---文件权限)

大年学习linux(第四节---文件权限)

时间:2024-02-20 09:55:26浏览次数:39  
标签:文件 root sudo 用户 --- linux 权限 第四节 目录

四、文件权限

文件类型

Linux文件类型和linux文件的文件名所代表的意义是两个不同的概念。我们通过一般应用程序而创建的比如 file.txt、file.tar.gz ,这些文件虽然要用不同的程序打开,但放在linux文件类型中衡量的话,大多是常规文件。

Linux文件系统类型:
普通文件

-rw-r-r-- 第一个符号- ,这个代表的就是普通文件,这些文件一般是用一些相关的应用程序创建,比如图像工具、文档工具、归档工具…… 或cp工具等。这类文件的删除方式是用rm命令。

目录

当看到drwxr-xr-x,这样的文件就是目录,目录在Linux中是一个比较特殊的文件,注意他的第一个字符是d。创建目录的命令可以用mkdir命令,或cp命令,cp可以把一个目录复制为另一个目录。删除用rm或rmdir命令。

字符设备文件
如果你要进入/dev/目录,列一下文件,会看到类似如下的:

我们可以看到/dev/tty 的属性是crw-rw-rw-,注意前面第一个字符是c,这表示字符设备文件。比如猫等串口设备
我们看到 /dev/sda1的属性是brw-r-----,注意前面的第一个字符是b,这表示块设备,比如硬盘,光驱等设备,
这个种类的文件,使用mknode来创建,用rm来删除。目前在最新的linux发行版本中,我们一般不用自己来创建设备文件。因为这些文件是和内核相关联的。

块设备文件

这个文件的属性第一个字符是s ,知道这个就可以了

符号链接文件

这个文件的属性第一个字符是l

文件权限

在Linux和其他类Unix操作系统中,每个文件和目录都有与之关联的一组权限,用于控制不同用户或用户组对这些资源的访问。文件权限分为三类:

  1. 所有者(Owner)权限

    • 用户(User):这是创建文件或目录的用户的权限。
    • r(Read):允许读取文件内容或列出目录内容。
    • w(Write):允许修改文件内容或在目录中创建、删除、重命名文件。
    • x(Execute):允许执行文件(对于目录来说,表示能够进入该目录)。
  2. 所属组(Group)权限

    • 组(Group):与文件所有者属于同一组的其他用户的权限。
    • 同样有r、w和x权限,分别对应组内成员对该文件或目录的读取、写入和执行权限。
  3. 其他用户(Others)权限

    • 除了所有者和同组用户之外的任何其他用户都归为此类。
    • 同样具有r、w和x权限,控制其他用户对该文件或目录的操作权限。

文件权限可以通过命令行工具ls -l查看,输出结果中的前九个字符就表示了权限信息,例如:

-rwxrwxrwx

其中:

  • 第一位表示文件类型(d表示目录,-表示普通文件,l表示符号链接,等等);
  • 接下来的三位依次代表所有者、所属组和其他用户的权限。

为了更改文件或目录的权限,可以使用chmod命令:

chmod [options] mode file...

例如:

  • chmod u+x file.txt:为所有者添加执行权限;
  • chmod g=rw file.txt:将所属组的权限设置为只读和写入;
  • chmod o-rwx file.txt:从其他用户处移除所有权限。

此外,还可以通过数字模式来设定权限,比如chmod 750 file.txt,这里的数字是八进制形式,每一位分别代表所有者、所属组和其他用户的rwx权限位,每种权限的二进制值分别为4(r)、2(w)和1(x),相加得到相应权限级别。

在Linux和其他类Unix系统中,每个文件和目录都有常规的权限设置(rwx),但还有一种特殊权限称为SUID、SGID和Sticky Bit,它们可以进一步控制文件或目录的访问权限。

  1. SUID (Set User ID)
    当一个可执行文件设置了SUID位时,任何用户在执行这个文件时,都将暂时拥有该文件所有者的权限。这对于需要临时提升权限以完成特定任务的应用程序非常有用,例如root用户的密码修改命令passwd

    在文件权限表示中,如果所有者权限中的x被替换为s,则表示SUID已设置。例如: -rwsr-xr-x 中的 s 表示SUID。

  2. SGID (Set Group ID)
    对于一个设置了SGID位的文件或目录,当用户执行此文件或进入目录时,其进程将继承该文件或目录所属组的权限。对于目录来说,新创建的文件也将继承该目录的组所有权,而不是创建者的默认主组。

    在权限表示中,如果所属组权限中的x被替换为s,则表示SGID已设置;如果没有执行权限x,则通常用S代替。例如: -rwxr-sr-x 中的 s 表示SGID。

  3. Sticky Bit
    仅对目录有效。设置了Sticky Bit的目录允许所有用户在其内创建和删除文件,但只有文件的所有者才能删除自己的文件。这在多用户共享的目录(如 /tmp)中很有用,防止其他用户误删他人文件。

    在权限表示中,如果其他用户权限中的x被替换为t(没有执行权限则显示T),则表示Sticky Bit已设置。例如: -rwxrwxrwt 中的 t 表示Sticky Bit。

要设置这些特殊权限,可以使用 chmod 命令:

  • 设置SUID:chmod u+s filename
  • 设置SGID:chmod g+s dirname (针对目录) 或 chmod g+s filename (针对二进制文件)
  • 设置Sticky Bit:chmod o+t dirname (仅针对目录)

同时,也可以通过数字模式来设置,比如:

  • SUID: chmod 4755 filename
  • SGID: chmod 2755 dirnamechmod 2755 filename
  • Sticky Bit: chmod 1755 dirname

超级权限控制

在Linux系统中,超级权限(Superuser privileges)通常指的是root用户的权限。root用户是系统中的最高权限用户,可以执行任何操作,包括但不限于管理文件系统、安装和卸载软件包、修改系统配置以及管理其他用户账户等。

什麽是超级用户?

Root用户就是超级用户

Uid和用户的对应关系?

在Linux系统中,每个用户都有一个唯一的用户标识符(User ID,简称UID)。UID是一个整数值,用于唯一标识系统中的每一个用户账户。这个数字与用户的用户名之间存在一一对应的关系。

具体来说:

  • 当创建新用户时,系统会自动为该用户分配一个未使用的、大于等于100的UID(系统用户的UID通常小于100)。
  • 用户名和UID之间的关系记录在 /etc/passwd 文件中,该文件每一行代表一个用户账号,每行内容由冒号分隔的字段组成,其中第二个字段就是用户的UID。
  • 例如,在 /etc/passwd 文件中的一行可能是这样的:username:x:1000:1000:User Name:/home/username:/bin/bash,这里的 x:1000 中的 1000 就是该用户的UID。
  • 当系统需要判断某个用户是否具有对文件或目录的操作权限时,它会检查操作请求发起者的UID是否与文件的所有者ID(文件的属主UID)相匹配,以及其他基于文件权限位和所属组GID(Group ID)的判断。

简而言之,UID是操作系统用来内部识别和管理用户的机制,并与用户名关联起来,共同构成了Linux系统中的用户管理体系。

普通用户和伪装用户?

在Linux系统中,通常将用户分为以下几种类型:

  1. 普通用户(Regular User):
    普通用户是拥有独立账户和权限的非管理员用户。它们对系统的访问权限受到限制,只能执行与自身相关的文件操作、程序运行等,并且不能修改系统级别的配置或文件。普通用户的UID通常大于100。

  2. 超级用户(Superuser / Root):
    超级用户即root用户,它具有对整个系统的完全控制权,可以执行任何操作,包括但不限于管理其他用户账户、安装和卸载软件、修改系统配置文件等。root用户的UID通常是0。

  3. 伪装用户(Sudo User)
    伪装用户不是严格意义上的用户类型,而是指那些通过sudo命令获得临时超级用户权限的普通用户。在 /etc/sudoers 文件中设置允许某些普通用户使用sudo命令执行特定的管理任务,但并不赋予其完整的root权限。

虽然题目中并未明确提及“伪装用户”这一概念,但这里所描述的“伪装用户”实际上是通过sudo机制获取了临时提升权限的普通用户。这样做的目的是为了遵循最小权限原则,让普通用户在需要执行特权操作时,能够安全地进行,同时又避免他们一直以root身份登录系统可能带来的潜在风险。

超级用户在系统管理中的作用?

1.对任何文件、目录或进程进行操作
但值得注意的是这种操作是在系统最高许可范围内的操作;有些操作就是具有超级权限的root也无法完成。

比如/proc 目录,/proc 是用来反应系统运行的实时状态信息的,因此即便是root也无能为力;他的权限如下:

就是这个目录,只能是读和执行权限,但绝对没有写权限的;就是我们把/proc目录的写权限打开给root,root用户也是不能进行写操作;

最后显示:无法创建目录‘testdir’:没有那个文件或目录

对于涉及系统全局的系统管理

硬件管理、文件系统理解、用户管理以及涉及到的系统全局配置等等……如果你执行某个命令或工具时,提示你无权限,大多是需要超级权限来完成;
比如用adduser来添加用户,这个只能用通过超级权限的用户来完成。

超级权限的不可替代性

超级权限(如Linux系统中的root权限)的不可替代性体现在以下几个方面:

  1. 系统级操作:超级用户能够执行涉及系统核心配置、内核参数调整、启动服务等只有最高权限才能进行的操作。例如,安装和更新操作系统组件、管理系统防火墙规则、修改系统时间等。

  2. 账户与文件管理:超级用户可以创建、删除任何用户账号,以及对所有文件和目录进行任意级别的读写执行操作,包括那些受保护的重要系统文件。同时,也只有超级用户能解除某些锁定或被占用的资源。

  3. 安全与审计:在发生安全事件时,超级用户能介入并采取必要的修复措施,比如清理恶意进程、审查系统日志、修复受损的系统设置等。此外,系统级别的安全策略和访问控制也需要超级用户来实施和维护。

  4. 硬件设备管理:对于一些涉及底层硬件交互的任务,例如添加新硬件、调整驱动程序、挂载特殊设备等,都需要超级用户的权限。

  5. 紧急恢复:当系统出现故障无法正常运行时,超级用户可以通过一系列特权操作进行紧急情况下的系统恢复。

由于超级权限的广泛性和深度,没有它就无法完成许多关键性的系统管理和维护任务,因此其在系统管理中的作用是不可或缺且无法替代的。然而,过度使用或者滥用超级权限也会带来严重的安全隐患,所以现代系统通常会通过sudo、RBAC(基于角色的访问控制)和其他权限分离机制来限制和管理超级用户的使用。

使用su命令临时切换用户身份

Su的适用条件和威力
比如如果我们是以普通用户登录的,但是需要添加用户任务,但是这个时候权限有没有,只能切换到root来进行操作,当然退出重新登陆也是可以的,只不过没有这个必要,此时可以使用su

语法:su(选项)(参数)

Su的范例:

Su的优缺点

su (switch user) 命令在Linux系统中用于切换当前用户身份到另一个用户,通常用于临时获得或模拟其他用户的权限。以下是 su 命令的主要优缺点:

优点:

  1. 方便快捷:允许用户快速切换至具有不同权限的账户,以执行需要更高权限的任务。
  2. 权限管理:系统管理员可以通过 su 切换到 root 用户或其他用户进行必要的系统维护和管理操作。
  3. 安全审计:尽管不是最安全的方式(相比 sudo),但在某些情况下,它提供了记录登录历史的机会,因为通过 /var/log/secure 或类似日志文件可以追踪到用户使用 su 进行的身份切换行为。

缺点:

  1. 密码共享风险:当普通用户知道另一个用户的密码时,可以直接使用 su 切换为该用户,这可能导致权限滥用或安全漏洞。相比于 sudo 提供的更细粒度的权限控制,直接使用密码切换的风险较高。
  2. 非最小权限原则:直接使用 su 切换至 root 或其他用户后,将拥有完全的权限,可能会无意间误修改重要系统文件或配置,违背了“最小权限”这一安全管理原则。
  3. sudo 更佳实践:现代 Linux 系统推荐使用 sudo 进行权限提升,因为它可以实现基于命令的权限控制,并且支持不需要知道目标用户密码的场景,同时能更好地记录和审计特权操作。

总之,在实际环境中,建议优先采用 sudo 来代替 su,除非有特定需求必须直接切换用户身份,并确保对密码管理和用户行为有足够的监控与控制。

Sudo许可使用的su,也是受限制的su

Sudo的使用条件:
Sudo区别于su,就是su是临时切换,而是sudo切换是受限制的。

从编写sudo配置文件/etc/sudoers开始

Sudo的配置文件是/etc/sydoers,我们可以用他的专用编辑工具visodu,此工具的好处是在添加规则不太准确时,保存退出时会提示给我们错误信息;配置好后,可以用切换到你授权的用户下,通过sudo -l 来查看那些命令是可以执行或禁止的;
/etc/sudoers 文件中每行算一个规则,前面带有#号可以当作是说明的内容,并不执行;如果规则很长,一行列不下时,可以用\号来续行,这样看来一个规则也可以拥有多个行;
/etc/sudoers的规则可分为两类:一类是别名定义,另一类是授权规则;别名定义并不是必须的,但授权规则是必须的。

/etc/sudoers配置文件中别名规则

在Linux系统中,/etc/sudoers 配置文件用于定义哪些用户可以在何时何地以何种权限执行哪些命令。别名规则是sudoers配置文件中的一个重要特性,它允许管理员为用户、主机、命令或运行目标用户创建简短的别名,并在策略规则中引用这些别名。

以下是一些关于别名规则的示例:

  1. 用户别名(User_Alias):

    User_Alias ADMINS = user1, user2, user3
    
    # 这意味着ADMINS是一个包括user1、user2和user3用户的别名
    
  2. 主机别名(Host_Alias):

    Host_Alias SERVERS = server1, server2, server3
    
    # 这表明SERVERS是一个包含server1、server2和server3主机名的别名
    
  3. 命令别名(Cmnd_Alias):

    Cmnd_Alias NETWORK_COMMANDS = /sbin/ifconfig, /usr/bin/netstat
    
    # 表示NETWORK_COMMANDS是一个包含了ifconfig和netstat命令的别名
    
  4. 运行目标用户别名(Runas_Alias):

    Runas_Alias DB_USERS = dbuser1, dbuser2
    
    # 表示DB_USERS是一个包含dbuser1和dbuser2两个用户名的别名,它们可以作为sudo命令的目标用户身份
    

然后,在sudoers文件中使用这些别名制定具体的策略:

# 允许ADMINS组的用户在SERVERS主机上无需密码以root身份运行NETWORK_COMMANDS
ADMINS  SERVERS = (ALL) NOPASSWD: NETWORK_COMMANDS

# 或者允许某个用户以DB_USERS中的任意用户身份运行特定数据库管理命令
user4    localhost = (DB_USERS) /usr/bin/mysqladmin

这样,通过别名规则,管理员可以更简洁且易于维护的方式编写sudoers文件中的权限策略。

/etc/sudoers中的授权规则

在Linux系统中,/etc/sudoers 文件是用于配置sudo命令的权限和规则。授权规则定义了哪些用户可以在什么条件下执行哪些命令或以哪个用户身份执行命令。以下是 /etc/sudoers 中授权规则的基本结构:

[username|User_Alias] [host1,host2,...|Host_Alias] = (user|Runas_Alias) : Command_Alias / [command1, command2,...]
  • 用户名或用户别名(User_Alias):指定允许使用sudo命令的用户或一组用户。

    例如:

    alice ALL = ...
    User_Alias ADMIN_GROUP = bob, charlie
    
  • 主机别名(Host_Alias):指定此规则适用的主机列表。ALL 表示该规则对所有主机有效。

    例如:

    alice ALL = ...
    ADMIN_GROUP SERVERS = ...
    Host_Alias SERVERS = server1, server2
    
  • 运行目标用户或用户别名(Runas_Alias):指定sudo命令能够以哪个用户身份运行命令。默认通常是 root 用户,也可以设置为其他用户或用户别名。

    例如:

    alice ALL = (root) ...
    ADMIN_GROUP SERVERS = (DB_USER) ...
    Runas_Alias DB_USER = dbadmin
    
  • 命令别名(Cmnd_Alias)或直接列出命令:指定允许通过sudo执行的具体命令或者一组命令。

    例如:

    alice ALL = (root) /sbin/reboot, /usr/bin/pkill
    ADMIN_GROUP SERVERS = (DB_USER) /usr/bin/mysql_upgrade, /bin/chown
    Cmnd_Alias SYSTEM_COMMANDS = /sbin/*, /usr/bin/systemctl *
    
    # 或者直接应用到命令别名
    alice ALL = (root) SYSTEM_COMMANDS
    

一个完整的授权规则示例:

alice ALL = (root) /sbin/reboot, /usr/bin/ping
ADMIN_GROUP SERVERS = (DB_USER) /usr/bin/mysql_upgrade, !/usr/bin/mysql_dropdb

# 在这里:
# - alice 用户可以从任何主机上无须输入密码以 root 身份执行重启和ping命令。
# - ADMIN_GROUP 别名中的用户(假设是bob和charlie)仅能在名为SERVERS的主机列表中,以DB_USER别名定义的用户身份执行mysql_upgrade命令,但不能执行mysql_dropdb命令。

请注意,在编辑 /etc/sudoers 文件时应使用 visudo 命令而非直接编辑,因为 visudo 会检查文件语法,并确保不会创建无法解析的错误规则,从而避免导致sudo命令无法工作。

/etc/sudoers中的其他的未尽事项

/etc/sudoers 文件中除了上述提到的用户别名、主机别名、命令别名和运行目标用户别名之外,还有其他一些重要配置项和选项:

  1. NOPASSWD 选项:

    user_name ALL=(ALL) NOPASSWD: /bin/ls
    

    这条规则意味着 user_name 用户可以无需输入密码以任何身份执行 /bin/ls 命令。如果省略了 NOPASSWD 选项,该用户在使用sudo时将会被要求输入其自身的密码。

  2. Defaults 设置:
    在sudoers文件中,可以通过 Defaults 关键字设置全局默认行为。例如:

    Defaults        env_reset
    Defaults        log_output
    Defaults        secure_path="/sbin:/bin:/usr/sbin:/usr/bin"
    
    • env_reset:重置环境变量,防止传递用户自定义的环境变量。
    • log_output:记录sudo命令的输出到日志。
    • secure_path:指定sudo执行命令时使用的安全路径列表。
  3. 时间戳策略(Timestamps):

    Defaults    timestamp_timeout=10
    

    此设置允许用户在一定时间内(这里为10分钟)多次执行sudo命令而不需要重复输入密码。

  4. 权限限制:
    可以通过 ! 符号拒绝特定权限:

    user_name ALL = (ALL) ALL, !/usr/bin/reboot
    

    这表示用户 user_name 可以以任何用户身份执行任何命令,但禁止执行 /usr/bin/reboot 命令。

  5. 包含其他文件:
    使用 #includedir 指令来包含目录下的所有sudoers.d子目录中的文件:

    #includedir /etc/sudoers.d
    

    这样可以将不同的授权规则分散到多个文件中进行管理,保持主sudoers文件简洁。

  6. sudoedit 功能:
    配置用户使用sudoedit编辑系统文件,而不是直接用sudo打开文本编辑器:

    user_name ALL=(ALL) NOPASSWD: /bin/sudoedit /path/to/file
    

总之,《/etc/sudoers》文件是Linux系统中用于精细控制sudo权限的关键文件,它包含了众多可定制的安全特性,帮助管理员实现对特权操作的灵活和安全控制。在修改此文件时务必谨慎,并建议使用 visudo 工具以确保语法正确无误。

Sudo的用法

sudo
以其他身份来执行命令

补充说明
sudo命令 用来以其他身份来执行命令,预设的身份为root。在/etc/sudoers中设置了可执行sudo指令的用户。若其未经授权的用户企图使用sudo,则会发出警告的邮件给管理员。用户使用sudo时,必须先输入密码,之后有5分钟的有效期限,超过期限则必须重新输入密码。

语法
sudo(选项)(参数)
选项
-b:在后台执行指令;
-E:继承当前环境变量
-h:显示帮助;
-H:将HOME环境变量设为新身份的HOME环境变量;
-k:结束密码的有效期限,也就是下次再执行sudo时便需要输入密码;。
-l:列出目前用户可执行与无法执行的指令;
-p:改变询问密码的提示符号;
-s:执行指定的shell;
-u<用户>:以指定的用户作为新的身份。若不加上此参数,则预设以root作为新的身份;
-v:延长密码有效期限5分钟;
-V :显示版本信息。
参数
指令:需要运行的指令和对应的参数。

实例
$ sudo su -

env | grep -E '(HOME|SHELL|USER|LOGNAME|^PATH|PWD|TEST_ETC|TEST_ZSH|TEST_PRO|TEST_BASH|TEST_HOME|SUDO)'

这个命令相当于使用root超级用户重新登录一次shell,只不过密码是使用的当前用户的密码。而且重要是,该命令会 重新加载/etc/profile文件以及/etc/bashrc文件等系统配置文件,并且还会重新加载root用户的$SHELL环境变量所对应的配置文件 ,比如:root超级用户的$SHELL是/bin/bash,则会加载/root/.bashrc等配置。如果是/bin/zsh,则会加载/root/.zshrc等配置,执行后是完全的root环境。

$ sudo -i

env | grep -E '(HOME|SHELL|USER|LOGNAME|^PATH|PWD|TEST_ETC|TEST_ZSH|TEST_PRO|TEST_BASH|TEST_HOME|SUDO)'

这个命令基本与 sudo su - 相同,执行后也是root超级用户的环境,只不过是多了一些当前用户的信息。

$ sudo -s

env|grep -E '(HOME|SHELL|USER|LOGNAME|^PATH|PWD|TEST_ETC|TEST_ZSH|TEST_PRO|TEST_BASH|TEST_HOME|SUDO)' --color

这个命令相当于 以当前用户的$SHELL开启了一个root超级用户的no-login的shell,不会加载/etc/profile等系统配置 。所以/etc/profile文件中定义的TEST_ETC环境变量就看不到了,但是会加载root用户对应的配置文件,比如root用户的$SHELL是/bin/zsh,那么会加载/root/.zshrc配置文件,执行完后,不会切换当前用户的目录。

配置sudo必须通过编辑/etc/sudoers文件,而且只有超级用户才可以修改它,还必须使用visudo编辑。之所以使用visudo有两个原因,一是它能够防止两个用户同时修改它;二是它也能进行有限的语法检查。所以,即使只有你一个超级用户,你也最好用visudo来检查一下语法。

visudo默认的是在vi里打开配置文件,用vi来修改文件。我们可以在编译时修改这个默认项。visudo不会擅自保存带有语法错误的配置文件,它会提示你出现的问题,并询问该如何处理,就像:

sudoers file: syntax error, line 22 <<
此时我们有三种选择:键入“e”是重新编辑,键入“x”是不保存退出,键入“Q”是退出并保存。如果真选择Q,那么sudo将不会再运行,直到错误被纠正。

现在,我们一起来看一下神秘的配置文件,学一下如何编写它。让我们从一个简单的例子开始:让用户Foobar可以通过sudo执行所有root可执行的命令。以root身份用visudo打开配置文件,可以看到类似下面几行:

Runas alias specification

User privilege specificationroot ALL=(ALL)ALL

我们一看就明白个差不多了,root有所有权限,只要仿照现有root的例子就行,我们在下面加一行(最好用tab作为空白):

foobar ALL=(ALL) ALL
保存退出后,切换到foobar用户,我们用它的身份执行命令:

[foobar@localhost ~]$ ls /root
ls: /root: 权限不够

[foobar@localhost ~]$ sudo ls /root
PassWord:
anaconda-ks.cfg Desktop install.log install.log.syslog
好了,我们限制一下foobar的权利,不让他为所欲为。比如我们只想让他像root那样使用ls和ifconfig,把那一行改为:

foobar localhost= /sbin/ifconfig, /bin/ls
再来执行命令:

[foobar@localhost ~]$ sudo head -5 /etc/shadow
Password:
Sorry, user foobar is not allowed to execute '/usr/bin/head -5 /etc/shadow' as root on localhost.localdomain.

[foobar@localhost ~]$ sudo /sbin/ifconfigeth0 Linkencap:Ethernet HWaddr 00:14:85:EC:E9:9B...
现在让我们来看一下那三个ALL到底是什么意思。第一个ALL是指网络中的主机,我们后面把它改成了主机名,它指明foobar可以在此主机上执行后面的命令。第二个括号里的ALL是指目标用户,也就是以谁的身份去执行命令。最后一个ALL当然就是指命令名了。例如,我们想让foobar用户在linux主机上以jimmy或rene的身份执行kill命令,这样编写配置文件:

foobar linux=(jimmy,rene) /bin/kill
但这还有个问题,foobar到底以jimmy还是rene的身份执行?这时我们应该想到了sudo -u了,它正是用在这种时候。 foobar可以使用sudo -u jimmy kill PID或者sudo -u rene kill PID,但这样挺麻烦,其实我们可以不必每次加-u,把rene或jimmy设为默认的目标用户即可。再在上面加一行:

Defaults:foobar runas_default=rene
Defaults后面如果有冒号,是对后面用户的默认,如果没有,则是对所有用户的默认。就像配置文件中自带的一行:

Defaults env_reset
另一个问题是,很多时候,我们本来就登录了,每次使用sudo还要输入密码就显得烦琐了。我们可不可以不再输入密码呢?当然可以,我们这样修改配置文件:

foobar localhost=NOPASSWD: /bin/cat, /bin/ls
再来sudo一下:

[foobar@localhost ~]$ sudo ls /rootanaconda-ks.cfg Desktop install.log
install.log.syslog
当然,你也可以说“某些命令用户foobar不可以运行”,通过使用!操作符,但这不是一个好主意。因为,用!操作符来从ALL中“剔出”一些命令一般是没什么效果的,一个用户完全可以把那个命令拷贝到别的地方,换一个名字后再来运行。

日志与安全

sudo为安全考虑得很周到,不仅可以记录日志,还能在有必要时向系统管理员报告。但是,sudo的日志功能不是自动的,必须由管理员开启。这样来做:

touch /var/log/sudo
vi /etc/syslog.conf
在syslog.conf最后面加一行(必须用tab分割开)并保存:

local2.debug /var/log/sudo
重启日志守候进程,

ps aux grep syslogd
把得到的syslogd进程的PID(输出的第二列是PID)填入下面:

kill –HUP PID
这样,sudo就可以写日志了:

[foobar@localhost ~]$ sudo ls /rootanaconda-ks.cfg
Desktop install.log
install.log.syslog
$cat /var/log/sudoJul 28 22:52:54 localhost sudo: foobar :
TTY=pts/1 ; pwd=/home/foobar ; USER=root ; command=/bin/ls /root
不过,有一个小小的“缺陷”,sudo记录日志并不是很忠实:

[foobar@localhost ~]$ sudo cat /etc/shadow > /dev/null
cat /var/log/sudo...Jul 28 23:10:24 localhost sudo: foobar : TTY=pts/1 ;
PWD=/home/foobar ; USER=root ; COMMAND=/bin/cat /etc/shadow
重定向没有被记录在案!为什么?因为在命令运行之前,shell把重定向的工作做完了,sudo根本就没看到重定向。这也有个好处,下面的手段不会得逞:

[foobar@localhost ~]$ sudo ls /root > /etc/shadowbash: /etc/shadow: 权限不够
sudo 有自己的方式来保护安全。以root的身份执行sudo-V,查看一下sudo的设置。因为考虑到安全问题,一部分环境变量并没有传递给sudo后面的命令,或者被检查后再传递的,比如:PATH,HOME,SHELL等。当然,你也可以通过sudoers来配置这些环境变量。

权限命令
chmod
用来变更文件或目录的权限

概要
chmod [OPTION]... MODE[,MODE]... FILE...
chmod [OPTION]... OCTAL-MODE FILE...
chmod [OPTION]... --reference=RFILE FILE...
主要用途
通过符号组合的方式更改目标文件或目录的权限。
通过八进制数的方式更改目标文件或目录的权限。
通过参考文件的权限来更改目标文件或目录的权限。
参数
mode:八进制数或符号组合。

file:指定要更改权限的一到多个文件。

选项
-c, --changes:当文件的权限更改时输出操作信息。
--no-preserve-root:不将'/'特殊化处理,默认选项。
--preserve-root:不能在根目录下递归操作。
-f, --silent, --quiet:抑制多数错误消息的输出。
-v, --verbose:无论文件是否更改了权限,一律输出操作信息。
--reference=RFILE:使用参考文件或参考目录RFILE的权限来设置目标文件或目录的权限。
-R, --recursive:对目录以及目录下的文件递归执行更改权限操作。
--help:显示帮助信息并退出。
--version:显示版本信息并退出。
返回值
返回状态为成功除非给出了非法选项或非法参数。

例子
参考man chmod文档的DESCRIPTION段落得知:

u符号代表当前用户。
g符号代表和当前用户在同一个组的用户,以下简称组用户。
o符号代表其他用户。
a符号代表所有用户。
r符号代表读权限以及八进制数4。
w符号代表写权限以及八进制数2。
x符号代表执行权限以及八进制数1。
X符号代表如果目标文件是可执行文件或目录,可给其设置可执行权限。
s符号代表设置权限suid和sgid,使用权限组合u+s设定文件的用户的ID位,g+s设置组用户ID位。
t符号代表只有目录或文件的所有者才可以删除目录下的文件。
+符号代表添加目标用户相应的权限。
-符号代表删除目标用户相应的权限。
=符号代表添加目标用户相应的权限,删除未提到的权限。
linux文件的用户权限说明:

查看当前目录(包含隐藏文件)的长格式。

ls -la
-rw-r--r-- 1 user staff 651 Oct 12 12:53 .gitmodules

第1位如果是d则代表目录,是-则代表普通文件。

更多详情请参阅info coreutils 'ls invocation'(ls命令的info文档)的'-l'选项部分。

第2到4位代表当前用户的权限。

第5到7位代表组用户的权限。

第8到10位代表其他用户的权限。

添加组用户的写权限。

chmod g+w ./test.log

删除其他用户的所有权限。

chmod o= ./test.log

使得所有用户都没有写权限。

chmod a-w ./test.log

当前用户具有所有权限,组用户有读写权限,其他用户只有读权限。

chmod u=rwx, g=rw, o=r ./test.log

等价的八进制数表示:

chmod 754 ./test.log

将目录以及目录下的文件都设置为所有用户拥有读写权限。

注意,使用'-R'选项一定要保留当前用户的执行和读取权限,否则会报错!

chmod -R a=rw ./testdir/

根据其他文件的权限设置文件权限。

chmod --reference=./1.log ./test.log
注意
该命令是GNU coreutils包中的命令,相关的帮助信息请查看man chmod或info coreutils 'chmod invocation'。

符号连接的权限无法变更,如果用户对符号连接修改权限,其改变会作用在被连接的原始文件。

使用-R选项一定要保留当前用户的执行和读取权限,否则会报错!

umask
显示或设置创建文件的权限掩码

概要
umask [-p] [-S] [mode]
主要用途
显示当前的文件权限掩码。
通过八进制数的方式设置创建文件的权限掩码。
通过符号组合的方式设置创建文件的权限掩码。
参数
mode(可选):八进制数或符号组合。

选项
-p:当没有参数时指定该选项,执行产生的输出格式可复用为输入;
-S:以符号组合的方式输出创建文件的权限掩码,不使用该选项时以八进制数的形式输出。
返回值
返回状态为成功除非给出了非法选项或非法参数。

例子
以下的例子均假设文件权限掩码为0022。

以八进制数的形式输出创建文件的权限掩码。

umask -p

执行结果:

umask 0022

以符号组合的方式输出创建文件的权限掩码。

umask -S

执行结果:

u=rwx,g=rx,o=rx
参考man chmod文档的DESCRIPTION段落得知:

u符号代表当前用户。
g符号代表和当前用户在同一个组的用户,以下简称组用户。
o符号代表其他用户。
a符号代表所有用户。
r符号代表读权限以及八进制数4。
w符号代表写权限以及八进制数2。
x符号代表执行权限以及八进制数1。
+符号代表添加目标用户相应的权限。
-符号代表删除目标用户相应的权限。
=符号代表添加目标用户相应的权限,删除未提到的权限。
那么刚才以符号形式输出的结果u=rwx,g=rx,o=rx转化为八进制数等于0755;

用八进制数来设置同样的权限,umask需要额外的执行减法0777 - 0755即0022,而chmod不需要。

符号组合模式的添加、删除、赋值权限。

添加权限:

为组用户添加写权限。

umask g+w

删除权限:

删除其他用户的写、执行权限

umask o-wx

赋值权限:

赋值全部用户所有权限,等价于umask u=rwx,g=rwx,o=rwx

umask a=rwx

清除其他用户的读、写、执行权限。

umask o=
创建文件夹、文件(假设当前目录不存在)

创建文件

touch test.sh

查看权限,发现执行权限的设置不起作用。

stat test.sh

创建文件夹

touch newdir

查看权限,发现执行权限的设置可以起作用。

stat newdir
注意
该命令是bash内建命令,相关的帮助信息请查看help命令。

chmod用于更改已有对象的权限,umask影响之后新建对象的权限。

请谨慎使用该命令,特别是不要取消当前用户的读取权限,那样会导致你在终端使用TAB键补全时报错。

chown
用来变更文件或目录的拥有者或所属群组

补充说明
chown命令 改变某个文件或目录的所有者和所属的组,该命令可以向某个用户授权,使该用户变成指定文件的所有者或者改变文件所属的组。用户可以是用户或者是用户D,用户组可以是组名或组id。文件名可以使由空格分开的文件列表,在文件名中可以包含通配符。

只有文件主和超级用户才可以便用该命令。

语法
chown(选项)(参数)
选项
-c或——changes:效果类似“-v”参数,但仅回报更改的部分;
-f或--quite或——silent:不显示错误信息;
-h或--no-dereference:只对符号连接的文件作修改,而不更改其他任何相关文件;
-R或——recursive:递归处理,将指定目录下的所有文件及子目录一并处理;
-v或——version:显示指令执行过程;
--dereference:效果和“-h”参数相同;
--help:在线帮助;
--reference=<参考文件或目录>:把指定文件或目录的拥有者与所属群组全部设成和参考文件或目录的拥有者与所属群组相同;
--version:显示版本信息。
参数
用户:组:指定所有者和所属工作组。当省略“:组”,仅改变文件所有者;
文件:指定要改变所有者和工作组的文件列表。支持多个文件和目标,支持shell通配符。

实例
将目录/usr/meng及其下面的所有文件、子目录的文件主改成 liu:

chown -R liu /usr/meng

chgrp
用来变更文件或目录的所属群组

补充说明
chgrp命令 用来改变文件或目录所属的用户组。该命令用来改变指定文件所属的用户组。其中,组名可以是用户组的id,也可以是用户组的组名。文件名可以 是由空格分开的要改变属组的文件列表,也可以是由通配符描述的文件集合。如果用户不是该文件的文件主或超级用户(root),则不能改变该文件的组。

在UNIX系统家族里,文件或目录权限的掌控以拥有者及所属群组来管理。您可以使用chgrp指令去变更文件与目录的所属群组,设置方式采用群组名称或群组识别码皆可。

语法
chgrp [选项][组群][文件|目录]
选项
-R 递归式地改变指定目录及其下的所有子目录和文件的所属的组
-c或——changes:效果类似“-v”参数,但仅回报更改的部分;
-f或--quiet或——silent:不显示错误信息;
-h或--no-dereference:只对符号连接的文件作修改,而不是该其他任何相关文件;
-H如果命令行参数是一个通到目录的符号链接,则遍历符号链接
-R或——recursive:递归处理,将指令目录下的所有文件及子目录一并处理;
-L遍历每一个遇到的通到目录的符号链接
-P不遍历任何符号链接(默认)
-v或——verbose:显示指令执行过程;
--reference=<参考文件或目录>:把指定文件或目录的所属群组全部设成和参考文件或目录的所属群组相同;
参数
组:指定新工作名称;
文件:指定要改变所属组的文件列表。多个文件或者目录之间使用空格隔开。
实例
将/usr/meng及其子目录下的所有文件的用户组改为mengxin

chgrp -R mengxin /usr/meng
更改文件ah的组群所有者为 newuser

[root@rhel ~]# chgrp newuser ah

标签:文件,root,sudo,用户,---,linux,权限,第四节,目录
From: https://www.cnblogs.com/nwq1101/p/18022442

相关文章

  • 2024年,提升Windows开发和使用体验的实践经验 - RIME输入法
    前言上一篇文章介绍了Windows下的包管理器,本文继续介绍输入法。事实上Windows的输入法生态比Linux/Mac丰富很多,不过很多国产输入法存在窃取隐私、植入广告、乱安装流氓软件等问题,现在有开源的RIME输入法可以选择,何必受这气呢......
  • Programming Abstractions in C阅读笔记:p283-p292
    《ProgrammingAbstractionsinC》学习第72天,p283-p292总结,总计10页。一、技术总结1、anylasisofalgorithms算法分析——即判断程序的效率(efficiency)。2、mathematicalinduction(数学归纳法)3、Big-Onotation(大O标记法)4、constanttime(常量时间)5、lineartime(......
  • CF-928(已更新:B C E)
    CF-928排名四千多,目前为止排名最高的一场~E题我赛时基本上是猜的结论(但是也推了快一小时才想到有这个可能性),因此目前只能放个码在这(⊙﹏⊙)D的话问了学长思路,正在补了0-^-0……但是上一场牛客打得特别烂(⊙﹏⊙),还是等我补了牛客的再更新吧-^-B分析观察它的性质,答案为正方......
  • ARC172 - sol
    AtCoderRegularContest172A-ChocolateMs.AtCoderhasdecidedtodistributechocolatesto\(N\)friendsonValentine'sDay.Forthe\(i\)-thfriend\((1\leqi\leqN)\),shewantstogiveasquarechocolatebarofsize\(2^{A_i}\time......
  • Linux下nohup和&的关系
    nohup和&的关系使用nohup运行程序:输出重定向,默认重定向到当前目录下nohup.out文件使用Ctrl+C(发送SIGINT信号),程序关闭关闭ShellSession(发送SIGHUP信号),程序免疫不关闭使用&运行程序:程序转入后台运行结果会输出到终端使用Ctrl+C(发送SIGINT信号),程序免......
  • 2024年,提升Windows开发和使用体验的一些实践 - 包管理器篇
    前言短暂的春节假期转瞬即逝,忙碌的一年又要开启了......
  • .NET周刊【2月第2期 2024-02-11】
    国内文章C#/.NET该如何自学入门?https://www.cnblogs.com/Can-daydayup/p/18006914随着DotNetGuide技术社区交流群的扩大,很多新成员希望知道如何自学C#/.NET。本文提出了自学建议:首先要了解语言特点与发展,然后制定详细学习计划,以微软官方文档为学习起点,并结合动手实践与其他资源......
  • 测试面试题4-HTTP请求头中Content-Type的作用是什么?
    在HTTP请求头中,Content-Type是用来指示请求或响应中实体主体的媒体类型的字段。它告诉服务器或客户端实体主体的数据类型是什么,以便正确解析数据。以下是一些常见的Content-Type类型:text/plain:纯文本格式text/html:HTML格式application/json:JSON格式application/xml:XML......
  • IDEA、Pycharm等所有JetBrains产品同时报错:Internal error. Please refer to https://
    IDEA、Pycharm等所有JetBrains产品同时报错:Internalerror.Pleaserefertohttps://jb.gg/ide/critical-startup-errors错误Internalerror.Pleaserefertohttps://jb.gg/ide/critical-startup-errorscom.intellij.ide.plugins.StartupAbortedException:Cannotstartap......
  • Flask 学习99-Flask-SocketIO 开发websocket接口
    前言flask-socketio为flask应用提供了一个客户端与服务器之间低延迟的双向通讯官网地址:https://flask-socketio.readthedocs.io/en/latest/intro.html环境准备先安装flask-socketiopipinstallflask-socketio说明Flask-SocketIO与js版本客户端不匹配,二者不能正常通信。......