天天看点

Linux权限相关:su,sudo,sudoers

关于Linux权限

在使用Linux系统过程中,通常情况下,我们都会使用普通用户进行日常操作,而root用户只有在权限分配及系统设置时才会使用,而root用户的密码也不可能公开。普通用户执行到系统程序时,需要临时提升权限,sudo就是我们常用的命令,仅需要输入当前用户密码,便可以完成权限的临时提升。在使用sudo命令的过程中,我们经常会遇到当前用户不在sudoers文件中的提示信息,如果解决该问题呢?通过下面几个步骤,可以很简单的解决此问题。

  • 切换到root用户权限:
    su root
               
Linux权限相关:su,sudo,sudoers
  • 查看/etc/sudoers文件权限,如果只读权限,修改为可写权限
    ls -l /etc/sudoers
         chmod 777 /etc/sudoers
               
Linux权限相关:su,sudo,sudoers
Linux权限相关:su,sudo,sudoers
  • 执行vi命令,编辑/etc/sudoers文件

    添加要提升权限的用户;在文件中找到root ALL=(ALL) ALL,在该行下添加提升权限的用户信息,如:

    root ALL=(ALL) ALL

    user ALL=(ALL) ALL

    说明:格式为(用户名 网络中的主机=(执行命令::的目标用户) 执行的命令范围)

  • 保存退出,并恢复/etc/sudoers的访问权限为440
    chmod 440 /etc/sudoers
           ls -l /etc/sudoers
               

然后来解释一下这几项的含义:

sudo : 获得权限,以其它身份来执行指令 如: sudo add user (用户名)

su和sudo的区别与使用

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

1、 su 的适用条件和威力

su命令就是切换用户 的工具,怎么理解呢?比如我们以普通用户beinan登录的,但要添加用户任务,执行useradd ,beinan用户没有这个权限,而这个权限恰恰由root所拥有。

解决办法无法有两个,

一是退出beinan用户,重新以root用户登录,但这种办法 并不是最好的;

二是我们没有必要退出beinan用户,可以用su来切换到root下进行添加用户的工作,等任务完成后再退出root。我们可以看到当然 通过su 切换是一种比较好的办法;

通过su可以在用户之 间切换,如果超级权限用户root向普通或虚拟用户切换不需要密码,什么是权力?这就是!而普通用户切换到其它任何用户都需要密码验证;

2、 su 的用法:

su [OPTION选项参数] [用户]
    -, -l, --login 登录并改变到所切换的用户环境;
    -c, --commmand=COMMAND 执行一个命令,然后退出所切换到的用户环境;
           

至于更详细的,请参看 man su ;

3、 su 的范例:

su 在不加任何参数,默认为切换到root用户,但没有转到root用户家目录下,也就是说这时虽然是切换为root用户了,但并没有改变root登录环境; 用户默认的登录环境,可以在/etc/passwd 中查得到,包括家目录,SHELL定义等;

su 加参数 - ,表示默认切换到root用户,并且改变到root用户的环境;

su 参数 - 用户名

$ su - root            注:这个和su - 是一样的功能;
                       Password:
                      [[email protected] ~]# pwd
                     /root
                    [***@localhost ~] $ su - linuxsir 注:这是切换到 linuxsir用户
           

Password: 注:在这里输入密码;

pwd 注:查看用户当前所处的位置;

Linux权限相关:su,sudo,sudoers

  id 注:查看用户的UID和GID信息,主要是看是否切换过来了;

Linux权限相关:su,sudo,sudoers

4、 su的优缺点;

su 的确为管理带来方便,通过切换到root下,能完成所有系统管理工具,只要把root的密码交给任何一个普通用户,他都能切换到root来完成所有的系统 管理工作;但通过su切换到root后,也有不安全因素;比如系统有10个用户,而且都参与管理。如果这10个用户都涉及到超级权限的运用,做为管理员如 果想让其它用户通过su来切换到超级权限的root,必须把root权限密码都告诉这10个用户;如果这10个用户都有root权限,通过root权限可 以做任何事,这在一定程度上就对系统的安全造成了威协;想想Windows吧,简直就是恶梦;“没有不安全的系统,只有不安全的人”,我们绝对不能保证这 10个用户都能按正常操作流程来管理系统,其中任何一人对系统操作的重大失误,都可能导致系统崩溃或数据损失;所以su 工具在多人参与的系统管理中,并不是最好的选择,su只适用于一两个人参与管理的系统,毕竟su并不能让普通用户受限的使用;超级用户root密码应该掌 握在少数用户手中,这绝对是真理!所以集权而治的存在还是有一定道理的;

二. sudo 授权许可使用的su,也是受限制的su

  1. sudo 的适用条件

    由于su 对切换到超级权限用户root后,权限的无限制性,所以su并不能担任多个管理员所管理的系统。如果用su 来切换到超级用户来管理系统,也不能明确哪些工作是由哪个管理员进行的操作。特别是对于服务器的管理有多人参与管理时,最好是针对每个管理员的技术特长和 管理范围,并且有针对性的下放给权限,并且约定其使用哪些工具来完成与其相关的工作,这时我们就有必要用到 sudo。

    通过sudo,我们能 把某些超级权限有针对性的下放,并且不需要普通用户知道root密码,所以sudo 相对于权限无限制性的su来说,还是比较安全的,所以sudo 也能被称为受限制的su ;另外sudo 是需要授权许可的,所以也被称为授权许可su;

sudo 执行命令的流程是当前用户切换到root(或其它指定切换到的用户),然后以root(或其它指定的切换到的用户)身份执行命令,执行完成后,直接退回到 当前用户;而这些的前提是要通过sudo的配置文件/etc/sudoers来进行授权;

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

sudo的配置文件是 /etc/sudoers ,我们可以用他的专用编辑工具visodu ,此工具的好处是在添加规则不太准确时,保存退出时会提示给我们错误信息;配置好后,可以用切换到您授权的用户下,通过sudo -l 来查看哪些命令是可以执行或禁止的;

/etc/sudoers 文件中每行算一个规则,前面带有#号可以当作是说明的内容,并不执行;如果规则很长,一行列不下时,可以用\号来续行,这样看来一个规则也可以拥有多个 行;

/etc/sudoers 的规则可分为两类;一类是别名定义,另一类是授权规则;别名定义并不是必须的,但授权规则是必须的;

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

别名规则定义格式如 下:

Alias_Type NAME = item1, item2, …

Alias_Type NAME = item1, item2, item3 : NAME = item4, item5

别名类型 (Alias_Type):别名类型包括如下四种

Host_Alias 定义主机别名;

User_Alias 用户别名,别名成员可以是用户,用户组(前面要加%号)

Runas_Alias 用来定义runas别名,这个别名指定的是“目的用户”,即sudo 允许切换至的用户;

Cmnd_Alias 定义命令别名;

NAME 就是别名了,NMAE的命名是包含大写字母、下划线以及数字,但必须以一个大写字母开头,比如SYNADM、SYN_ADM或SYNAD0是合法 的,sYNAMDA或1SYNAD是不合法的;

item 按中文翻译是项目,在这里我们可以译成成员,如果一个别名下有多个成员,成员与成员之间,通过半角,号分隔;成员在必须是有效并事实存在的。什么是有效的 呢?比如主机名,可以通过w查看用户的主机名(或ip地址),如果您只是本地机操作,只通过hostname 命令就能查看;用户名当然是在系统中存在的,在/etc/paswd中必须存在;对于定义命令别名,成员也必须在系统中事实存在的文件名(需要绝对路 径);

注:我们通过 Host_Alias 定义主机别名时,项目可以是主机名、可以是单个ip(整段ip地址也可以),也可以是网络掩码;如果是主机名,必须是多台机器的网络中,而且这些机器得能 通过主机名相互通信访问才有效。

User_Alias SYSAD=beinan,linuxsir,bnnnb,lanhaitun 注:定义用户别名,下有四个成员;要在系统中确实在存在的;
            User_Alias NETAD=beinan,bnnb 注:定义用户别名NETAD ,我想让这个别名下的用户来管理网络,所以取了NETAD的别名;
          User_Alias WEBMASTER=linuxsir 注:定义用户别名WEBMASTER,我想用这个别名下的用户来管理网站;
             User_Alias SYSAD=beinan,linuxsir,bnnnb,lanhaitun:NETAD=beinan,bnnb:WEBMASTER=linuxsir 注:上面三行的别名定义,可以通过这一行来实现,请看前面的说明,是不是符合?
          Cmnd_Alias USERMAG=/usr/sbin/adduser,/usr/sbin/userdel,/usr/bin/passwd [A-Za-z]*,/bin/chown,/bin/chmod
         注意:命令别名下的成 员必须是文件或目录的绝对路径;
       Cmnd_Alias DISKMAG=/sbin/fdisk,/sbin/parted
        Cmnd_Alias NETMAG=/sbin/ifconfig,/etc/init.d/network
       Cmnd_Alias KILL = /usr/bin/kill
     Cmnd_Alias PWMAG = /usr/sbin/reboot,/usr/sbin/halt
      Cmnd_Alias SHELLS = /usr/bin/sh, /usr/bin/csh, /usr/bin/ksh, \
                            /usr/local/bin/tcsh, /usr/bin/rsh, \
                            /usr/local/bin/zsh
           

注:这行定义命令别名 有点长,可以通过 \ 号断行;

Cmnd_Alias SU = /usr/bin/su,/bin,/sbin,/usr/sbin,/usr/bin

在上面的例子中,有 KILL和PWMAG的命令别名定义,我们可以合并为一行来写,也就是等价行;

Cmnd_Alias KILL = /usr/bin/kill:PWMAG = /usr/sbin/reboot,/usr/sbin/halt 注:这一行就代表了KILL和PWMAG命令别名,把KILL和PWMAG的别名定义合并在一行写也是可以的;

Runas_Alias OP = root, operator

Runas_Alias DBADM=mysql:OP = root, operator 注:这行是上面两行的等价行;至于怎么理解Runas_Alias ,我们必须得通过授权规则的实例来理解;

4、 /etc/sudoers中的授权规则

授权规则是分配权限的 执行规则,我们前面所讲到的定义别名主要是为了更方便的授权引用别名;如果系统中只有几个用户,其实下放权限比较有限的话,可以不用定义别名,而是针对系 统用户直接直接授权,所以在授权规则中别名并不是必须的;

授权规则并不是无章可 寻,我们只说基础一点的,比较简单的写法,如果您想详细了解授权规则写法的,请参看man sudoers

授权用户 主机=命令动作

这三个要素缺一不可, 但在动作之前也可以指定切换到特定用户下,在这里指定切换的用户要用( )号括起来,如果不需要密码直接运行命令的,应该加NOPASSWD:参数,但这些可以省略;举例说明;

实例 一:

beinan ALL=/bin/chown,/bin/chmod

如果我们在/etc /sudoers 中添加这一行,表示beinan 可以在任何可能出现的主机名的系统中,可以切换到root用户下执行 /bin/chown 和/bin/chmod 命令,通过sudo -l 来查看beinan 在这台主机上允许和禁止运行的命令;

值得注意的是,在这里 省略了指定切换到哪个用户下执行/bin/shown 和/bin/chmod命令;在省略的情况下默认为是切换到root用户下执行;同时也省略了是不是需要beinan用户输入验证密码,如果省略了,默认 为是需要验证密码。

为了更详细的说明这 些,我们可以构造一个更复杂一点的公式;

授权用户 主机=[(切换到哪些用户或用户组)] [是否需要密码验证] 命令1,[(切换到哪些用户或用户组)] [是否需要密码验证] [命令2],[(切换到哪些用户或用户组)] [是否需要密码验证] [命令3]…

注 解:

凡是[ ]中的内容,是可以省略;命令与命令之间用,号分隔;通过本文的例子,可以对照着看哪些是省略了,哪些地方需要有空格;

在[(切换到哪些用户 或用户组)] ,如果省略,则默认为root用户;如果是ALL ,则代表能切换到所有用户;注意要切换到的目的用户必须用()号括起来,比如(ALL)、(beinan)

继续阅读