问题:user版本增加su 指令以后,允许切换root用户,但是,root用户默认没有设置密码,这样访问不安全。
需要增加root用户密码。
Linux一切皆文件。文件和目录都有相应的权限,权限定义的基本格式:
文件类型 所有者权限 用户组权限 其他用户权限
drwxr-xr-x 3 root root 4096 Aug 17 14:54 toolchain
drwxr-xr-x 19 root root 4096 Aug 17 14:54 tools
-rw-r--r-- 1 root root 21089672 Aug 18 16:06 u28081802.log
drwxr-xr-x toolchain 文件类型是d (文件夹) 所有者权限 rwx: 可读(r)可写(w)可执行(x),用户组权限r-x:
可读(r)可执行(x)。文件所有者是root, 用户组是 user。更加详情内容可以参考:
一文带你学习Linux 中的文件权限概念和相关命令 - 知乎 (zhihu.com)
账号用户管理登录用户,实现访问控制。
id命令用于查看用户和用户所在的组信息。
安卓系统查看系统用户信息:
lahaina:/ # id
uid=0(root) gid=0(root) groups=0(root),1004(input),1007(log),1011(adb),1015(sdcard_rw),1028(sdcard_r),1078(ext_data_rw),
1079(ext_obb_rw),3001(net_bt_admin),3002(net_bt),3003(inet),3006(net_bw_stats),3009(readproc),3011(uhid) context=u:r:su:
s0
lahaina:/ # id root
uid=0(root) gid=0(root) groups=0(root) context=u:r:su:s0
lahaina:/ #
root用户uid=0, 组id=0, 所在的组root, SELinux策略上下文: u:r:su:s0
已经内置了root用户。还有其他的系统用户,shell, adb等。
lahaina:/ # id shell
uid=2000(shell) gid=2000(shell) groups=2000(shell) context=u:r:su:s0
lahaina:/ #
lahaina:/ # id root
uid=0(root) gid=0(root) groups=0(root) context=u:r:su:s0
useradd 命令用于创建新的用户
命令格式:useradd [-选项] 用户名
常用选项:
-u 指定用户UID,root用户的uid=0
-d 指定用户家目录,一般用户目录, /home/[用户名], 可以通过cd ~到当前用户的家目录
-c 用户描述信息
-g 指定用户基本组, 用户组信息,root的用户组
-G 指定用户附加组
-s 指定用户的shell
#创建用户指定用户UID、描述信息、附加组
[root@localhost ~]# useradd -u 1600 -c yunwei -G test xiaozhang
[root@localhost ~]# id xiaozhang
uid=1600(xiaozhang) gid=1600(xiaozhang) 组=1600(xiaozhang),1401(test)
#/sbin/nologin :禁止用户登录系统
[root@localhost ~]# useradd -u 1800 -c test -s /sbin/nologin user8
user8:x:1800:1800:test:/home/user8:/sbin/nologin
更多信息请参考博文:
https://zhuanlan.zhihu.com/p/561408502
查看用户家目录
root@ubuntu:/etc/skel# cd ~
root@ubuntu:~# pwd
/root
例如创建一个用户 test, 用户uid=4000, 组 test。
注意:如果用户组不存在,请先创建用户组
root@ubuntu:~# groupadd -g 4000 test
root@ubuntu:~# useradd -u 4000 -g test test
root@ubuntu:~# id
uid=0(root) gid=0(root) groups=0(root)
用户创建以后,使用id查看不存在,因为id默认只能查看系统用户。
id test能看到用户test信息。
root@ubuntu:~# id test
uid=4000(test) gid=4000(test) groups=4000(test)
groupadd [-g gid [-o]] [-r] [-f] 组名
-g gid group’s ID 值 .除非使用 -o,
-o--non-unique 参数不然该值必须是唯一, 不可相同.数值不可为负。预设为最小不得小于500而逐次增加。 0~999 传统上是保留给系统账号使用。
-r,--system 此 参数是用来建立系统账号。的 UID 会比定义在系统档上/etc/login.defs. 的 UID_MIN 来的小.注意 useradd 此法所建立的账号不会建立使用者目录,也不会在乎纪录在 /etc/login.defs. 的定义值 . 如果你想要有使用者目录须额外指定。 -m 参数来建立系统账号。 这是 RED HAT 额外增设的选项。它会自动帮你选定一个小于999 的 gif 不需要 再加上 -g 参数。这是RED HAT 额外增设的选项。
-f,--force 新增一个已经存在的群组账号,系统会出现错误讯息然后结束groupadd .如果是这样的情况,不会新增这个群组(如果 是这个情况下,系统不会再新增一次)也可同时加上 -g,--gid GID选项当你加上一个gid,此时 gid 就不用是唯一值,可不加 -o 参数,建好群组后会显结果 .
例如:创建一个分组 test, gid=4000
root@ubuntu:~# groupadd -g 4000 test
组:
基本组(初始组):一个用户只允许有一个基本组
附加组(在基本组之外组):一个用户可以允许有多个附加组
用户--->shell程序--->内核--->硬件
用户的基本信息存放在/etc/passwd文件,我们通过查看/etc/passwd文件内容,
可以看到当前系统所有的用户信息。
root@ubuntu:/etc/default# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-timesync:x:100:102:systemd Time Synchronization,,,:/run/systemd:/bin/false
systemd-network:x:101:103:systemd Network Management,,,:/run/systemd/netif:/bin/false
systemd-resolve:x:102:104:systemd Resolver,,,:/run/systemd/resolve:/bin/false
syslog:x:104:108::/home/syslog:/bin/false
_apt:x:105:65534::/nonexistent:/bin/false
lxd:x:106:65534::/var/lib/lxd/:/bin/false
messagebus:x:107:111::/var/run/dbus:/bin/false
uuidd:x:108:112::/run/uuidd:/bin/false
dnsmasq:x:109:65534:dnsmasq,,,:/var/lib/misc:/bin/false
sshd:x:110:65534::/var/run/sshd:/usr/sbin/nologin
ubuntu:x:1000:1000:ubuntu,,,:/home/ubuntu:/bin/bash
systemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologin
tss:x:103:118:TPM software stack,,,:/var/lib/tpm:/bin/false
pollinate:x:111:1::/var/cache/pollinate:/bin/false
tcpdump:x:112:119::/nonexistent:/usr/sbin/nologin
landscape:x:113:120::/var/lib/landscape:/usr/sbin/nologin
fwupd-refresh:x:114:121:fwupd-refresh user,,,:/run/systemd:/usr/sbin/nologin
avahi:x:115:122:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/usr/sbin/nologin
saned:x:116:124::/var/lib/saned:/usr/sbin/nologin
colord:x:117:125:colord colour management daemon,,,:/var/lib/colord:/usr/sbin/nologin
postfix:x:118:127::/var/spool/postfix:/usr/sbin/nologin
id:x:1001:1001::/home/id:/bin/sh
test:x:4000:4000::/home/test:/bin/sh
root@ubuntu:/etc/default#
对应,对应用户的语法格式:
用户名:密码占位符:UID:基本组GID:用户描述信息:家目录:解释器程序
root:x:0:0:root:/root:/bin/bash
#每个字段含义解释:用户名:密码占位符:UID:基本组GID:用户描述信息:家目录:解释器程序
UID:0 超级用户
UID:1-499 系统伪用户,不能登录系统并且没有家目录
UID:500-65535 普通用户
root:x:0:0:root:/root:/bin/bash
root用户,密码占位符(x),UID(0),基本组Gid(0),用户描述信息(“root”),家目录(/root),解释器程序(/bin/bash)
用户密码信息文件/etc/shadow
root:$6$Jj2oWJVC$Q8MdYyNNzy1q1zXP8tfHAoqc8gLNvEOMAMn90zdMnGaNurZNTVTaLNDIdjLDmjcRMAIwuEJyqZKsOVY14.i2k1:19584:0:99999:7:::
daemon:*:18484:0:99999:7:::
bin:*:18484:0:99999:7:::
sys:*:18484:0:99999:7:::
sync:*:18484:0:99999:7:::
games:*:18484:0:99999:7:::
man:*:18484:0:99999:7:::
lp:*:18484:0:99999:7:::
mail:*:18484:0:99999:7:::
news:*:18484:0:99999:7:::
uucp:*:18484:0:99999:7:::
proxy:*:18484:0:99999:7:::
www-data:*:18484:0:99999:7:::
backup:*:18484:0:99999:7:::
list:*:18484:0:99999:7:::
irc:*:18484:0:99999:7:::
saned:*:19587:0:99999:7:::
colord:*:19587:0:99999:7:::
postfix:*:19587:0:99999:7:::
id:!:19688:0:99999:7:::
test:!:19688:0:99999:7:::
以冒号“:”为分界线其含义是:
daemon:*:18484:0:99999:7:::
第一段:用户名
第二段:加密密码。*:密码加密值:口令:字段存放的是加密后的用户口令,如果为空,则对应用户没有口令,登陆时不需要口令,*代表帐号被锁定,双!!表示这个密码已经过期
那么!代表什么含义呢?
在这个上下文中,!
在加密密码的位置表示该账户的密码被锁定。用户将无法使用密码登录系统。通常,这是为了防止该用户通过密码认证的方式登录系统。这可能是因为账户已经被管理员禁用,或者是一个仅用于运行服务的系统账户,不应该被用来进行交互式登录。
密码的值的前缀代表的含义:
$6$开头的,表明是用SHA-512加密的
root:$6$Jj2oWJVC$Q8MdYyNNzy1q1zXP8tfHAoqc8gLNvEOMAMn90zdMnGaNurZNTVTaLNDIdjLDmjcRMAIwuEJy
root用户有密码,且密码储存值采用SHA-512加密后,内容是“Jj2oWJVC$Q8MdYyNNzy1q1zXP8tfHAoqc8gLNvEOMAMn90zdMnGaNurZNTVTaLNDIdjLDmjcRMAIwuEJy”
$1$表明是用MD5加密的
$2$是用Blowfish加密的
$5$是用SHA-256加密的
第三段:上次密码更改日期:最后一次修改时间:从历史的某个时刻起,到用户最后一次修改口令时的天数。时间起点对不同的系统可能不一样
第四段:0:密码更改最小天数
第五段:99999:密码更改最大天数
第六段:密码警告天数:提示你用户改密码时间,7表示7天提示
第七段:密码不活动天数:超过不活动时间将冻结用户
第八段:帐户过期日期:帐号失效时间,为空
第九段:保留字段:(为空)
test账户还没有设置密码,不允许登录系统,因为为“!”表示该账户的密码被锁定,不允许通过test账号登录。
passwd命令修改用户密码
语法:
passwd [选项] 用户名
选项:
-S:查询用户密码的状态,也就是 /etc/shadow 文件中此用户密码的内容。仅 root 用户可用;
-l:暂时锁定用户,该选项会在 /etc/shadow 文件中指定用户的加密密码串前添加 "!",使密码失效。仅 root 用户可用;
-u:解锁用户,和 -l 选项相对应,也是只能 root 用户使用; --stdin:可以将通过管道符输出的数据作为用户的密码。主要在批量添加用户时使用;
-n 天数:设置该用户修改密码后,多长时间不能再次修改密码,也就是修改 /etc/shadow 文件中各行密码的第 4 个字段;
-x 天数:设置该用户的密码有效期,对应 /etc/shadow 文件中各行密码的第 5 个字段;
-w 天数:设置用户密码过期前的警告天数,对于 /etc/shadow 文件中各行密码的第 6 个字段;
-i 日期:设置用户密码失效日期,对应 /etc/shadow 文件中各行密码的第 7 个字段。
查看我们创建的test用户的密码情况
root@ubuntu:~# cat /etc/shadow | grep test
test:!:19688:0:99999:7:::
root@ubuntu:~#
root@ubuntu:~# passwd -S test
test L 11/27/2023 0 99999 7 -1
L:密码被锁定。
"-S"选项会显示出密码状态,这里的密码修改间隔时间、密码有效期、警告时间、密码宽限时间其实分别是 /etc/shadow 文件的第四、五、六、七个字段的内容。 当然,passwd 命令是可以通过命令选项修改这几个字段的值的,
设置test账户密码为test。输入密码以后,需要再次确认。
root@ubuntu:~# passwd test
New password:
Retype new password:
passwd: password updated successfully
root@ubuntu:~#
设置密码成功以后,我们再看看test的密码状态。
root@ubuntu:~# cat /etc/shadow | grep test
test:$6$o24/ASQuJAKeuREZ$C6uufWweE/SlvDK18.8Gz9WoMZ5u72Wljy/gZFOYNDxONQzGJyq5NDQbPEfBtPXDQ8cSOCvczyfvAlvBTatdY.:19689:0:99999:7:::
通过test -S test查看密码状态
root@ubuntu:~# passwd -S test
test P 11/28/2023 0 99999 7 -1
密码最近修改时间 11/28/2023, 距今密码最小更新天数为0,密码最大更改天数为9999。密码不失效(-1)。
设置密码最大60天有效,20天更改
root@ubuntu:~# passwd -x 60 -i 20 test
passwd: password expiry information changed.
root@ubuntu:~#
root@ubuntu:~#
root@ubuntu:~# passwd -S test
test P 11/28/2023 0 60 7 20
设置以后看到密码60天有效,密码20天失效。
我们创建了test账户,且设置了test密码,就可以使用test登录系统。root用户切换到普通用户不需要校验密码。
root@ubuntu:~# su test
$
$ su
Password:
可以看到登录成功。
root@ubuntu:/etc# cat subuid
lxd:100000:65536
root:100000:65536
ubuntu:165536:65536
id:231072:65536
test:296608:65536
/etc/subuid保存了uid信息。
/etc/subuid
文件是在支持用户命名空间(user namespaces)的Linux系统中使用的,它保存了子用户ID(subordinate user IDs)的信息。这些子用户ID用于为特定的用户分配一组额外的用户ID,这些用户ID可以在创建用户命名空间时使用,通常与容器技术(如Docker)结合使用以提供隔离和安全性。
每行的格式通常如下:
username:lower:count
username
是系统上的用户名。lower
是分配给该用户的第一个子用户ID。count
是从 lower
开始分配的用户ID数量。例如,如果 /etc/subuid
文件包含以下内容:
linda:100000:65536
这意味着用户 linda
被分配了从 100000
开始的 65536
个连续的用户ID,范围是 100000-165535
。这些ID可以在用户命名空间中作为用户ID使用,而不会与系统上的其他用户ID冲突。
在容器化环境中,这允许容器内的进程以不同的用户ID运行,而这些用户ID在宿主机上实际上是非特权的,从而增加了安全性。这是因为即使容器内的进程以 root 用户(UID 0)运行,它在宿主机上也对应一个非特权的子用户ID,因此它不会拥有宿主机上的 root 权限。
通过/etc/subgid查看GID信息
root@ubuntu:/etc# cat subgid
lxd:100000:65536
root:100000:65536
ubuntu:165536:65536
id:231072:65536
test:296608:65536
在Android开源项目(AOSP)中,默认情况下,root用户是没有密码的。在标准的Android系统中,出于安全考虑,普通应用无法获取root权限,而且大多数设备的生产商也会锁定bootloader,防止用户刷入自定义的、具有root访问权限的系统。
如果你正在开发或定制一个Android系统,并希望为root用户设置密码,你需要在系统底层进行操作,这通常涉及到修改系统的文件系统和安全策略。这不是一个普通用户应该或能够进行的操作,而是需要相当深入的操作系统知识和对安全风险的理解。以下是一些基本的指导步骤:
重新挂载文件系统为可写 - 你需要重新挂载系统分区为可写,以便修改系统文件。
adb root
adb remount
修改/etc/passwd
文件 - 这个文件包含了用户的密码信息。你需要给root用户设置一个密码。
adb shell
su
passwd root
在这个阶段,系统可能会要求你输入新的密码。
重新挂载文件系统为只读 - 修改完成后,为了安全起见,你应该将系统分区重新挂载为只读。
adb remount
更新SELinux策略 - 如果你的设备启用了SELinux,你可能还需要更新SELinux策略以允许这些更改。
确保init进程可以处理密码 - Android的启动过程可能并不支持带密码的root登录,你可能需要修改init进程或者相关的启动脚本来支持这个特性。
请注意,这些步骤可能会导致设备无法启动,或者你可能会失去对设备的访问。此外,这些更改可能会被系统更新覆盖,因此在实施任何更改之前,请确保你完全理解其后果,并且已经做好了完整的备份。
在大多数情况下,对于需要root访问的场景,推荐使用更安全的替代方法,例如使用ADB shell或者在开发者模式下运行应用,而不是直接设置root密码。如果你的目的是为了设备的安全性,那么最好的做法是保持系统的完整性和安全性,而不是引入可能的安全风险。