常用指令
groups :显示用户所在组
newgrp users :切换有效群组
新增与移除使用者
useradd [-u UID] [-g 初始群组] [-G 次要群组] [-mM]\ :创建一个新的用户或更新默认新用户信息
-u :后面接的是 UID ,是一组数字。直接指定一个特定的 UID 给这个账号;
-g :后面接的那个组名就是我们上面提到的 initial group ~该群组的 GID 会被放置到 /etc/passwd 的第四个字段内。
-G :后面接的组名则是这个账号还可以加入的群组。这个选项与参数会修改 /etc/group 内的相关资料喔!
-M :强制!不要建立用户家目录!(系统账号默认值)
-m :强制!要建立用户家目录!(一般账号默认值)
-c :这个就是 /etc/passwd 的第五栏的说明内容~可以随便我们设定的
-d :指定某个目录成为家目录,而不要使用默认值。务必使用绝对路径!
-r :建立一个系统的账号,这个账号的 UID 会有限制 (参考 /etc/login.defs)
-s :后面接一个 shell ,若没有指定则预设是 /bin/bash 的啦~
-e :后面接一个日期,格式为『YYYY-MM-DD』此项目可写入 shadow 第八字段,亦即账号失效日的设定项目啰;
-f :后面接 shadow 的第七字段项目,指定密码是否会失效。0 为立刻失效, -1 为永远不失效(密码只会过期而强制于登入时重新设定而已。)
passwd [--stdin] [账号名称] <== 所有人均可使用来改自己的密码
passwd [-l] [-u] [--stdin] [-S] [-n 日数] [-x 日数] [-w 日数] [-i 日期] 账号 <== root 功能
--stdin :可以透过来自前一个管线的数据,作为密码输入,对 shell script 有帮助!
-l :是 Lock 的意思,会将 /etc/shadow 第二栏最前面加上 ! 使密码失效;
-u :与 -l 相对,是 Unlock 的意思!
-S :列出密码相关参数,亦即 shadow 文件内的大部分信息。
-n :后面接天数,shadow 的第 4 字段,多久不可修改密码天数
-x :后面接天数,shadow 的第 5 字段,多久内必须要更动密码
-w :后面接天数,shadow 的第 6 字段,密码过期前的警告天数
-i :后面接『日期』,shadow 的第 7 字段,密码失效日期
chage [-ldEImMW] 账号名 :
-l :列出该账号的详细密码参数;
-d :后面接日期,修改 shadow 第三字段(最近一次更改密码的日期),格式 YYYY-MM-DD
-m :后面接天数,修改 shadow 第四字段(密码最短保留天数)
-M :后面接天数,修改 shadow 第五字段(密码多久需要进行变更)
-W :后面接天数,修改 shadow 第六字段(密码过期前警告日期)
-I :后面接天数,修改 shadow 第七字段(密码失效日期)
-E :后面接日期,修改 shadow 第八字段(账号失效日),格式 YYYY-MM-DD
usermod [-cdegGlsuLU] username :
-c :后面接账号的说明,即 /etc/passwd 第五栏的说明栏,可以加入一些账号的说明。
-d :后面接账号的家目录,即修改 /etc/passwd 的第六栏;
-e :后面接日期,格式是 YYYY-MM-DD 也就是在 /etc/shadow 内的第八个字段数据啦!
-f :后面接天数,为 shadow 的第七字段。
-g :后面接初始群组,修改 /etc/passwd 的第四个字段,亦即是 GID 的字段!
-G :后面接次要群组,修改这个使用者能够支持的群组,修改的是 /etc/group
-a :与 -G 合用,可『增加次要群组的支持』而非『设定』!
-l :后面接账号名称。亦即是修改账号名称, /etc/passwd 的第一栏!
-s :后面接 Shell 的实际文件,例如 /bin/bash 或 /bin/csh 等等。
-u :后面接 UID 数字啦!即 /etc/passwd 第三栏的资料;
-L :暂时将用户的密码冻结,让他无法登入。其实仅改 /etc/shadow 的密码栏。
-U :将 /etc/shadow 密码栏的 ! 拿掉,解冻啦!
userdel [-r] username :删除用户
-r :连同用户的家目录也一起删除
id [username] : 用户的相关 ID 信息!
chfn [-foph] [账号名] :更改一下用户的相关信息(其实就是改到『/etc/passwd』第五个字段,该字段里面用多个『 , 』分隔就是了)
-f :后面接完整的大名;
-o :您办公室的房间号码;
-p :办公室的电话号码;
-h :家里的电话号码!
chsh [-ls] :改变登录的shell
-l :列出目前系统上面可用的 shell ,其实就是 /etc/shells 的内容
-s :设定修改自己的 Shell
新增与移除群组
groupadd [-g gid] [-r] 组名 :创建一个新的群组
-g :后面接某个特定的 GID ,用来直接给予某个 GID ~
-r :建立系统群组啦!与 /etc/login.defs 内的 GID_MIN 有关。
groupmod [-g gid] [-n group_name] 群组名 :进行 group 相关参数的修改
-g :修改既有的 GID 数字;
-n :修改既有的组名
groupdel [groupname] :删除群组
gpasswd:群组管理员功能
1、关于系统管理员(root)做的动作:
gpasswd groupname
gpasswd [-A user1,...] [-M user3,...] groupname
gpasswd [-rR] groupname
:若没有任何参数时,表示给予 groupname 一个密码(/etc/gshadow)
-A :将 groupname 的主控权交由后面的使用者管理(该群组的管理员)
-M :将某些账号加入这个群组当中!
-r :将 groupname 的密码移除
-R :让 groupname 的密码栏失效
2、关于群组管理员(Group administrator)做的动作:
gpasswd [-ad] user groupname
-a :将某位使用者加入到 groupname 这个群组当中!
-d :将某位使用者移除出 groupname 这个群组当中
ACL 的使用
setfacl [-bkRd] [{-m|-x} acl 参数] 目标文件名 :设定某个目录/文件的 ACL 规范
-m :设定后续的 acl 参数给文件使用,不可与 -x 合用;
-x :删除后续的 acl 参数,不可与 -m 合用;
-b :移除『所有的』 ACL 设定参数;
-k :移除『预设的』 ACL 参数,关于所谓的『预设』参数于后续范例中介绍;
-R :递归设定 acl ,亦即包括次目录都会被设定起来;
-d :设定『预设 acl 参数』的意思!只对目录有效,在该目录新建的数据会引用此默认值
当设定一个用户/群组没有任何权限的 ACL 语法中,在权限的字段不可留白,而是应该加上一个减号 (-) 才是正确的作法!
getfacl filename :取得某个文件/目录的 ACL 设定项目
getfacl 的选项几乎与 setfacl 相同!这里就免去了选项的说明!
使用者身份切换指令
su [-lm] [-c 指令] [username] :最简单的身份切换指令
- :单纯使用 - 如『 su - 』代表使用 login-shell 的变量文件读取方式来登入系统;若使用者名称没有加上去,则代表切换为 root 的身份。
-l :与 - 类似,但后面需要加欲切换的使用者账号!也是 login-shell 的方式。
-m :-m 与 -p 是一样的,表示『使用目前的环境设定,而不读取新使用者的配置文件』
-c :仅进行一次指令,所以 -c 后面可以加上指令!
sudo [-b] [-u 新使用者账号]
-b :将后续的指令放到背景中让系统自行执行,而不与目前的 shell 产生影响
-u :后面可以接欲切换的使用者,若无此项则代表切换身份为 root
主机上的用户讯息传递
w, who, last, lastlog :查询使用者
write, mesg [-yv], wall : write:使用者对谈,mesg:是否接受讯息,wall:广播,连发送者自己也会收到)
mail -s "邮件标题" username@localhost :使用者邮件信箱(一般来说,如果是寄给本机上的使用者,基本上,连『 @localhost 』都不用写)
账号相关的检查工具
pwck :检查/etc/passwd文件的完整性
pwconv :将 /etc/passwd 内的账号与密码,移动到 /etc/shadow 当中
1、比对 /etc/passwd 及 /etc/shadow ,若 /etc/passwd 内存在的账号并没有对应的 /etc/shadow密码时,则pwconv 会去 /etc/login.defs 取用相关的密码数据,并建立该账号的 /etc/shadow 数据;
2、若 /etc/passwd 内存在加密后的密码数据时,则 pwconv 会将该密码栏移动到 /etc/shadow内,并将原本的/etc/passwd 内相对应的密码栏变成 x !
pwunconv :将 /etc/shadow 内的密码栏数据写回 /etc/passwd 当中
chpasswd :读入未加密前的密码,并且经过加密后, 将加密后的密码写入 /etc/shadow 当中,格式是『 username:password 』
passwd 已经默认加入了 --stdin 的选项,因此这个 chpasswd 就变得英雄无用武之地了
Linux 的账号与群组
使用者标识符: UID 与 G
虽然我们登入 Linux 主机的时候,输入的是我们的账号,但是其实 Linux 主机并不会直接认识你的『账号名称』的,他仅认识 ID 啊 (ID 就是一组号码啦)。 由于计算机仅认识 0 与 1,所以主机对于数字比较有概念的;至于账号只是为了让人们容易记忆而已。 而你的 ID 与账号的对应就在/etc/passwd 当中
每一个文件都具有『拥有人与拥有群组』的属性吗?没错啦~每个登入的使用者至少都会取得两个 ID ,一个是使用者 ID (User ID ,简称UID)、一个是群组 ID (Group ID ,简称 GID)。
那么文件如何判别他的拥有者与群组呢?其实就是利用 UID 与 GID !每一个文件都会有所谓的拥有者 ID 与拥有群组 ID ,当我们有要显示文件属性的需求时,系统会依据 /etc/passwd 与 /etc/group 的内容, 找到 UID / GID 对应的账号与组名再显示出来!
在一部正常运作的 Linux 主机环境下,上面的动作不可随便进行, 这是因为系统上已经有很多的数据被建立存在了,随意修改系统上某些账号的 UID 很可能会导致某些程序无法进行,这将导致系统无法顺利运作的结果, 因为权限的问题。
使用者账号
你输入账号密码后,系统帮你处理了什么呢?
- 先找寻 /etc/passwd 里面是否有你输入的账号?如果没有则跳出,如果有的话则将该账号对应的 UID 与 GID (在 /etc/group 中) 读出来,另外,该账号的家目录与 shell 设定也一并读出;
- 再来则是核对密码表啦!这时 Linux 会进入 /etc/shadow 里面找出对应的账号与 UID,然后核对一下你刚刚输入的密码与里头的密码是否相符?
- 如果一切都 OK 的话,就进入 Shell 控管的阶段
/etc/passwd 文件结构
这个文件的构造是这样的:每一行都代表一个账号,有几行就代表有几个账号在你的系统中!不过需要特别留意的是,里头很多账号本来就是系统正常运作所必须要的,我们可以简称他为系统账号,例如 bin, daemon, adm, nobody 等等,这些账号请不要随意的杀掉他呢!
可以明显的看出来,每一行使用『:』分隔开,共有七个,分别是:
账号名称:
密码:
UID:
GID:
用户信息说明栏:
家目录:
Shell:
/etc/shadow 文件结构
很多程序的运作都与权限有关,而权限与 UID/GID 有关!因此各程序当然需要读取 /etc/passwd 来了解不同账号的权限。 因此 /etc/passwd 的权限需设定为 -rw-r--r-- 这样的情况, 虽然早期的密码也有加密过,但却放置到 /etc/passwd 的第二个字段上!这样一来很容易被有心人士所窃取的, 加密过的密码也能够透过暴力破解法去 trial and error (试误) 找出来!因为这样的关系,所以后来发展出将密码移动到 /etc/shadow 这个文件分隔开来的技术, 而且还加入很多的密码限制参数在 /etc/shadow 里头
shadow 同样以『:』作为分隔符,如果数一数,会发现共有九个字段啊,这九个字段的用途是这样的:
账号名称:
密码:经过编码的密码 (加密)
最近更动密码的日期:
密码不可被更动的天数(与第 3 字段相比):
这个账号的密码在最近一次被更改后需要经过几天
才可以再被变更!如果是 0 的话,表示密码随时可以更动的意思。这的限制是为了怕密码被某些人一改再改而设计的!如果设定为 20 天的话,那么当你设定了密码之后, 20 天之内都无法改变这个密码密码需要重新变更的天数(与第 3 字段相比):
为了强制要求用户变更密码,这个字段可以指定在最近一次更改密码后, 在多少天数内需要再次的变更密码才行。你必须要在这个天数内重新设定你的密码,否则这个账号的密码将会『变为过期特性』。而如果像上面的 99999 (计算为 273 年) 的话,那就表示,密码的变更没有强制性之意。密码需要变更期限前的警告天数(与第 5 字段相比):
当账号的密码有效期限快要到的时候(第 5 字段),系统会依据这个字段的设定,发出『警告』言论给这个账号,提醒他『再过 n 天你的密码就要过期了,请尽快重新设定你的密码!』,如上面的例子,则是密码到期之前的 7 天之内,系统会警告该用户。密码过期后的账号宽限时间(密码失效日):(与第 5 字段相比):
密码有效日期为『更新日期(第 3 字段)』+『重新变更日期(第 5 字段)』,过了该期限后用户依旧没有更新密码,那该密码就算过期了。 虽然密码过期但是该账号还是可以用来进行其他工作的,包括登入系统取得 bash 。不过如果密码过期了, 那当你登入系统时,系统会强制要求你必须要重新设定密码才能登入继续使用,这就是密码过期特性。账号失效日期:
这个日期跟第三个字段一样,都是使用 1970 年以来的总日数设定。这个字段表示: 这个账号在此字段规定的日期之后,将无法再使用
。就是所谓的『账号失效』,此时不论你的密码是否有过期,这个『账号』都不能再被使用!这个字段会被使用通常应该是在『收费服务』的系统中,你可以规定一个日期让该账号不能再使用!
保留:最后一个字段是保留的,看以后有没有新功能加入。
由于 shadow 有这样的重要性,因此可不能随意修改! 但在某些情况底下你得要使用各种方法来处理这个文件的!举例来说,常常听到人家说:『我的密码忘记了』, 或者是『我的密码不晓得被谁改过,跟原先的不一样了』,这个时候怎么办?
1、 一般用户的密码忘记了:这个最容易解决,请系统管理员帮忙, 他会重新设定好你的密码而不需要知道你的旧密码!利用 root 的身份使用 passwd 指令来处理即可
2、root 密码忘记了:这就麻烦了!因为你无法使用 root 的身份登入了嘛! 但我们知道 root的密码在/etc/shadow 当中,因此你可以使用各种可行的方法开机进入 Linux 再去修改。 例如重新启动进入单人维护模式(第十九章)后,系统会主动的给予 root 权限的 bash 接口, 此时再以 passwd 修改密码即可;或以Live CD 开机后挂载根目录去修改 /etc/shadow,将里面的 root 的密码字段清空, 再重新启动后 root 将不用密码即可登入!登入后再赶快以 passwd 指令去设定 root 密码即可。
关于群组: 有效与初始群组、groups, newgrp
/etc/group 文件结构
组名:
群组密码:
通常不需要设定,这个设定通常是给『群组管理员』使用的,目前很少有这个机会设定群组管理员啦! 同样的,密码已经移动到 /etc/gshadow 去,因此这个字段只会存在一个『x』而已;GID:
就是群组的 ID 啊。我们 /etc/passwd 第四个字段使用的 GID 对应的群组名,就是由这里对应出来的!此群组支持的账号名称:
一个账号可以加入多个群组,那某个账号想要加入此群组时,将该账号填入这个字段即可。 举例来说,如果我想要让 dmtsai 与 alex 也加入 root 这个群组,那么在第一行的最后面加上『dmtsai,alex』,注意不要有空格, 使成为『 root:x:0:dmtsai,alex 』就可以
我们可以使用一个简单的图示来了解一下 UID / GID 与密码之间的关系, 图示如下。其实重点是 /etc/passwd 啦,其他相关的数据都是根据这个文件的字段去找寻出来的。 下图中, root 的 UID 是 0 ,而 GID 也是 0 ,去找 /etc/group 可以知道 GID 为 0 时的组名就是 root 哩。 至于密码的寻找中,会找到 /etc/shadow 与 /etc/passwd 内同账号名称的那一行,就是密码相关数据
有效群组(effective group)与初始群组(initial group)
groups: 有效与支持群组的观察
在这个输出的讯息中,可知道 dmtsai 这个用户同时属于 dmtsai, wheel 及 users 这三个群组,而且,第一个输出的群组即为有效群组 (effective group) 了。 也就是说,我的有效群组为 dmtsai ,此时,如果我以 touch 去建立一个新档,例如:『 touch test 』,那么这个文件的拥有者为 dmtsai ,而且群组也是 dmtsai 的,通常有效群组的作用是在新建文件。
newgrp: 有效群组的切换
那么如何变更有效群组呢?就使用 newgrp 啊!不过使用 newgrp 是有限制的,那就是你想要切换的群组必须是你已经有支持的群组。举例来说, dmtsai 可以在 dmtsai/wheel/users 这三个群组间切换有效群组,但是 dmtsai 无法切换有效群组成为 sshd !使用的方式如下:
这个指令可以变更目前用户的有效群组, 而且是另外以一个 shell 来提供这个功能的,所以,以上面的例子来说, dmtsai 这个使用者目前是以另一个 shell 登入的,而且新的 shell 给予 dmtsai 有效 GID 为 users 就是了。如果以图示来看就是如下所示:
/etc/gshadow
- 组名
- 密码栏,同样的,开头为 ! 表示无合法密码,所以无群组管理员
- 群组管理员的账号 (相关信息在 gpasswd 中介绍)
- 有加入该群组支持的所属账号 (与 /etc/group 内容相同!)
账号管理
新增与移除使用者: useradd, 相关配置文件, passwd, usermod, userdel
useradd
其实系统已经帮我们规定好非常多的默认值了,所以我们可以简单的使用『 useradd 账号 』来建立使用者即可。 CentOS 这些默认值主要会帮我们处理几个项目:
- 在 /etc/passwd 里面建立一行与账号相关的数据,包括建立 UID/GID/家目录等;
- 在 /etc/shadow 里面将此账号的密码相关参数填入,但是尚未有密码;
- 在 /etc/group 里面加入一个与账号名称一模一样的组名;
- 在 /home 底下建立一个与账号同名的目录作为用户家目录,且权限为 700
由于在 /etc/shadow 内仅会有密码参数而不会有加密过的密码数据,因此我们在建立使用者账号时,还需要使用『 passwd 账号 』来给予密码才算是完成了用户建立的流程
useradd 参考档
你有没有想过,为何『 useradd vbird1 』会主动在 /home/vbird1 建立起用户的家目录?家目录内有什么数据且来自哪里?为何预设使用的是 /bin/bash 这个 shell ?为何密码字段已经都规范好了 (0:99999:7 那一串)?呵呵!这就得要说明一下 useradd 所使用的参考文件。
其实 useradd 的默认值可以使用底下的方法呼叫出来:
GROUP=100:新建账号的初始群组使用 GID 为 100 者
系统上面 GID 为 100 者即是 users 这个群组,此设定项目指的就是让新设使用者账号的初始群组为 users 这一个的意思。 但是我们知道 CentOS 上面并不是这样的,在 CentOS 上面预设的群组为与账号名相同的群组。 举例来说, vbird1 的初始群组为 vbird1 。怎么会这样啊?这是因为针对群组的角度有两种不同的机制所致, 这两种机制分别是:
私有群组机制:
系统会建立一个与账号一样的群组给使用者作为初始群组。 这种群组的设定机制会比较有保密性,这是因为使用者都有自己的群组,而且家目录权限将会设定为 700 (仅有自己可进入自己的家目录)之故。使用这种机制将不会参考 GROUP=100 这个设定值。代表性的 distributions 有 RHEL,Fedora, CentOS 等;
公共群组机制:
就是以 GROUP=100 这个设定值作为新建账号的初始群组,因此每个账号都属于 users 这个群组,且默认家目录通常的权限会是『 drwxr-xr-x ... username users ... 』,由于每个账号都属于users 群组,因此大家都可以互相分享家目录内的数据之故。代表 distributions 如 SuSE 等。由于我们的 CentOS 使用私有群组机制,因此这个设定项目是不会生效的。
HOME=/home:用户家目录的基准目录(basedir)
用户的家目录通常是与账号同名的目录,这个目录将会摆放在此设定值的目录后。所以 vbird1 的家目录就会在 /home/vbird1/ 了!
INACTIVE=-1:密码过期后是否会失效的设定值
我们在 shadow 文件结构当中谈过,第七个字段的设定值将会影响到密码过期后, 在多久时间内还可使用旧密码登入。这个项目就是在指定该日数啦!如果是 0 代表密码过期立刻失效, 如果是 -1 则是代表密码永远不会失效,如果是数字,如 30 ,则代表过期 30 天后才失效。
EXPIRE=:账号失效的日期
就是 shadow 内的第八字段,你可以直接设定账号在哪个日期后就直接失效,而不理会密码的问题。通常不会设定此项目,但如果是付费的会员制系统,或许这个字段可以设定!
SHELL=/bin/bash:默认使用的 shell 程序文件名
系统默认的 shell 就写在这里。假如你的系统为 mail server ,你希望每个账号都只能使用 email 的收发信件功能, 而不许用户登入系统取得 shell ,那么可以将这里设定为 /sbin/nologin ,如此一来,新建的使用者预设就无法登入! 也免去后续使用 usermod 进行修改的手续!
SKEL=/etc/skel:用户家目录参考基准目录
这个就是指定用户家目录的参考基准目录~举我们的范例一为例, vbird1 家目录 /home/vbird1内的各项数据,都是由 /etc/skel 所复制过去的~所以呢,未来如果我想要让新增使用者时,该用户的环境变量 ~/.bashrc 就设定妥当的话,您可以到 /etc/skel/.bashrc 去编辑一下,也可以建立 /etc/skel/www 这个目录,那么未来新增使用者后,在他的家目录下就会有 www 那个目录了。
CREATE_MAIL_SPOOL=yes:建立使用者的 mailbox
你可以使用『 ll /var/spool/mail/vbird1 』看一下,会发现有这个文件的存在!这就是使用者的邮件信箱!
除了这些基本的账号设定值之外, UID/GID 还有密码参数。那就得要看一下 /etc/login.defs ! 这个文件的内容有点像底下这样:
这个文件规范的数据则是如下所示:
mailbox 所在目录:
用户的默认 mailbox 文件放置的目录在 /var/spool/mail,所以 vbird1 的 mailbox 就是在 /var/spool/mail/vbird1 !
shadow 密码第 4, 5, 6 字段内容:
透过 PASS_MAX_DAYS 等等设定值来指定的!所以你知道为何预设的 /etc/shadow 内每一行都会有『 0:99999:7 』的存在了吗?_!不过要注意的是,由于目前我们登入时改用 PAM 模块来进行密码检验,所以那个 PASS_MIN_LEN 是失效的!
UID/GID 指定数值:
虽然 Linux 核心支持的账号可高达 232 这么多个,不过一部主机要作出这么多账号在管理上也是很麻烦的!所以在这里就针对 UID/GID 的范围进行规范就是了。上表中的UID_MIN 指的就是可登入系统的一般账号的最小 UID ,至于 UID_MAX 则是最大 UID 之意。
要注意的是,系统给予一个账号 UID 时,他是 (1)先参考 UID_MIN 设定值取得最小数值; (2)由/etc/passwd 搜寻最大的 UID 数值, 将 (1) 与 (2) 相比,找出最大的那个再加一就是新账号的 UID 了。我们上面已经作出 UID 为 1500 的 vbird2 , 如果再使用『 useradd vbird4 』时,你猜 vbird4 的 UID 会是多少?答案是: 1501 。 所以中间的 1004~1499 的号码就空下来啦!而如果我是想要建立系统用的账号,所以使用 useradd -r sysaccount 这个 -r 的选项时,就会找『比 201 大但比 1000 小的最大的 UID 』就是了。
用户家目录设定值:
为何我们系统默认会帮用户建立家目录?就是这个『CREATE_HOME = yes』的设定值啦!这个设定值会让你在使用 useradd 时, 主动加入『 -m 』这个产生家目录的选项啊!如果不想要建立用户家目录,就只能强制加上『 -M 』的选项在 useradd 指令执行时啦!至于建立家目录的权限设定呢?就透过 umask 这个设定值啊!因为是 077 的预设设定,因此用户家目录默认权限才会是『 drwx------ 』!
用户删除与密码设定值:
使用『USERGROUPS_ENAB yes』这个设定值的功能是:如果使用 userdel 去删除一个账号时,且该账号所属的初始群组已经没有人隶属于该群组了, 那么就删除掉该群组,举例来说,我们刚刚有建立 vbird4 这个账号,他会主动建立 vbird4 这个群组。 若 vbird4 这个群组并没有其他账号将他加入支持的情况下,若使用 userdel vbird4 时,该群组也会被删除的意思。 至于『ENCRYPT_METHOD SHA512』则表示使用SHA512 来加密密码明文,而不使用旧式的 MD5(注 2) 。
使用 useradd 这支程序在建立 Linux 上的账号时,至少会参考:
/etc/default/useradd
/etc/login.defs
/etc/skel/*
passwd
使用 useradd 建立了账号之后,在预设的情况下,该账号是暂时被封锁的, 也就是说,该账号是无法登入的,你可以去瞧一瞧 /etc/shadow 内的第二个字段就晓得~所以需要设定新密码就好了,设定密码就使用 passwd !
要帮一般账号建立密码需要使用『 passwd 账号 』的格式,使用『 passwd 』表示修改自己的密码,千万不要改错
与 root 不同的是,一般账号在更改密码时需要先输入自己的旧密码 (亦即 current 那一行),然后再输入新密码 (New 那一行。
chage
除了使用 passwd -S 之外,有没有更详细的密码参数显示功能呢?有的!那就是 chage 了!
chage 有一个功能很不错喔!如果你想要让『使用者在第一次登入时, 强制她们一定要更改密码后才能够使用系统资源』,可以利用如下的方法来处理的!
建立一个名为 agetest 的账号,该账号第一次登入后使用默认密码,但必须要更改过密码后, 使用新密码才能够登入系统使用
[root@study ~]# useradd agetest
[root@study ~]# echo "agetest" | passwd --stdin agetest
[root@study ~]# chage -d 0 agetest
[root@study ~]# chage -l agetest | head -n 3
Last password change : password must be changed
Password expires : password must be changed
Password inactive : password must be changed
# 此时此账号的密码建立时间会被改为 1970/1/1 ,所以会有问题!
范例三:尝试以 agetest 登入的情况
You are required to change your password immediately (root enforced)
WARNING: Your password has expired.
You must change your password now and login again!
Changing password for user agetest.
Changing password for agetest
(current) UNIX password: <==这个账号被强制要求必须要改密码!
usermod
所谓这『人有失手,马有乱蹄』,您说是吧?所以,当然有的时候会『不小心手滑了一下』在 useradd的时候加入了错误的设定数据。或者是,在使用 useradd 后,发现某些地方还可以进行细部修改。此时,当然我们可以直接到 /etc/passwd 或 /etc/shadow 去修改相对应字段的数据, 不过,Linux 也有提供相关的指令让大家来进行账号相关数据的微调~那就是 usermod
userdel
这个功能就太简单了,目的在删除用户的相关数据,而用户的数据有:
1、 用户账号/密码相关参数:/etc/passwd, /etc/shadow
2、 使用者群组相关参数:/etc/group, /etc/gshadow
3、 用户个人文件数据: /home/username, /var/spool/mail/username..
这个指令下达的时候要小心了!通常我们要移除一个账号的时候,你可以手动的将 /etc/passwd与 /etc/shadow 里头的该账号取消即可!一般而言,如果该账号只是『暂时不启用』的话,那么将 /etc/shadow 里头账号失效日期 (第八字段) 设定为 0 就可以让该账号无法使用,但是所有跟该账号相关的数据都会留下来! 使用 userdel 的时机通常是『你真的确定不要让该用户在主机上面使用任何数据了!』
另外,其实用户如果在系统上面操作过一阵子了,那么该用户其实在系统内可能会含有其他文件的。举例来说,他的邮件信箱 (mailbox) 或者是例行性工作排程 (crontab, 十五章) 之类的文件。 所以,如果想要完整的将某个账号完整的移除,最好可以在下达 userdel -r username 之前, 先以『 find / -user username 』查出整个系统内属于 username 的文件,然后再加以删除吧!
新增与移除群组
groupadd
新建一个群组
groupmod
跟 usermod 类似的,这个指令仅是在进行 group 相关参数的修改而已。(不过,不要随意的更动 GID ,容易造成系统资源的错乱喔!)
groupdel
groupdel 自然就是在删除群组的
如果某个账号 (/etc/passwd) 的 initial group 使用该群组!则无法删除~否则这个用户登入系统后, 就会找不到 GID ,那可是会造成很大的困扰的!那么如果硬要删除 vbird1 这个群组? 你『必须要确认 /etc/passwd 内的账号没有任何人使用该群组作为 initial group 』才行喔!所以,你可以:
1、修改 vbird1 的 GID ,或者是:
2、删除 vbird1 这个使用者。
gpasswd:群组管理员功能
如果系统管理员太忙碌了,导致某些账号想要加入某个项目时找不到人帮忙!这个时候可以建立『群组管理员』! 什么是群组管理员呢?就是让某个群组具有一个管理员,这个群组管理员可以管理哪些账号可以加入/移出该群组! 那要如何『建立一个群组管理员』呢?就得要透过gpasswd
主机的细部权限规划:ACL 的使用
Linux 的权限概念是非常重要的! 但是传统的权限仅有三种身份 (owner, group, others) 搭配三种权限 (r,w,x) 而已,并没有办法单纯的针对某一个使用者或某一个群组来设定特定的权限需求,例如前一小节最后的那个任务! 此时就得要使用 ACL 这个机制。
什么是 ACL 与如何支持启动 ACL
ACL 是 Access Control List 的缩写,主要的目的是在提供传统的 owner,group,others 的 read,write,execute 权限之外的细部权限设定。ACL 可以针对单一使用者,单一文件或目录来进行 r,w,x 的权限规范,对于需要特殊权限的使用状况非常有帮助。那 ACL 主要可以针对哪些方面来控制权限呢?他主要可以针对几个项目:
1、使用者 (user):可以针对使用者来设定权限;
2、群组 (group):针对群组为对象来设定其权限;
3、默认属性 (mask):还可以针对在该目录下在建立新文件/目录时,规范新数据的默认权限;
也就是说,如果你有一个目录,需要给一堆人使用,每个人或每个群组所需要的权限并不相同时,在过去,传统的 Linux 三种身份的三种权限是无法达到的, 因为基本上,传统的 Linux 权限只能针对一个用户、一个群组及非此群组的其他人设定权限而已,无法针对单一用户或个人来设计权限。 而ACL 就是为了要改变这个问题
ACL 的设定技巧: getfacl, setfac
如何设定与观察 ACL 呢? 很简单,利用这两个指令就可以了:
1、getfacl:取得某个文件/目录的 ACL 设定项目;
2、setfacl:设定某个目录/文件的 ACL 规范。
setfacl 指令用法介绍及最简单的『 u:账号:权限 』设定:
上述动作为最简单的 ACL 设定,利用『 u:使用者:权限 』的方式来设定的啦!设定前请加上 -m这个选项。 如果一个文件设定了 ACL 参数后,他的权限部分就会多出一个 + 号了!但是此时你看到的权限与实际权限可能就会有点误差! 那要如何观察呢?就透过 getfacl !
getfacl 指令用法
特定的单一群组的权限设定:『 g:群组名:权限 』
针对有效权限设定:『 m:权限 』
基本上,群组与使用者的设定并没有什么太大的差异啦!如上表所示,非常容易了解意义。不过,你应该会觉得奇怪的是, 那个 mask 是什么东西啊?其实他有点像是『有效权限』的意思!他的意义是:『 使用者或群组所设定的权限必须要存在于 mask 的权限设定范围内才会生效,此即『有效权限 (effective permission)』我们举个例子来看,如下所示:
使用默认权限设定目录未来文件的 ACL 权限继承『 d:[u|g]:[user|group]:权限 』
如果你想要让 acl 在目录底下的数据都有继承的功能,那就得如下这样做了!
使用者身份切换
使用一般账号:系统平日操作的好习惯
事实上,为了安全的缘故,一些老人家都会建议你,尽量以一般身份使用者来操作 Linux 的日常作业!等到需要设定系统环境时, 才变换身份成为 root 来进行系统管理,相对比较安全啦!避免作错一些严重的指令,例如恐怖的『 rm -rf / 』(千万作不得!)
用较低权限启动系统服务
相对于系统安全,有的时候,我们必须要以某些系统账号来进行程序的执行。 举例来说,Linux
主机上面的一套软件,名称为 apache ,我们可以额外建立一个名为 apache 的用户来启动apache 软件啊,如此一来,如果这个程序被攻破,至少系统还不至于就损毁了~
软件本身的限制
在远古时代的 telnet 程序中,该程序默认是不许使用 root 的身份登入的,telnet 会判断登入者的UID, 若 UID 为 0 的话,那就直接拒绝登入了。所以,你只能使用一般使用者来登入 Linux 服务器。 此外, ssh(注 3) 也可以设定拒绝 root 登入!那如果你有系统设定需求该如何是好?就变换身份!
由于上述考虑,所以我们都是使用一般账号登入系统的,等有需要进行系统维护或软件更新时才转为root 的身份来动作。 那如何让一般使用者转变身份成为 root 呢?主要有两种方式:
1、 以『 su - 』直接将身份变成 root 即可,但是这个指令却需要 root 的密码,也就是说,如果你要以 su 变成 root 的话,你的一般使用者就必须要有 root 的密码才行
;
2、 以『 sudo 指令 』执行 root 的指令串,由于 sudo 需要事先设定妥当,且 sudo 需要输入用户自己的密码,因此多人共管同一部主机时, sudo 要比 su 来的好!至少 root 密码不会流出去!
su
总结一下他的用法是这样的:
1、若要完整的切换到新使用者的环境,必须要使用『 su - username 』或『 su -l username 』,才会连同 PATH/USER/MAIL 等变量都转成新用户的环境;
2、如果仅想要执行一次 root 的指令,可以利用『 su - -c "指令串" 』的方式来处理;
3、使用 root 切换成为任何使用者时,并不需要输入新用户的密码;
虽然使用 su 很方便啦,不过缺点是,当我的主机是多人共管的环境时,如果大家都要使用 su 来切换成为 root 的身份,那么不就每个人都得要知道 root 的密码,这样密码太多人知道可能会流出去,很不妥当!透过 sudo 来处理即可!
sudo
相对于 su 需要了解新切换的用户密码 (常常是需要 root 的密码), sudo 的执行则仅需要自己的密码即可! 甚至可以设定不需要密码即可执行 sudo 呢!由于 sudo 可以让你以其他用户的身份执行指令 (通常是使用 root 的身份来执行指令),因此并非所有人都能够执行 sudo , 而是仅有规范到/etc/sudoers 内的用户才能够执行 sudo 这个指令
sudo 执行的重点是:『能否使用 sudo 必须要看 /etc/sudoers 的设定值, 而可使用 sudo 者是透过输入用户自己的密码来执行后续的指令串』!由于能否使用与 /etc/sudoers 有关,所以我们当然要去编辑 sudoers 文件!不过,因为该文件的内容是有一定的规范的,因此直接使用 vi 去编辑是不好的。 此时,我们得要透过 visudo 去修改这个文件
。
visudo 与 /etc/sudoers
除了 root 之外的其他账号,若想要使用 sudo 执行属于 root 的权限指令,则 root 需要先使用visudo 去修改 /etc/sudoers ,让该账号能够使用全部或部分的 root 指令功能。为什么要使用visudo 呢?这是因为 /etc/sudoers 是有设定语法的,如果设定错误那会造成无法使用 sudo 指令的不良后果。因此才会使用 visudo 去修改, 并在结束离开修改画面时,系统会去检验 /etc/sudoers 的语法
单一用户可进行 root 所有指令,与 sudoers 文件语法:
上面这一行的四个组件意义是:
『使用者账号』:系统的哪个账号可以使用 sudo 这个指令的意思;
『登入者的来源主机名』:当这个账号由哪部主机联机到本 Linux 主机,意思是这个账号可能是由哪一部网络主机联机过来的, 这个设定值可以指定客户端计算机(信任的来源的意思)。默认值 root 可来自任何一部网络主机
『(可切换的身份)』:这个账号可以切换成什么身份来下达后续的指令,默认 root 可以切换成任何人;
『可下达的指令』:可用该身份下达什么指令?这个指令请务必使用绝对路径撰写。 预设 root 可以切换任何身份且进行任何指令之意
ALL 是特殊的关键词,代表任何身份、主机或指令的意思
利用 wheel 群组以及免密码的功能处理 visudo
上面的设定值会造成『任何加入 wheel 这个群组的使用者,就能够使用 sudo 切换任何身份来操作任何指令』的意思。 你当然可以将 wheel 换成你自己想要的群组名。
既然我们都信任这些 sudo 的用户了,能否提供『不需要密码即可使用 sudo 』呢?就透过如下的方式:
重点是那个 NOPASSWD !该关键词是免除密码输入的意思。
有限制的指令操作:
上面的设定值指的是『myuser1 可以切换成为 root 使用 passwd 这个指令』的意思。其中要注意的是: 指令字段必须要填写绝对路径才行!否则 visudo 会出现语法错误的状况发生! 此外,上面的设定是有问题的!我们使用底下的指令操作来让您了解:
我们竟然让 root 的密码被 myuser1 给改变了!下次 root 回来竟无法登入系统...欲哭无泪~怎办? 所以我们必须要限制用户的指令参数!修改的方法为将上述的那行改一改先:
在设定值中加上惊叹号『 ! 』代表『不可执行』的意思。因此上面这一行会变成:可以执行『 passwd 任意字符』,但是『 passwd 』与『 passwd root 』这两个指令例外! 如此一来 myuser1 就无法改变 root 的密码了!这样这位使用者可以具有 root 的能力帮助你修改其他用户的密码, 而且也不能随意改变 root 的密码!很有用处的!
透过别名建置 visudo:
如果我有 15 个用户需要加入刚刚的管理员行列,那么我是否要将上述那长长的设定写入 15 行? 而且如果想要修改命令或者是新增命令时,那我每行都需要重新设定,很麻烦!有没有更简单的方式? 是有的!透过别名即可!我们 visudo 的别名可以是『指令别名、帐户别名、主机别名』等:
假设我的 pro1, pro2, pro3 与 myuser1, myuser2 要加入上述的密码管理员的 sudo 列表中, 那我可以创立一个帐户别名称为 ADMPW 的名称,然后将这个名称处理一下即可。处理的方式如下:
透过 User_Alias 建立出一个新账号,这个账号名称一定要使用大写字符来处理,包括 Cmnd_Alias(命令别名)、Host_Alias(来源主机名别名) 都需要使用大写字符的!这个 ADMPW 代表后面接的那些实际账号。 而该账号能够进行的指令就如同 ADMPWCOM 后面所指定的那样!上表最后一行则写入这两个别名 (账号与指令别名), 未来要修改时,我只要修改 User_Alias 以及 Cmnd_Alias 这两行即可
sudo 搭配 su 的使用方式
很多时候我们需要大量执行很多 root 的工作,所以一直使用 sudo 觉得很烦!那有没有办法使用 sudo 搭配 su , 一口气将身份转为 root ,而且还用用户自己的密码来变成 root 呢?是有的! 我们建立一个 ADMINS 帐户别名,然后这样做
接下来,上述的 pro1, pro2, pro3, myuser1 这四个人,只要输入『 sudo su - 』并且输入『自己的密码』后, 立刻变成 root 的身份!不但 root 密码不会外流,用户的管理也变的非常方便! 这也是实务上面多人共管一部主机时常常使用的技巧呢!这样管理确实方便,不过还是要强调一下大前提, 那就是『这些你加入的使用者,全部都是你能够信任的用户
』!
用户的特殊 shell 与 PAM 模块
略......
总结
Linux 操作系统上面,关于账号与群组,其实记录的是 UID/GID 的数字而已;
使用者的账号/群组与 UID/GID 的对应,参考 /etc/passwd 及 /etc/group 两个文件
/etc/passwd 文件结构以冒号隔开,共分为七个字段,分别是『账号名称、密码、UID、GID、全名、家目录、shell』
UID 只有 0 与非为 0 两种,非为 0 则为一般账号。一般账号又分为系统账号 (1~999) 及可登入者账号(大于 1000)
账号的密码已经移动到 /etc/shadow 文件中,该文件权限为仅有 root 可以更动。该文件分为九个字段,内容为『账号名称、加密密码、密码更动日期、密码最小可变动日期、密码最大需变动日期、密码过期前警告日数、密码失效天数、 账号失效日、保留未使用』
使用者可以支持多个群组,其中在新建文件时会影响新文件群组者,为有效群组。而写入 /etc/passwd 的第四个字段者, 称为初始群组。
与使用者建立、更改参数、删除有关的指令为:useradd, usermod, userdel 等,密码建立则为 passwd;
与群组建立、修改、删除有关的指令为:groupadd, groupmod, groupdel 等;
群组的观察与有效群组的切换分别为:groups 及 newgrp 指令;
useradd 指令作用参考的文件有: /etc/default/useradd, /etc/login.defs, /etc/skel/ 等等
观察用户详细的密码参数,可以使用『 chage -l 账号 』来处理;
用户自行修改参数的指令有: chsh, chfn 等,观察指令则有: id, finger 等
ACL 的功能需要文件系统有支持,CentOS 7 预设的 XFS 确实有支持 ACL 功能!
ACL 可进行单一个人或群组的权限管理,但 ACL 的启动需要有文件系统的支持;
ACL 的设定可使用 setfacl ,查阅则使用 getfacl ;
身份切换可使用 su ,亦可使用 sudo ,但使用 sudo 者,必须先以 visudo 设定可使用的指令;
PAM 模块可进行某些程序的验证程序!与 PAM 模块有关的配置文件位于 /etc/pam.d/* 及 /etc/security/*
系统上面账号登入情况的查询,可使用 w, who, last, lastlog 等;
在线与使用者交谈可使用 write, wall,脱机状态下可使用 mail 传送邮件!