一、介绍
OpenSSH
是一种安全的Shell
(SSH
)协议的实现,它允许远程访问和管理计算机系统和网络设备。OpenSSH
是一款免费、开源的软件,它包含了SSH
协议的所有功能,比如加密的远程登录、文件传输和端口转发等功能。
OpenSSH
由一个客户端(ssh
)和一个服务器端(sshd
)组成。客户端可以用于通过网络连接到远程计算机并执行命令,也可以用于文件传输和隧道转发等任务。服务器端则可以用于监听网络连接并提供远程访问服务。
OpenSSH
支持多种身份验证方式,包括公钥身份验证、密码身份验证和Kerberos
身份验证等,可以保证数据传输的完整性、机密性和认证性。此外,OpenSSH
还提供了许多安全性选项,如限制访问、限制并发会话、限制端口等。
OpenSSH
是一个广泛使用的工具,常用于Linux
和其他UNIX
系统上的远程访问和文件传输任务。它提供了一种安全和加密的方式来访问远程计算机和传输数据,从而保护用户的隐私和机密性。
OpenSSH
最初是由OpenBSD
项目开发的,但现在已经成为Linux
和其他UNIX
操作系统中广泛使用的标准SSH
实现。许多Linux
发行版和UNIX
操作系统默认安装了OpenSSH
。
二、套件
OpenSSH
是一款安全的远程登录和文件传输软件,其具有完整的套件:
scp
:轻量级的文件传输的工具,用于在本地主机和远程主机之间安全地进行文件传输;sftp
:功能强大的文件传输工具,提供交互式的文件传输,文件及目录管理;ssh
:提供在网络上远程登录、远程文件传输、远程命令执行、安全传输数据的功能;ssh-add
:用于将私钥添加到SSH
身份验证代理的命令行工具,向ssh-agent
添加私钥,以便进行身份验证和加密;ssh-agent
:管理私钥,以便在连接远程服务器时进行身份验证并安全地连接到远程服务器;ssh-keygen
:用于生成、管理和认证SSH
密钥对的命令行工具;ssh-keyscan
:用于检索和管理SSH
服务器的公钥的命令行实用程序;sftp-server
:是OpenSSH
的关键组件,它提供了一种安全可靠的通过网络传输文件的方式;sshd
:SSH
守护进程,通过加密技术来保护传输的数据,同时也提供了身份验证机制,以防止未经授权的访问;ssh-keysign
:工具程序,它被用于验证用户的身份,并生成可信任的证书来进行身份验证;ssh-pkcs11-helper
:辅助工具程序,用于通过PKCS#11
接口来管理加密设备的工具程序。它充当了SSH
客户端和加密设备之间的中间人,提供了与加密设备的通信和管理功能;ssh-sk-helper
:辅助工具程序,用于通过FIDO2
安全密钥来进行身份验证。FIDO2
安全密钥是一种硬件安全设备,可以用于存储加密密钥和进行身份验证,是一种更安全和方便的身份验证方式。
以上套件组成了 OpenSSH
的核心功能,可以实现远程登录、文件传输、密钥管理和安全连接等多种功能。
三、获取
四、构建
- 依赖项
- 安装依赖;
localhost@linux:~$ sudo apt install autoconf make
- 加密算法支持:___ Library : OpenSSL
- 传输压缩支持:___ Library : Zlib
- 创建安装目录,解压源码包,并进入目录进行配置
localhost@linux:~$ mkdir ~/openssh
localhost@linux:~$ tar zxvf openssh-x.y.tar.gz -C ~
localhost@linux:~$ cd openssh-x.y
localhost@linux:~/openssh-x.y$ ./configure --host=arm-none-linux-gnueabi --prefix=${HOME}/openssh --with-4in6 --with-libs --with-zlib=${HOME}/zlib --with-ssl-dir=${HOME}/openssl --with-ssl-engine --disable-etc-default-login --with-default-path=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin --exec-prefix=/usr/local --sysconfdir=/usr/local/etc --mandir=/usr/local/share/man
- 指定对应的平台工具
localhost@linux:~/openssh-x.y$ sed -i 's/STRIP_OPT=-s/STRIP_OPT=-s --strip-program=arm-none-linux-gnueabi-strip/g' Makefile
- 指定安装位置
localhost@linux:~/openssh-x.y$ sed -i 's/DESTDIR=/DESTDIR=${HOME}\/openssh/g' Makefile
- 编译并安装
localhost@linux:~/openssh-x.y$ make
localhost@linux:~/openssh-x.y$ make install-files install-sysconf host-key
五、查看
- 检查生成的程序是否是对应平台所需要的
localhost@linux:~/openssh$ file usr/local/bin/ssh
usr/local/bin/ssh: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 3.2.0, stripped
六、启用
- 打包程序依赖文件,以备上传至开发板进行环境搭建
localhost@linux:~/openssh$ cp ~/zlib/lib/* lib/ -r
localhost@linux:~/openssh$ cp ~/openssl/lib/* lib/ -r
localhost@linux:~/openssh$ cp ~/openssl/bin/* bin/ -r
localhost@linux:~/openssh$ tar zcvf openssh.tar.gz *
- 解压至开发板赋予程序权限
root@arm:~# tar zxvf openssh.tar.gz -C /
root@arm:~# chmod +x /bin/* /usr/local/bin/* /usr/local/sbin/*
- 添加环境变量并使其生效
root@arm:~# echo "export PATH=$PATH:/usr/local/bin:/usr/local/sbin" >> /etc/profile && source /etc/profile
- 添加
sshd
用户并设置服务自启动
root@arm:~# echo "sshd:x:109:65534::/run/sshd:/usr/sbin/nologin" >> /etc/passwd
root@arm:~# echo "/usr/local/sbin/sshd" >> /etc/init.d/rcS
- 设置用户密码
root@arm:~# passwd sshd
root@arm:~# passwd root
- 生成
SSH
所需的所有主机密钥
root@arm:~# ssh-keygen -A && ssh-keygen -t rsa && ssh-keygen -t dsa && ssh-keygen -t ed25519 && ssh-keygen -t ecdsa
- 将远程主机的公钥放置在本地的授权文件
authorized_keys
中
# 远程主机
localhost@linux:~$ cat ~/.ssh/id_ecdsa.pub
localhost@linux:~$ cat ~/.ssh/id_ed25519.pub
localhost@linux:~$ cat ~/.ssh/id_rsa.pub
localhost@linux:~$ cat ~/.ssh/id_dsa.pub
# 本地主机
root@arm:~# touch ~/.ssh/authorized_keys && cat >> ~/.ssh/authorized_keys << EOF
#!/bin/sh
# 设定监听协议的版本并开启监听端口
echo "Protocol 2" >> /usr/local/etc/sshd_config
sed -i 's/#Port 22/Port 22/g' /usr/local/etc/sshd_config
sed -i 's/#ListenAddress ::/ListenAddress ::/g' /usr/local/etc/sshd_config
sed -i 's/#ListenAddress 0.0.0.0/ListenAddress 0.0.0.0/g' /usr/local/etc/sshd_config
# 设置目录和文件权限
chown root:root /var/empty -R
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys ~/.ssh/id_dsa ~/.ssh/id_ecdsa ~/.ssh/id_ed25519 ~/.ssh/id_rsa
chmod 600 /usr/local/etc/ssh_host_ecdsa_key /usr/local/etc/ssh_host_ed25519_key /usr/local/etc/ssh_host_rsa_key
# 指定主机私钥文件存放位置
sed -i 's/#HostKey \/usr\/local\/etc\/ssh_host_rsa_key/HostKey \/usr\/local\/etc\/ssh_host_rsa_key/g' /usr/local/etc/sshd_config
sed -i 's/#HostKey \/usr\/local\/etc\/ssh_host_ecdsa_key/HostKey \/usr\/local\/etc\/ssh_host_ecdsa_key/g' /usr/local/etc/sshd_config
sed -i 's/#HostKey \/usr\/local\/etc\/ssh_host_ed25519_key/HostKey \/usr\/local\/etc\/ssh_host_ed25519_key/g' /usr/local/etc/sshd_config
# 启用公钥认证(启用密码认证时,请把当中属性注释)
sed -i 's/#PubkeyAuthentication yes/PubkeyAuthentication yes/g' /usr/local/etc/sshd_config
# 设置允许root用户进行远程登陆
echo "PermitRootLogin yes" >> /usr/local/etc/sshd_config
七、集锦
- 错误:当前提示无法创建常规文件
/usr/local/bin/ssh
:权限被拒绝
localhost@linux:~/openssh-x.y$ make install
/usr/bin/install: cannot create regular file '/usr/local/bin/ssh': Permission denied
make: *** [Makefile:395: install-files] Error 1
这是因为我们安装的目标位置是在根目录下的,如果是普通操作则会没有权限进行创建文件。
- 解决:我们重新指定有权限的位置进行操作。
localhost@linux:~/openssh-x.y$ sed -i 's/DESTDIR=/DESTDIR=${HOME}\/openssh/g' Makefile
- 错误
strip: Unable to recognise the format of the input file `/usr/local/bin/ssh'
/usr/bin/install: strip process terminated abnormally
make: *** [Makefile:395: install-files] Error 1`
通过查看/usr/bin/install --help
,得知:
localhost@linux:~/openssh-x.y$ /usr/bin/install --help
-s, --strip strip symbol tables
--strip-program=PROGRAM program used to strip binaries
从这里我们可以得知,当前所需工具和正在使用版本不一致导致问题出现,
- 解决:
So
,调整参数指定工具
localhost@linux:~/openssh-x.y$ sed -i 's/STRIP_OPT=-s/STRIP_OPT=-s --strip-program=arm-none-linux-gnueabi-strip/g' Makefile
- 错误:提示执行文件格式错误
localhost@linux:~/openssh-x.y$ make install
/usr/bin/bash: ${HOME}/openssh2arm/usr/local/sbin/sshd: cannot execute binary file: Exec format error
make: [Makefile:385: check-config] Error 126 (ignored)
查看Makefile
我们得知
install: $(CONFIGFILES) $(MANPAGES) $(TARGETS) install-files install-sysconf host-key check-config
可以看得出来,这里安装完毕之后还会检查配置,而此次我们使用的交叉编译工具链进行测试配置平台的处理器与开发板的不一致,内核匹配不了CPU
,两者编译环境不同而导致如此。
- 解决:去掉检查配置
localhost@linux:~/openssh-x.y$ make install-files install-sysconf host-key
- 错误:用户和用户组权限不对导致服务启动不成功
root@arm:~# /usr/local/sbin/sshd
/var/empty must be owned by root and not group or world-writable.
- 解决,将目录设置成 root 用户和 root 用户组
root@arm:~# chown root:root /var/empty -R