系统登录密码配置指南
本文档介绍如何为嵌入式 Linux 系统增加登录密码保护,包括 ADB 调试认证和串口控制台密码登录两个安全功能。
背景
在嵌入式设备开发和应用中,系统安全是一个重要的考虑因素。默认情况下,开发板通常开放了各种调试接口(如 ADB、串口控制台)以便于开发调试。但在产品化阶段,需要对这些接口进行访问控制,防止未授权访问。
本文档提供两种主要的访问控制方式:
- ADB 权限控制:限制 ADB 调试接口的访问,只有经过公私钥认证后才能进行 adb 通信
- 串口登录密码:为串口控制台添加登录认证,防止物理接口的未授权访问
根据实际需求,可以选择配置其中一种或两种都配置。
ADB 权限控制
功能说明
ADB 权限控制功能通过公私钥认证机制限制 ADB 调试接口的访问。只有持有正确私钥的主机才能与设备进行 ADB 通信,有效防止未授权的调试访问。
适用场景:
- 设备需要开放 USB 调试接口但需要限制访问权限
- 产品量产阶段需要保护调试接口
- 多设备管理时需要区分授权主机
配置步骤
1. 启用 ADB 认证功能
通过 make menuconfig 配置系统,启用 ADB 认证服务:
Allwinner --->
USB --->
<*> adb................................................... adb for Tina Linux
<*> adbd_auth_service........................ adb auth service for Tina Linux

说明:启用这两个选项后,系统开机时自动启动 ADB 认证功能,执行 adb 命令时会进行公私钥校验。
2. 公钥管理
公钥安装路径
设备端公钥默认安装在 /mnt/UDISK/adb_keys 目录下。
公钥安装策略
默认情况下,系统允许安装所有公钥。如果需要限制公钥安装,可以修改认证服务源码文件(位于平台相关目录下的 adbd 认证服务中),取消公钥检测函数的注释,然后在检测函数中实现自定义的公钥验证逻辑:
/* 取消下面注释以启用公钥检测 */
/* aw_adbd_install_pubkey_detector(publickey_detector); */
/* 在检测函数中判断是否允许安装该公钥 */
int publickey_detector(const char *pubkey) {
// 返回 false 则拒绝安装该公钥
// 返回 true 则允许安装
}
重要:如果
/mnt/UDISK/adb_keys目录下没有对应的公钥,且系统配置不允许安装新公钥,ADB 功能将无法使用。
3. 密钥文件位置
ADB 使用公私钥对进行认证,密钥文件的位置因操作系统而异:
Windows 系统
%USERPROFILE%\.android\adbkey // 私钥文件
%USERPROFILE%\.android\adbkey.pub // 公钥文件
Ubuntu/Linux 系统
用户目录/.android/adbkey // 私钥文件
用户目录/.android/adbkey.pub // 公钥文件
说明:
- 私钥保存在开发主机上,用于发起 ADB 连接时的身份认证
- 公钥需要安装到设备端,用于验证连接请求的合法性
- 首次连接时,如果设备端没有对应公钥,会提示是否授权该主机
串口控制台密码登录
除了 ADB 权限控制,还需要对串口控制台进行保护。串口是物理接口,直接暴露在设备外部,如果缺乏保护措施,任何人都可以通过串口访问系统控制台。
功能说明
串口控制台密码登录功能为串口终端添加登录认证,用户必须输入正确的用户名和密码才能进入系统控制台。
适用场景:
- 设备需要暴露串口调试接口但需要限制访问
- 产品量产阶段需要保护物理调试接口
- 防止通过串口进行的未授权操作
配置步骤
1. 启用登录功能
通过 make menuconfig 配置 Busybox,启用 login 登录功能:
Base system →
<*> busybox ...
[*] Customize busybox option
Login/Password Management Utilities →
[*] login
说明:login 功能启用后,系统将支持用户登录认证。
2. 生成密码文件
通过 make menuconfig 配置 Busybox,启用 passwd 密码管理工具:
Base system →
<*> busybox ...
[*] Customize busybox option
Login/Password Management Utilities →
[*] passwd
提示:passwd 工具仅在生成密码文件时需要,生成完毕后可以取消勾选以减少系统占用。
启动系统后,使用 passwd 命令设置密码:
执行 passwd 命令后,会生成两个关键的密码文件:
shadow 文件
/etc/shadow 文件存储加密后的密码信息:
passwd 文件
/etc/passwd 文件存储用户账户信息:
重要提示:密码文件生成后,必须在编译时集成到系统中才能生效。直接在运行中的系统上设置密码仅在当前会话有效,重启后会丢失。
3. 集成密码文件到系统
将生成的 /etc/shadow 和 /etc/passwd 文件拷贝到 SDK 中,放置到对应板级的配置目录:
对应板级目录/busybox-init-base-files/etc/
例如,对于某板级配置,放置路径如下:
4. 配置启动脚本
修改 inittab 文件,将串口控制台的默认启动方式从直接进入 shell 改为需要登录认证。
第一步:获取 inittab 配置文件
首先参考默认的 inittab 配置文件,通常位于系统基础配置包目录下的 busybox-init-base-files/files/etc/inittab:

第二步:复制到板级目录
将 inittab 文件复制到对应板级的配置目录 busybox-init-base-files/etc/ 下:

第三步:修改 inittab 配置
编辑 inittab 文件,将控制台启动方式从直接进入 shell 改为登录认证:
修改前:
/dev/console::respawn:-/bin/sh
修改后:
/dev/console::respawn:-/bin/login

说明:
/bin/sh表示启动 shell,无需认证即可进入控制台/bin/login表示启动登录程序,需要输入用户名和密码respawn表示进程退出后会自动重启,确保登录始终可用
5. 验证功能
重新编译系统并启动后,串口控制台会显示登录提示:

默认情况下,需要输入:
- 用户名:root
- 密码:之前通过 passwd 命令设置的密码
输入正确的认证信息后,即可进入系统控制台。
配置建议
安全级别选择
根据应用场景选择合适的安全配置:
| 场景 | ADB 认证 | 串口密码 | 说明 |
|---|---|---|---|
| 开发调试阶段 | 不启用 | 不启用 | 方便快速调试 |
| 内部测试阶段 | 启用 | 不启用 | 保护调试接口,串口方便排错 |
| 产品量产阶段 | 启用 | 启用 | 全面保护所有调试接口 |
最佳实践
-
密码管理:
- 避免使用简单密码(如 "123456", "admin")
- 建议使用 8 位以上包含字母数字的密码
- 定期更换密码
-
密钥管理:
- 保护私钥文件,不要泄露给他人
- 限制公钥安装,只允许授权主机
- 为不同设备使用不同的密钥对
-
生产环境:
- 配置完成后彻底移除调试接口访问权限
- 或物理封堵调试接口(USB、串口)
- 建立完整的安全审计机制
注意事项
-
密码遗忘处理:
- 如果忘记密码,需要重新编译系统并替换密码文件
- 建议在安全位置备份密码文件
-
ADB 密钥丢失:
- 如果密钥丢失,需要重新生成并重新授权
- 密钥生成命令:
adb keygen <路径>/adbkey
-
系统更新:
- 更新系统时注意不要覆盖密码文件和密钥配置
- 使用版本管理跟踪安全配置变更