前言
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:::
進入系統測試
完成燒錄後,即可進到系統檢查新使用者及密碼是否可以登入
參考來源