一、su 的适用条件和威力安全
su命令就是切换用户的工具,怎么理解呢?好比咱们以普通用户beinan登陆的,但要添加用户任务,执行useradd ,beinan用户没有这个权限,而这个权限偏偏由root所拥有。解决办法没法有两个,一是退出beinan用户,从新以root用户登陆,但这种办法并非最好的;二是咱们没有必要退出beinan用户,能够用su来切换到root下进行添加用户的工做,等任务完成后再退出root。咱们能够看到固然经过su 切换是一种比较好的办法;服务器
经过su能够在用户之间切换,若是超级权限用户root向普通或虚拟用户切换不须要密码,什么是权力?这就是!而普通用户切换到其它任何用户都须要密码验证;工具
二、su的优缺点;翻译
su 的确为管理带来方便,经过切换到root下,能完成全部系统管理工具,只要把root的密码交给任何一个普通用户,他都能切换到root来完成全部的系统管理工做;但经过su切换到root后,也有不安全因素;好比系统有10个用户,并且都参与管理。若是这10个用户都涉及到超级权限的运用,作为管理员若是想让其它用户经过su来切换到超级权限的root,必须把root权限密码都告诉这10个用户;若是这10个用户都有root权限,经过root权限能够作任何事,这在必定程度上就对系统的安全形成了威协;想一想Windows吧,简直就是恶梦;“没有不安全的系统,只有不安全的人”,咱们绝对不能保证这 10个用户都能按正常操做流程来管理系统,其中任何一人对系统操做的重大失误,均可能致使系统崩溃或数据损失;因此su 工具在多人参与的系统管理中,并非最好的选择,su只适用于一两我的参与管理的系统,毕竟su并不能让普通用户受限的使用;超级用户root密码应该掌握在少数用户手中,这绝对是真理!因此集权而治的存在仍是有必定道理的blog
因为su 对切换到超级权限用户root后,权限的无限制性,因此su并不能担任多个管理员所管理的系统。若是用su 来切换到超级用户来管理系统,也不能明确哪些工做是由哪一个管理员进行的操做。特别是对于服务器的管理有多人参与管理时,最好是针对每一个管理员的技术特长和管理范围,而且有针对性的下放给权限,而且约定其使用哪些工具来完成与其相关的工做,这时咱们就有必要用到 sudo。token
经过sudo,咱们能把某些超级权限有针对性的下放,而且不须要普通用户知道root密码,因此sudo 相对于权限无限制性的su来讲,仍是比较安全的,因此sudo 也能被称为受限制的su ;另外sudo 是须要受权许可的,因此也被称为受权许可的su;ip
sudo 执行命令的流程是当前用户切换到root(或其它指定切换到的用户),而后以root(或其它指定的切换到的用户)身份执行命令,执行完成后,直接退回到当前用户;而这些的前提是要经过sudo的配置文件/etc/sudoers来进行受权;get
sudo的配置文件是/etc/sudoers ,咱们能够用他的专用编辑工具visodu ,此工具的好处是在添加规则不太准确时,保存退出时会提示给咱们错误信息;配置好后,能够用切换到您受权的用户下,经过sudo -l 来查看哪些命令是能够执行或禁止的;it
/etc/sudoers 文件中每行算一个规则,前面带有#号能够看成是说明的内容,并不执行;若是规则很长,一行列不下时,能够用\号来续行,这样看来一个规则也能够拥有多个行;登录
/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中必须存在;对于定义命令别名,成员也必须在系统中事实存在的文件名(须要绝对路径);
item成员受别名类型 Host_Alias、User_Alias、Runas_Alias、Cmnd_Alias 制约,定义什么类型的别名,就要有什么类型的成员相配。咱们用Host_Alias定义主机别名时,成员必须是与主机相关相关联,好比是主机名(包括远程登陆的主机名)、ip地址(单个或整段)、掩码等;当用户登陆时,能够经过w命令来查看登陆用户主机信息;用User_Alias和 Runas_Alias定义时,必需要用系统用户作为成员;用Cmnd_Alias 定义执行命令的别名时,必须是系统存在的文件,文件名能够用通配符表示,配置Cmnd_Alias时命令须要绝对路径;其中 Runas_Alias 和User_Alias 有点类似,但与User_Alias 绝对不是同一个概念,Runas_Alias 定义的是某个系统用户能够sudo 切换身份到Runas_Alias 下的成员;咱们在受权规则中以实例进行解说;别名规则是每行算一个规则,若是一个别名规则一行容不下时,能够经过\来续行;同一类型别名的定义,一次也能够定义几个别名,他们中间用:号分隔,
受权规则是分配权限的执行规则,咱们前面所讲到的定义别名主要是为了更方便的受权引用别名;若是系统中只有几个用户,其实下放权限比较有限的话,能够不用定义别名,而是针对系统用户直接直接受权,因此在受权规则中别名并非必须的;
受权规则并非无章可寻,咱们只说基础一点的,比较简单的写法,若是您想详细了解受权规则写法的,请参看man sudoers
受权用户 主机=命令动做
这三个要素缺一不可,但在动做以前也能够指定切换到特定用户下,在这里指定切换的用户要用( )号括起来,若是不须要密码直接运行命令的,应该加NOPASSWD:参数,但这些能够省略;举例说明。做者:jz