Linux :从 openSSH 到 SSH2 的基于 SSH 密钥的身份验证设置
1153
2022-05-30
1 背景
当前Mindstudio及配套ADK需要从ADX切换到SSH,MindStudio需要通过SSH登录对应的AI-Host。对于C7x、MDC、DC环境,可以通过系统包管理器apt/yum等直接安装openSSH-server;而海思Soc Linux/Android环境是精简过的嵌入式环境,必须通过源码编译的方式进行安装。此处以CS形态为例。
2 Linux环境OpenSSH服务搭建
2.1 交叉编译
2.1.1 版本选择及源码准备
OpenSSH-:
https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-8.0p1.tar.gz
OpenSSH依赖2个开源库:zlib与OpenSSL
zlib 1.2.11: https://zlib.net/zlib1211.zip
OpenSSL 1.1.1g: https://www.openssl.org/source/openssl-1.1.1g.tar.gz
同样下载源码压缩包至本地。
2.1.2 交叉编译环境准备
获取发布包中的对应交叉编译器,CS形态使用的交叉编译器为aarch64-himix210-linux。交叉编译环境这里以x86_64的Ubuntu18.04为例。
1
tar xvf aarch64-himix210-linux.tgz
进入解压后的目录,并使用root用户权限执行安装脚本(可以参考readme指定其他安装路径):
1
cd aarch64-himix210-linux
2
sudo ./aarch64-himix210-linux.install
此时交叉编译器已被安装至/opt/hisi-linux/x86-arm路径下,所需的环境变量也已自动更新到/etc/profile中。执行以下命令应该能正常显示gcc版本:
1
source /etc/profile && aarch64-himix210-linux-gcc -v
2.1.3 交叉编译
解压zlib的源码压缩包,并进入解压后的目录。
1
tar xf zlib-1.2.11.tar.gz
2
cd zlib-1.2.11/
配置交叉编译器及安装路径:
1
CC=aarch64-himix210-linux-gcc ./configure --prefix=$HOME/install/zlib
编译及安装:
1
make -j
2
make install
解压openssl的源码压缩包,并进入解压后的目录。
1
tar xf openssl-1.1.1g.tar.gz
2
cd openssl-1.1.1g
配置编译选项、交叉编译器及安装路径:
1
./config no-asm shared --cross-compile-prefix=aarch64-himix210-linux- --prefix=$HOME/install/openssl
将生成的Makefile中的所有"-m64"修改为"-mabi=lp64":
编译及安装:
1
make -j # 注:make -j并行编译可能会失败,若失败可直接make
2
make install
解压openssh的源码压缩包,并进入:
1
tar xf openssh-8.0p1.tar.gz
2
cd openssh-8.0p1
配置:
1
./configure --host=aarch64-linux --with-libs --with-zlib=$HOME/install/zlib --with-ssl-dir=$HOME/install/openssl CC=aarch64-himix210-linux-gcc AR=aarch64-himix210-linux-ar --prefix=$HOME/install/openssh --exec-prefix=$HOME/install/openssh --disable-etc-default-login --disable-strip
编译及安装:
1
make -j
2
make install
解压openssh的源码压缩包,并进入:
1
tar xf openssh-8.0p1.tar.gz
2
cd openssh-8.0p1
配置:
1
./configure --host=aarch64-linux --with-libs --with-zlib=$HOME/install/zlib --with-ssl-dir=$HOME/install/openssl CC=aarch64-himix210-linux-gcc AR=aarch64-himix210-linux-ar --prefix=$HOME/install/openssh --exec-prefix=$HOME/install/openssh --disable-etc-default-login --disable-strip
编译及安装:
1
make -j
2
make install
install时若提示无权限创建/var/empty(privilege separation directory),则可以使用sudo创建后再使用chown改变owner。
再次执行make install,此时若提示ssh-keygen执行失败,这是由于arm架构的可执行文件不识别,可暂时忽略,因为所需的文件(sshd, sftp-server, ssh-keygen等)都已安装至目标路径。
2.2 部署
参考MindStudio文档中的海思Soc环境准备一节。在刚才的交叉编译服务器上安装NFS服务,将刚才的安装路径($HOME/install)开放出去。
使用root账号,通过telnet登录海思Soc环境,在海思Soc的板端挂载该远程路径。
切换至挂载目录,部署zlib和openssl相关产物:
1
cp zlib/lib/libz.so.1 /usr/lib
2
cp openssl/lib/libcrypto.so.1.1 /usr/lib
切换至OpenSSH安装路径,OpenSSH相关产物如下:
部署所需的可执行文件:
1
2
3
使用ssh-keygen生成秘钥对:
1
2
参考该链接创建sshd组。
在/etc/passwd中加上:
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
在/etc/group中加上:
sshd:x:74:
创建privilege separation directory:
1
拷贝config至/etc并修改:
1
修改点1:将拷贝后的文件中的
#PermitRootLogin prohibit-password
改为
PermitRootLogin yes
使得可以使用root账号的账号密码登录。
修改点2:在subsystem条目配置正确的sftp-server路径:
Subsystem sftp /usr/lib/sftp-server
修改完成后启动sshd,需指定config和key的路径:
1
2.3 验证
在其他主机上使用ssh远程登录海思Soc板端执行命令或使用sftp访问文件:
3 Android环境OpenSSH服务搭建(V900版本/96CV300版本)
3.1 下载V900/96CV300源码
3.2 修改device.mk文件
v900文件路径:device/huanglong/shaolingun/device.mk
96CV300文件路径:device/huanglong/wudangstick/device.mk
在device.mk中增加如下编译选项:
# Openssh
PRODUCT_PACKAGES += \
scp \
sftp \
ssh \
sshd \
sshd_config \
ssh-keygen \
start-ssh
3.3 修改externel/openssh下的Android.mk文件
在sshd模块的编译选项中,添加:
LOCAL_CFLAGS += -DSSHDIR=\"/data/run/ssh\"
3.4 编译andorid源码,重新烧写镜像,
v900编译指令
a) source build/envsetup.sh
b) lunch shaolingun_SEC-eng
c) ./device/huanglong/build/build.sh
2. 96cv300编译指令
a) source build/envsetup.sh
b) lunch wudangstick_SEC-eng
c) ./device/huanglong/build/build.sh
3.5 创建目录结构,以下操作都在板端进行
mkdir -p /data/ssh/empty
chmod 700 /data/ssh
chmod 700 /data/ssh/empty
其中, /data/ssh用来存放密钥文件和sshd配置文件
3.6 生成配置文件
cat /system/etc/ssh/sshd_config | \
sed 's/#PermitRootLogin yes$/PermitRootLogin without-password/' | \
sed 's/#RSAAuthentication yes/RSAAuthentication yes/' | \
sed 's/#PubkeyAuthentication yes/PubkeyAuthentication yes/' | \
sed 's/PasswordAuthentication no/#PasswordAuthentication no/' | \
sed 's/#PermitEmptyPasswords no/PermitEmptyPasswords yes/' | \
sed 's/#ChallengeResponseAuthentication yes/ChallengeResponseAuthentication yes/' | \
sed 's/#UsePrivilegeSeparation yes/UsePrivilegeSeparation no/' | \
sed 's;/usr/libexec/sftp-server;internal-sftp;' > \
/data/ssh/sshd_config
chmod 600 /data/ssh/sshd_config
这里需要说明的是我们需要配置为root使用, 同时又不需要密码.另外, 需要注意配置文件中指定了AuthorizedKeysFile为/data/ssh/authorized_keys
3.7 生成秘钥
在Windows/Linux上通过下面的命令来生成密钥
ssh-keygen -t rsa -C "your_email_address"
上面的命令会在主目录下生成.ssh目录, 目录包含id_rsa(私钥)和id_rsa.pub(公钥)两个文件
然后通过adb等命令将id_rsa.pub上传至Android中(!!!文件要对应于AuthorizedKeysFile!!!)
adb push id_rsa.pub /data/ssh/authorized_keys
chmod 600 /data/ssh/authorized_keys
chown root:root /data/ssh/authorized_keys
cd /data/ssh/
ssh-keygen -t rsa -f ssh_host_rsa_key
ssh-keygen -t dsa -f ssh_host_dsa_key
这里passphrase默认为空
3.8 启动
mkdir -p /data/local/userinit.d
cat /system/bin/start-ssh | \
sed 's;/system/etc/ssh/sshd_config;/data/ssh/sshd_config;' > \
/data/local/userinit.d/99sshd
chmod 755 /data/local/userinit.d/99sshd
通过上面的命令单独生成一个启动脚本,后就可以通过执行下面的脚本来启动sshd
/data/local/userinit.d/99sshd
实际操作过程中如果出现问题也可以通过下面的命令以调试的方式来启动sshd
/system/bin/sshd -f /data/ssh/sshd_config -D -ddd
执行的时候第一次会报/data/run/ssh/empty不存在的问题,创建该文件夹并修改权限即可。
mkdir -p /data/run/ssh/empty
chmod 600 /data/run/ssh/empty
chown root:root /data/run/ssh/empty
备注:/system/bin/sshd -f /data/ssh/sshd_config -D -ddd 这个是调试命令,client端连接上后就断开。如果想服务持续运行,把后面的 -D -ddd删除,或者直接运行启动脚本
Android Linux
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。