跳到主要内容

系统登录密码配置指南

本文档介绍如何为嵌入式 Linux 系统增加登录密码保护,包括 ADB 调试认证和串口控制台密码登录两个安全功能。

背景

在嵌入式设备开发和应用中,系统安全是一个重要的考虑因素。默认情况下,开发板通常开放了各种调试接口(如 ADB、串口控制台)以便于开发调试。但在产品化阶段,需要对这些接口进行访问控制,防止未授权访问。

本文档提供两种主要的访问控制方式:

  1. ADB 权限控制:限制 ADB 调试接口的访问,只有经过公私钥认证后才能进行 adb 通信
  2. 串口登录密码:为串口控制台添加登录认证,防止物理接口的未授权访问

根据实际需求,可以选择配置其中一种或两种都配置。


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 认证功能,执行 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命令配置密码

执行 passwd 命令后,会生成两个关键的密码文件:

shadow 文件

/etc/shadow 文件存储加密后的密码信息:

shadow文件内容

passwd 文件

/etc/passwd 文件存储用户账户信息:

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 源文件

第二步:复制到板级目录

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

复制到对应板级目录

第三步:修改 inittab 配置

编辑 inittab 文件,将控制台启动方式从直接进入 shell 改为登录认证:

修改前

/dev/console::respawn:-/bin/sh

修改后

/dev/console::respawn:-/bin/login

编辑inittab文件

说明

  • /bin/sh 表示启动 shell,无需认证即可进入控制台
  • /bin/login 表示启动登录程序,需要输入用户名和密码
  • respawn 表示进程退出后会自动重启,确保登录始终可用

5. 验证功能

重新编译系统并启动后,串口控制台会显示登录提示:

密码测试功能

默认情况下,需要输入:

  • 用户名:root
  • 密码:之前通过 passwd 命令设置的密码

输入正确的认证信息后,即可进入系统控制台。


配置建议

安全级别选择

根据应用场景选择合适的安全配置:

场景ADB 认证串口密码说明
开发调试阶段不启用不启用方便快速调试
内部测试阶段启用不启用保护调试接口,串口方便排错
产品量产阶段启用启用全面保护所有调试接口

最佳实践

  1. 密码管理

    • 避免使用简单密码(如 "123456", "admin")
    • 建议使用 8 位以上包含字母数字的密码
    • 定期更换密码
  2. 密钥管理

    • 保护私钥文件,不要泄露给他人
    • 限制公钥安装,只允许授权主机
    • 为不同设备使用不同的密钥对
  3. 生产环境

    • 配置完成后彻底移除调试接口访问权限
    • 或物理封堵调试接口(USB、串口)
    • 建立完整的安全审计机制

注意事项

  1. 密码遗忘处理

    • 如果忘记密码,需要重新编译系统并替换密码文件
    • 建议在安全位置备份密码文件
  2. ADB 密钥丢失

    • 如果密钥丢失,需要重新生成并重新授权
    • 密钥生成命令:adb keygen <路径>/adbkey
  3. 系统更新

    • 更新系统时注意不要覆盖密码文件和密钥配置
    • 使用版本管理跟踪安全配置变更