《鸟哥的Linux私房菜》笔记
1、Linux的账号与用户组
如何管理好一个服务器主机的账号,以及在管理主机账号时Linux到底是如何辨别每一个用户的账号的!
1.1、用户标识符:UID与GID
虽然我们登录Linux主机的时候,输入的是我们的账号,但是其实Linux主机并不会直接认识你的”账号名称“,它仅仅认识ID(一组号码)。账号只是方便给我们记忆而已。账号与ID的对应关系就在/etc/passwd当中。
每个登录的用户至少都会取得两个ID,一个用户ID(UserID),一个是用户组ID(GroupID)。在一台Linux主机中,UID和GID不要随便进行更改。
1.2、用户账号
Linux系统上面用户登录主机,必须在计算机前利用 tty1~tty7的终端机提供的login接口输入账号密码登录,或者通过网络远程ssh登录。
那么在你输入账号密码后,系统帮你处理了什么?
1、先寻找/etc/passwd里面是否有你输入的账号,如果没有则跳出,有则读取用户相应的信息(GID,shell等);
2、接下来核对密码表,在/etc/shadow里面;
3、如果一切OK,就进入shell管控阶段。
所以当你要登录Linux主机的时候,那个/etc/passwd与/etc/shadow就必须要让系统读取(这也是很多攻击者会将特殊账号写入/etc/passwd里面去的缘故)。
跟用户账号有关的有两个非常重要的文件,一个是管理用户 UID/GID 重要参数的/etc/passwd,一个则是专门管理密码相关数据的/etc/shadow。
/etc/passwd文件结构
每一行代表一个账号,有多少行就有多少账号在你的系统中,里面很多账号是系统正常运行所必要的,所以请不要随意删除。
很多程序的运行都与权限有关,而权限又与UID/GID有关。
1、账号名称,用来对应UID;
2、密码,放置在/etc/shadow,所以此处你看到一个"x";
3、UID,这个就是用户标识符,UID为0的时候就是root,请注意;
4、GID,这个与/etc/group有关;
5、用户信息说明列,用来解释账号的意义;
6、主文件夹,如/root;
7、Shell,登陆以后所取得的shell。
/etc/shadow文件结构
各程序需要读取/etc/shadow来了解不同账号的权限,因此注意/etc/shadow权限。
1、账号名称,必须与/etc/passwd相同才行;
2、密码,这是经过编码的密码,你看到仅是一些特殊字符。在此字段(密码)前加上*或!改变了密码字段会让密码“暂时失效”;
3、最近更动密码的日期,初始日期是从1970-01-01开始,单位是天;
4、密码不可被更动的天数,表示需要更改密码后经过多少天才可以再被更改,0表示随时可以更改;
5、密码需要重新更改的天数,表示最近一次更改密码后在多少天内需要再次更改密码才行,9999大概为273年,表示没有强制之意;
6、密码需要更改期限前的警告天数,表示提醒你的密码还有多少天要过期了;
7、密码过期后账号的宽限时间;
8、账号失效日期;
9、保留;
一般用户的密码忘记了,可以让系统管理员帮忙重新设置密码;而root密码忘记了的话,你需要使用各种可行的方法开机进入Linux再去修改。
1.3、有效与初始用户组:groups,newgrp
用户组的配置文件存在于/etc/group与/etc/gshadow下面。
/etc/group文件结构
1、用户组名称;
2、用户组密码;
3、GID;
4、此用户组支持的账号名称,一个账号可以加入多个组,某个账号需要加入用户组时,将该账号填入这个字段即可;
有效用户组(effective group)与初始用户组(initial group)
用户可以加入多个用户组,那么用户在作业的时候,到底是以哪个用户组为准呢?
还记得每个用户在他的/etc/passwd里面的第四列有所谓的GID吧?那个GID就是所谓的“初始用户组”。也就是用户登录系统,立刻就拥有这个用户组额相关权限的意思。
不过,针对文件而言,我所做的操作是基于用户当前的有效用户组的组权限。
groups:有效与支持用户组的查看
groups
newgrp:有效用户组的切换
切换的用户组必须是已经支持的用户组,另外以一个shell来提供这个功能。
newgrp root
/etc/gshadow文件结构
1、用户组名;
2、密码列,开头为!表示无合法密码;
3、用户组管理员的账号;
4、该用户组的所属账号。
gshadow最大的功能就是创建组管理员。
2、账号管理
2.1、新增与删除用户
useradd,passwd,usermod,userdel,相关配置文件等。
useradd命令
其实系统已经帮我们规定好了非常多的默认值,所以问哦们可以简单地使用“useradd”创建账号。
由于系统账号主要是用来进行系统所需服务的权限设置,所以系统账号默认都不会主动创建主文件夹。
passwd命令
使用useradd创建了账号之后,在默认的情况下,该账号是暂时被封锁了的。需要直接设置新密码就好。
关于设置密码的几点要求:
密码不能与账号相同;
密码尽量不要选用字典里面会出现的字符串;
密码需要超过8个字符;
密码不要使用个人信息,如身份证、电话、生日等;
密码不要使用简单的关系式等;
密码尽量使用大小写、数字、特殊字符的组合。
新版passwd支持标准(--stdin)输入来输入密码:
echo "zhang" | passwd --stdin zhang
chage命令
详细地密码参数显示功能。
chage有一个很不错的功能,可以让用户第一次登录时强制它们一定要更改密码后才能使用系统资源,参考方法如下。
chage -d 0 username
usermod命令
用户数据的微调
userdel命令
userdel
userdel -r #连同主文件夹一起删
如果想要完整地将某个账号删除,最好可以在删除之前执行 find / -user username 查处整个系统内属于username的文件,然后进行删除。
2.2、用户功能
不论是useradd、userdel、usermod,都是系统管理员才能使用的命令。这下面介绍几个一般用户常用的账号数据更改与查询命令。
finger #可以查阅很多用户相关的信息和用户登录信息
chsh #change shell
id
id这个命令则可以查询某人或自己相关UID/GID等的信息,也可以判断系统上有无某账号。
2.3、新增与删除用户组
groupadd
groupmod
groupdel
gpasswd #用户组管理员功能
3、ACL:主机的具体权限规划
ACL机制是用来单独针对某一个用户或者某一组来设置特定的权限需求。
3.1、什么是ACL
ACL(Access Control List),主要的目的是提供传统的owner、group、others的read、write、execute权限之外的具体权限设置。ACL可以针对单一用户、单一文件或目录来进行r、w、x的权限设置,对于需要特殊权限的使用情况来说非常有帮助。
可以针对 用户来设置其权限;
可以针对用户组来设置其权限;
可以针对目录/文件来设置权限。
3.2、如何启动ACL
由于ACL是传统的UNIX-like操作系统权限的额外支持项目,因此要使用ACL必须要有文件系统的支持才行。ext4文件系统支持ACL的功能。
3.3、ACL的设置技巧:getfacl,setfacl
getfacl:取得某个文件/目录的ACL设置项目;
setfacl:设置某个文件/目录的ACL规定;
setfacl
getfacl
利用" u:用户:权限"的方式来设置;
如果一个文件设置了ACL参数后,他的权限部分就会多出一个 + 号!
现实的数据前面加上 # 号的表示文件的默认属性;
有效权限(mask)定义了ACL最大允许的权限,mask没有的权限就算ACL定义了也无法生效,不过通常都将mask设置位rwx。
设置mask
ACL的权限设置默认是不会继承的,如要让子目录继承,则如下所示:
ACL设置的属性全部取消:
setfacl -b /dir/xxxx
4、用户身份切换
切换身份的几个原因:
使用一般账号,系统平日操作的好习惯;
用较低权限启动系统服务;
软件本身的限制;
一般用户转变为root用户:
以" su - " 直接将身份变为root,但是这个命令需要root的密码;
以" sudo 命令" 执行root的命令串,sudo需要事先设置妥当,且只需要输入用户自己的密码,因此当多人共同管理同一台主机的时,sudo比su来得好些。至少root密码不会流传出去。
4.1、su
su是最简单的身份切换命令,它可以进行任何身份的切换。
su 和 su - 两者差别很大。
su 切换位root的身份,读取的变量设置方式位 non-login shell 的方式,这种方式下很多原本的变量不会被改变;
su - 读取变量的方式位 login-shell ,这样才会连同PATH等变量都转换成新用户的环境。
4.2、sudo
当我的主机是很多人管理的环境时,如果大家都使用 su 来切换为root 的身份,那么不就每个人都得要知道root的密码,而太多人知道的秘密就不是秘密了,密码就可能会流传出去。
sudo 执行只需要自己的密码,或者不需要密码。由于sudo可以让你以其他用户的身份执行命令(通常是使用root的身份来执行命令),因此并非所有人都能够执行sudo,而是仅有 /etc/sudoers内的用户才能够执行sudo这个命令。
sudo
sudo的执行流程:
当用户执行sudo时,系统于/etc/sudoers文件中查找该用户是否由执行sudo的权限;
若用户具有可执行sudo的权限后,便让用户输入自己的密码来确认;
若密码输入成功,变卡斯和i进行sudo后续的命令;
若欲切换的身份与执行者身份相同,那也不需要输入密码;
sudo执行的重点,能够使用sudo必须要看/etc/sudoers的设置值,而可使用sudo的是通过输入自己的密码来执行后续的命令串。
visudo与/etc/sudoers
除了root用户外,若想使用sudo执行属于root的权限命令,则root需要先使用visudo去修改/etc/sudoers,让某账号/组能够拥有全部或部分的root命令功能。
为什么是使用visudo呢?这是因为/etc/sudoers是有语法的,如果设置错误那会造成无法使用sudo的不良后果,并且在结束离开修改界面时,系统会去检验/etc/sudoers的语法。
单一用户可进行root所有命令与sudoers文件语法:
1,用户账号;
2,登陆着的来源主机
3,可切换的身份;
4,可执行的命令,这个命令请务必以绝对路劲编写。
利用用户组以及面密码的功能处理visudo
有限制的命令操作
加上 " ! " 代表不可执行的意思
通过别名设置viduso
通过 User_Alias 创建出一个新账号,这个账号名称一定要使用大写字符来处理,包括 Cmnd_Alias(命令别名)、Host_Alias(来源主机名别名) 都需要使用大写字符的!
sudo的时间间隔问题
如果两次sudo操作的间隔没有超过5分钟,那就不需要再次输入密码,超过则需要。
5、用户的特殊shell与PAM模块
如果我需要新建的一个仅能够使用某项服务相关的账号,而改账号并不能登录Linux主机。如果不能给予一个账号一个密码,那么该账号就无法使用系统的各项资源,各种服务资源。如果给予该账号一个密码,那么该账号就可能可以登录Linux主机。
5.1、特殊的shell,/sbin/nologin
在/etc/passwd文件结构里面我们谈过系统账号,系统账号的shell就是使用/sbin/nologin,重点在于系统账号是不需要登录的!所以我们就给他这个无法登录的合法shell,使用了/sbin/nologin这个shell,即使用户有了密码,想要登录系统时他也无法登录。
但是请注意,我们说的这个无法登录指的仅是这个用户无法使用 bash 或其他 shell 来登录系统而已,并不是说这个账号就无法使用系统资源。
如我们图上所示的mail用户,是mail服务,并不需要登录主机。所以shell设置为/sbin/nologin。
如果我想让/sbin/nologin用户知道,他们不能登录主机,我们可以通过/etc/nologin.txt文件来说明。
vim /etc/nolougin.txt
5.2、PAM模块简介
PAM(Pluggable Authentication Modules)嵌入式模块
PAM可以说是一套应用程序接口(Application Programming Interface,API)它提供了一连串的验证机制,只要用户将验证阶段的需求告知PAM后,PAM就能够回报用户验证的结果(成功或失败)。
由于PAM仅是一套验证的机制,又可以提供给其他程序所调用,因此不论你使用什么程序,都可以使用PAM来进行验证,如此一来,就能够让账号密码或者是其他方式的验证具有一致的结果。
PAM是一个独立的API存在,只要任何程序有需求时,可以向PAM发出验证要求的通知,PAM经过一连串的验证后,将验证的结果回报给该程序,然后该程序就能够利用验证的结果来进行可登录或显示其他无法使用的信息。这也就是说,你可以在写程序的时候将PAM模块的功能加入,就能够利用PAM的验证功能。因此目前很多程序都会利用PAM。
PAM用来进行验证的数据称为模块(Modules),每个PAM模块的功能都不大相同。例如passwd。
5.3、PAM模块设置语法
PAM通过一个与程序相同的文件名的配置文件来进行一连串的认证分析需求。我们以passwd这个命令调用PAM。当你执行passwd后,这个程序的流程如下:
1,用户开始执行/usr/bin/passwd 这支程序,并输入密码;
2,passwd调用PAM模块进行验证;
3,PAM模块会到 /etc/pam.d/ 中寻找与程序(passwd)同名的配置文件;
4,依据 /etc/pam.d/passwd 内的设置,引用相关的PAM模块逐步进行验证分析;
5,将验证结果(成功、失败以及其他意思)回传给passwd这个程序;
6,passwd这个程序会根据PAM回传的结果决定下一个操作(重新输入新密码或通过验证!)。
其实重点就是/etc/pam.d/里面的配置文件,以及配置文件所调用的PAM模块进行的验证工作。
来看看 /etc/pam.d/passwd 这个配置文件
这个配置文件中,除了第一行#号声明PAM版本外,其他任何 "#" 都是注释,而每一行都是一个独立的验证流程,每一行可以区分为三个字段,分别为 验证类型(type)、控制标志(flag)、PAM的模块与该模块的参数。
上面这个 "include" (包括)这个关键字,它代表的是调用后面的文件来作为这个类别的验证,所以,上面的include都要重复调用 /etc/pam.d/system-auth 那个文件来进行验证。
第一个字段:验证类型(Type)
验证类型主要分为四种:
auth(authentication(认证)),这种类型主要是用来检验用户身份凭证;
account(账号),大部分在进行授权(authorization),这种类型主要在检验用户是否具有正确的权限;
session,是会话期间的意思,所以session管理的就是用户在这次登录期间PAM所给予的环境设置;
passwd,这个类型主要用于提供验证的修订工作;
第二个字段:验证的控制标志(control flag)
它代表通过验证的标准是什么,管控该验证的放行方式,主要也分为四种控制方式:
required,此验证不论成功(success)还是失败(failure)都会继续后续的验证流程;
requisite,此验证失败(failure)就直接终止,成功才进行下一步;
sufficient,验证到成功(success)就立刻回传给程序,失败继续下一步;
optional,这个模块控件目的大多是在显示信息而已,并不用再验证方面。
5.4、常用模块简介
系统中的详细模块情报
/etc/pam.d/*:每个程序个别的PAM配置文件;
/lib64/security/*:PAM模块文件的实际放置目录;
/etc/security/*:其他PAM环境的配置文件;
/usr/share/doc/pam-*/:详细的PAM说明文件。
下面我们来看一下/lib64/security/pam_*这些文件的用法:
介绍几个比较常用的PAM模块。
pam_security.so
限制系统管理员(root)只能从安全的(secure)终端机登录。例如 tty1,tty2,等就是传统的终端机设备名称。安全的终端机设备写在 /etc/secutetty 这个文件里。由于远程连接属于 pts/n 的动态终端机接口设备名称,并没有写入到 /etc/securetty。
pam_nologin.so
这个模块可以限制一般用户是否能够登录主机之用,当/etc/nologin这个文件存在时,则所有一般用户均无法在登录系统了!
pam_selinux.so
SELinux是个针对程序来进行详细管理权限的功能。
pam_console.so
这个模块可以让用户通过特殊的终端接口(console)梳理登录系统。
pam_loginuid.so
为了验证用户的UID真的是我们所需要的数值,可以使用这个模块来进行规范。
pam_env.so
用来设置环境变量的一个模块。
pam_UNIX.so
很复杂但是很重要的模块,这个模块可以用于验证阶段的认证功能,授权阶段的账号许可证管理,回忆阶段的日志文件记录,密码更新阶段的检验。
pam_cracklib.so
用来检验密码的强度!包括密码输入几次错误就断掉连接。
pam_limits.so
讨论一下login的PAM验证机制流程:
1,验证阶段(auth):
首先经过pam_securetty.so判断,如果用户是root时,则会参考/etc/securetty的设置,接下来经过pam_env.so设置额外的环境变量,在通过pam_UNIX.so检验密码,若通过回报login程序,若不通过则继续往下以pam_succeed_if.so判断UID是否大于500,若小于500则回报失败,否则再往下以pam_deny.so拒绝连接。
2,授权阶段(account):
先以pam_nologin.so判断/etc/nologin是否存在,若存在则不许一般用户登录;接下来以pam_UNIX进行账号管理,在意pam_succeed_if.co判断UID是否小于500,若小于500则不记录登录信息。最后以pam_permit.so允许该账号登录。
3,密码阶段(passwd):
先以pam_cracklib.so设置密码仅能尝试错误几次,接下来以pam_UNIX.so通过md5,shadow等功能进行密码校验,若通过则回报login程序,若不通过则以pam_deny.so拒绝登录。
4,会话阶段(session):
先以pam_selinux.so暂时关闭SELinux,使用pam_limits.so设置好用户能够操作的系统资源,登陆成功后开始记录相关信息在登录文件中,以pam_loginuid.so设置不同的UID权限,打开pam_selinux.so功能。
总之,就是依据验证类型(type)来看,然后先由login的设置去查阅,如果出现了 includesystem-auth 就转到 system-auth 文件夹中的相同类型,去取得额外的验证流程就是了。然后再到下一个验证类型,最终将所有的验证都跑完,就结束这次的PAM验证。
5.5、其他相关文件
几个可能用到的配置文件
limits.conf(etc/security/limits.conf),设置完成就生效,但已经登录的用户或组要再次登录才对他们生效。
#账号,限制依据,限制项目,限制值
#第一字段为账号,或者是用户组(要加上@,如@studen)
#第二字段为限制的依据,是严格(hard)还是警告(soft)
#第三字段为相关限制,如maxlogins(最大登录数)
#第四字段为限制的值,如最大登录数为4
/var/log/secure,/var/log/messages
发生一些错误信息都会被记录到这里面
6、Linux主机上的用户信息传递
6.1、查询用户:w、who、last、lastlog
w、who:查询目前系统上已经登录的用户;
last:列出从系统新建之后到目前所有登录者的信息;
lastlog:列出每个账号的最近登录时间,全部账号。
6.2、用户对谈:write、mesg、wall
利用write命令给系统上面的账号发消息;
利用mesg命令不接受任何消息;
利用wall命令给系统上所有用户传送信息(广播)。
6.3、用户邮件信箱:mail
一般来说,mailbox都会放置在/var/spool/mail里面,一个账号一个mailbox。
mail username@hostname -s "邮件主题"
当然也可以通过输入重定向来讲文件内容传输
mail username@hostname -s "邮件主题" < filename
7、手动新增用户
一般来说,我们不建议通过手动的方式来新增用户。因为用户的新建涉及用户的GID/UID等权限的关系,而且,与文件/目录的权限也有关系,使用useradd可以帮我们自动设置好等相关权限设置。而手动添加的时候可能后遗忘东西。
7.1、一些检查工具
pwck命令
pwck检查/etc/passwd这个账号配置文件内的信息,与实际的主文件夹是否存在等信息,还会比较/etc/passwd和/etc/shadow的信息是否一致。有错误时还会提醒用户修改
上面这些系统服务账号没用文件夹是正常的,我们忽略正常的错误!
pwconv命令
这个命令主要是将/etc/passwd内的账号与密码移动到/etc/shadow当中!
7.2、特殊账号(如学号,工号)的手工创建
其实纯数字账号可能会混乱系统对UID/GID的判断,并且ACL也可以通过UID/GID来设置,也比较混乱。
但很多时候数字账号是必须要的,So,do it。
手动建立账号的操作:
1,先新建所需要的用户组(vi /etc/group);
2,将 /etc/group 与 /etc/gshadow 同步 (grpconv);
3,新建账号的各个属性(vi /etc/passwd);
4,将 /etc/passwd 与 /etc/shadow同步(pwconv);
5,新建该账号的密码(passwd accountname);
6,新建用户主文件夹(cp -a /etc/skel /home/accountname );
7,更改用户主文件夹的属性(chown -R accountname.group/home/accountname)。
#不建议设置一些奇怪的账号名称
7.3、批量新建账号模板(适用于passwd --stdin 参数)
建立一个scripts来执行新增用户的功能,密码用户名
vi accounts.txt
user01
user02
user03
....
user20
vi accounts.sh
if [ ! accounts.txt ];then
echo "账号文件不存在“
exit 1
fi
usernames=$(cat accounts.txt)
for user in $usernames
do
useradd $user
echo $user | passwd --stdin $user
chage -d 0 $user #强制登录修改密码
done
8、重点回顾
Linux操作系统上面,关于账号与用户组,其实记录的是UID/GID的数字而已;
用户账号/用户组与UID/GID的对应,参考/etc/passwd及/etc/group两个文件;
/etc/passwd文件结构以冒号隔开,共分为七个字段,分别是账号名称、密码、UID、GID、全名、主文件夹、shell;
UID只有0与非0两种,非0则为一般账号。一般账号又分为系统账号(1-499)及可登录者账号(大于500);
账号的密码已经移动到/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可进行单一个人或组的权限管理,但ACL的启动需要有文件系统的支持;
ACL的设置可使用setfacl,查阅则使用getfacl;
身份切换可使用su,也可使用suso,但使用sudo,必须先以visudo设置可使用的命令;
PAM模块可进行某些程序的验证程序,与PAM模块有关的配置文件位于/etc/pam.d/*及/etc/security/*中;
系统上面账号登陆情况的查询,可使用w,who,last,lastlog等;
在线与用户交谈可使用write、wall,脱机状态下可使用mail传送邮件。