前言
Linux 替 root 加上密码及新增其他的使用者,通常的作法是进到系统后,透过 useradd 及 passwd 等指令去建立使用者及密码。
但如果每片板子都要开机到系统,然后执行指令,这会是一件非常麻烦的事情。因此本篇文章提供一个解决的方案,让 Yocto 能在编译阶段就完成建立使用者及密码等动作。
Yocto 设定
为了将密码加入到 Yocto,这里会透过设定
conf/local.conf
的方式去完成
conf/local.conf
EXTRA_USERS_PARAMS
功能必须加上
INHERIT += " extrausers"
才可以使用
Linux 是使用 hash 对密码(明码)进行加密并以固定的格式
$id$salt$hashed
存在
/etc/shadow
内
密码格式会透过
$
去区隔 id、salt 及 hash 值
填入
conf/local.conf
时,需要加上跳脱字元
\
,避免编译过程中被当成特殊符号,下方的 检查结果 内,会有个错误范例
下方是修改 root 密码的示范
INHERIT += " extrausers"
EXTRA_USERS_PARAMS = "\
usermod -p '\$6\$FIumPDif04\$LdFmxWbmmV68cLSDqpryllQvMr6CkIF9DYudcd4AgfJpfZ1BA3Ls3nulh2kOXv/F3OboputiaxPi3WkTZ5j3M0' root; \
"
下方是新增使用者 user 的示范
INHERIT += " extrausers"
EXTRA_USERS_PARAMS = "\
useradd -p '\$6\$FIumPDif04\$LdFmxWbmmV68cLSDqpryllQvMr6CkIF9DYudcd4AgfJpfZ1BA3Ls3nulh2kOXv/F3OboputiaxPi3WkTZ5j3M0' user; \
"
在
conf/local.conf
内,可以使用
usermod
去修改使用者的密码,而
useradd
则是新增使用者及密码,范例如下:
# 修改 root 密码
usermod -p '$id$salt$hashed' root;
# 新增使用者 user 及密码
useradd -p '$id$salt$hashed' user;
下方会介绍如何产生
$id$salt$hashed
Linux 使用者密码
这边简单介绍一下密码格式的内容:
- id
- salt
- 是一个随机字串,每次产生都会不一样,会跟密码一起加密成 hash 值
- hashed
- 加密后的值
制作密码的 hash 值
$id$salt$hashed
可以利用
mkpasswd
指令去建立
这边范例的密码为 password
$ mkpasswd -m sha512crypt --stdin <<< "password"
如果用同样的密码多试几次会发现,每次的 hash 值都不相同,如下:
$ mkpasswd -m sha512crypt --stdin <<< "password"
$6$FIumPDif04$LdFmxWbmmV68cLSDqpryllQvMr6CkIF9DYudcd4AgfJpfZ1BA3Ls3nulh2kOXv/F3OboputiaxPi3WkTZ5j3M0
$ mkpasswd -m sha512crypt --stdin <<< "password"
$6$dtWhG8iWNH.TS$sGUl8aq.3RwamUIrhRYTGEK3SRLdztfpUn8OzyRtCIeJ.DHPcuIjQe6zmt2tiOcCNl/WabWqQFualHIEqUtFz.
这也是前面有提到的,hash 值是由 salt 及 密码一起加密而成,而 salt 是随机字串,每次都会不同。因此,想要固定 hash 值的话,可以用
--salt
去设定 salt
$ mkpasswd -m sha512crypt --salt FIumPDif04 --stdin <<< "password"
$6$FIumPDif04$LdFmxWbmmV68cLSDqpryllQvMr6CkIF9DYudcd4AgfJpfZ1BA3Ls3nulh2kOXv/F3OboputiaxPi3WkTZ5j3M0
执行编译
设定完成后,重新编译 core-image-minimal
bitbake core-image-minimal
此时,core-image-minimal 便会根据
conf/local.conf
的设定新增使用者 user 及其密码 password,请参考上方 conf/local.conf 的范例
useradd -p '$id$salt$hashed' user;
检查结果
以 i.MX8MP 为例,加入新使用者后,请检查下方路径的档案
tmp/work/imx8mp_lpddr4_evk-poky-linux/core-image-minimal/1.0-r0/rootfs/etc/shadow
可以看到 user 已经被加入 Yocto 的
/etc/shadow
了,其
$id$salt$hashed
与
mkpasswd
产生的也是相同的
root::15069:0:99999:7:::
daemon:*:15069:0:99999:7:::
bin:*:15069:0:99999:7:::
sys:*:15069:0:99999:7:::
sync:*:15069:0:99999:7:::
games:*:15069:0:99999:7:::
man:*:15069:0:99999:7:::
lp:*:15069:0:99999:7:::
mail:*:15069:0:99999:7:::
news:*:15069:0:99999:7:::
uucp:*:15069:0:99999:7:::
proxy:*:15069:0:99999:7:::
www-data:*:15069:0:99999:7:::
backup:*:15069:0:99999:7:::
list:*:15069:0:99999:7:::
irc:*:15069:0:99999:7:::
gnats:*:15069:0:99999:7:::
systemd-bus-proxy:!:15069:0:99999:7:::
systemd-timesync:!:15069:0:99999:7:::
systemd-resolve:!:15069:0:99999:7:::
systemd-network:!:15069:0:99999:7:::
messagebus:!:15069:0:99999:7:::
_apt:!:15069:0:99999:7:::
user:$6$FIumPDif04$LdFmxWbmmV68cLSDqpryllQvMr6CkIF9DYudcd4AgfJpfZ1BA3Ls3nulh2kOXv/F3OboputiaxPi3WkTZ5j3M0:15069:0:99999:7:::
nobody:*:15069:0:99999:7:::
错误范例
如果没有使用跳脱字元的话,会导致整个密码格式错误
user:/F3OboputiaxPi3WkTZ5j3M0:15069:0:99999:7:::
进入系统测试
完成烧录后,即可进到系统检查新使用者及密码是否可以登入
评论