导航
导航
文章目录
  1. 一、关于 OpenSSH
  2. 二、编译前的准备工作
    1. 2.1、查看 OpenSSH 版本
    2. 2.2、安装 OpenSSL 及编译环境
    3. 2.3、备份 OpenSSH 旧配置文件
    4. 2.4、卸载旧版 OpenSSH
  3. 三、编译安装 OpenSSH
    1. 3.1、关于特权分离
    2. 3.2、编译安装 OpenSSH
    3. 3.3、开机自启动 sshd
  4. 四、 OpenSSH 安全配置
    1. 4.1、查看 OpenSSH 配置文件
    2. 4.2、生成服务器密钥对
    3. 4.4、编辑 sshd_config 配置文件
  5. 五、基于密钥的认证
    1. 5.1、在本地生成密钥对
    2. 5.2、上传公钥至服务器
    3. 5.3、建立安全连接
  6. 六、SSH 帐号管理

Ubuntu 从源码编译安装 OpenSSH

简单的说 OpenSSH 是一组安全远程的连接工具,主要包括了几个部份:ssh、sshd、scp、sftp、ssh-keygen、ssh-agent、ssh-add。OpenSSH 安装配置比较复杂,难点在配置,特别是在 VPS 中,配置不当就完全无法链接 VPS 了。

一、关于 OpenSSH

OpenSSH 是一组用于安全地访问远程计算机的连接工具。它可以作为 rlogin、 rsh rcp 以及 telnet 的直接替代品使用。更进一步, 其他任何 TCP/IP 连接都可以通过 SSH 安全地进行隧道/转发。 OpenSSH 对所有的传输进行加密, 从而有效地阻止了窃听、 连接劫持,以及其他网络级的攻击。(关于 SSLSSH

  • ssh(SSH 客户端,用于登录建立连接,是 rlogin 与 Telnet的安全替代方案)
  • sshd (SSH 服务端,典型的独立守护进程)
  • scp、sftp (文件安全传输工具,rcp、ftp 安全的替代方案)
  • ssh-keygen (用于产生 RSA 或 DSA 密钥)
  • ssh-agent、ssh-add(帮助用户不需要每次都要输入金钥密码的工具)

二、编译前的准备工作

2.1、查看 OpenSSH 版本

部分 Linux 系统已默认安装了 OpenSSH,像 Ubuntu Server 10.10 就已安装了 OpenSSH_5.5p1

ssh -v

2.2、安装 OpenSSL 及编译环境

必须先安装依赖 OpenSSL,具体见《Linux 从源码编译安装 OpenSSL》

2.3、备份 OpenSSH 旧配置文件

cp /etc/init.d/ssh /etc/init.d/ssh.old
cp -r /etc/ssh /etc/ssh.old
cp ~/.ssh/authorized_keys ~/.ssh/authorized_keys.old

2.4、卸载旧版 OpenSSH

apt-get purge openssh-client openssh-server

三、编译安装 OpenSSH

3.1、关于特权分离

所谓特权分离(Privilege Separation)实际上是一种 OpenSSH 的安全机制,该特性默认开启,可通过配置文件中的 UsePrivilegeSeparation 指令开启或关闭。

mkdir -p  /var/empty #设置一个空目录
chown 0:0 /var/empty #所有者和组,0代表"root"
chmod 000 /var/empty #目录权限设置为"000"
groupadd sshd #建立sshd组
useradd -g sshd -c 'sshd privsep' -d /var/empty -s /bin/false sshd #用于特权分离的非特权用户"sshd"

3.2、编译安装 OpenSSH

详细编译选项见 《OpenSSH-4.7p1 安装指南》

wget http://ftp.aso.ee/pub/OpenBSD/OpenSSH/portable/openssh-5.6p1.tar.gz
tar -zxf openssh-5.6p1.tar.gz
cd openssh-5.6p1/
./configure --prefix=/usr/local --sysconfdir=/usr/local/ssh --with-ssl-dir=/usr/local/ssl --with-privsep-path=/var/empty --with-privsep-user=sshd  --with-zlib=/usr/local/lib --with-ssl-engine --with-md5-passwords --disable-etc-default-login
make && make install

–prefix 安装目录
–sysconfdir 配置文件目录
–with-ssl-dir 指定 OpenSSL 的安装目录
–with-privsep-path 非特权用户的chroot目录
–with-privsep-user=sshd 指定非特权用户为sshd
–with-zlib 指定zlib库的安装目录
–with-md5-passwords 支持读取经过MD5加密的口令
–with-ssl-engine 启用OpenSSL的ENGINE支持

3.3、开机自启动 sshd

mv /etc/init.d/ssh.old /etc/init.d/sshd #使用原来的启动脚本
vim /etc/init.d/sshd #编辑,然后替换路径。
update-rc.d mysql defaults
#将原路径"/usr/sbin替换为"/usr/local/sibn"
:%s/usr\/sbin/usr\/local\/sbin/g
#将原路径"/etc/ssh替换为"/usr/local/ssh"
:%s/etc\/ssh/usr\/local\/ssh/g

四、 OpenSSH 安全配置

4.1、查看 OpenSSH 配置文件

cd /usr/local/ssh

moduli #ssh服务器的Diffie-Hellman密钥文件
ssh_config #ssh客户端配置文件
sshd_config #ssh服务器配置文件
ssh_host_dsa_key #ssh服务器dsa算法私钥
ssh_host_dsa_key.pub #ssh服务器dsa算法公钥
ssh_host_rsa_key #ssh服务器rsa算法私钥
ssh_host_rsa_key.pub #ssh服务器rsa算法公钥

4.2、生成服务器密钥对

默认 OpenSSH 安装完毕后就自动生成了,如果丢失可通过下面命令重新生成。

ssh-keygen -t rsa1 -f /etc/ssh/ssh_host_key -N '' #适用于ssh-1版
ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ''
ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -N ''

chmod 600 /etc/ssh/ssh_host_*
chmod 644 /etc/ssh/ssh_host_*.pub

特别注意:

  • 系统密钥对是不能设置密码的, -N 后面 是两个 单引号 !表示密码串为空。
  • 注意公钥和私钥的权限是不同的。

4.4、编辑 sshd_config 配置文件

事实上该配置文件不需要修改也能正常启动 sshd ,下面是该配置文件的简要中文解释。详细解释见《sshd_config 中文手册》

Port 22 #默认端口  
ListenAddress #监听的网络地址  
AddressFamily #监听的IP地址类型  
Protocol 2 #SSH协议的版本号,默认为1  

#主机私钥文件的位置
HostKey /usr/local/ssh/ssh_host_rsa_key
HostKey /usr/local/ssh/ssh_host_dsa_key

在SSH-1协议下,以固定周期生成服务器密钥及大小。
KeyRegenerationInterval 1h
ServerKeyBits 1024

SyslogFacility AUTH #指定日志子系统(facility)
LogLevel INFO #指定日志详细程度

LoginGraceTime 2m #2分种内必须认证成功,0 无限制。
PermitRootLogin yes #是否允许 root 登录
StrictModes yes #连接请求前对相关文件权限检查。
MaxAuthTries 6 #指定每个连接最大允许的认证次数
MaxSessions 10 #最大允许保持多少个未认证的连接
RSAAuthentication yes #否允许使用纯 RSA 公钥认证,仅用于SSH-1。
PubkeyAuthentication yes #是否允许公钥认证,仅用于SSH-2。

#用来登录的 RSA/DSA 公钥存放位置,
AuthorizedKeysFile     .ssh/authorized_keys

RhostsRSAAuthentication no  #是否使用强可信主机认证,仅用于SSH-1。
HostbasedAuthentication no #同上,仅用于SSH-2。
是否在 RhostsRSAAuthentication 或 HostbasedAuthentication 过程中忽略用户的 ~/.ssh/known_hosts 文件
IgnoreUserKnownHosts no
是否在 RhostsRSAAuthentication 或 HostbasedAuthentication 过程中忽略 .rhosts 和 .shosts 文件。
IgnoreRhosts yes

PasswordAuthentication yes #是否使用密码认证
PermitEmptyPasswords no #是否允许密码为空的用户远程登录
ChallengeResponseAuthentication yes #是否允许 challenge-response 认证

Kerberos认证相关设置,可忽略
#KerberosAuthentication no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
#KerberosGetAFSToken no

是否允许使用基于 GSSAPI 的用户认证。
#GSSAPIAuthentication no
是否在用户退出登录后自动销毁用户凭证缓存
#GSSAPICleanupCredentials yes

AllowAgentForwarding yes #是否允许端口转发
AllowTcpForwarding yes #是否允许TCP端口转发
GatewayPorts no #是否允许远程主机连接本地的转发端口。

X11Forwarding no #是否允许进行 X11 转发。
X11DisplayOffset 10 #指定X11 转发的第一个可用的显示区数字。
X11UseLocalhost yes #是否将X11转发服务器绑定到本地loopback地址

PrintMotd yes #每次登录时打印 /etc/motd 文件内容
PrintLastLog yes #每次登录时打印最后一位用户的登录时间
TCPKeepAlive yes #是否向客户端发送 TCP keepalive 消息。

UseLogin no #是否在交互式会话的登录过程中使用 login 
UsePrivilegeSeparation yes #创建非特权子进程来进行权限分离。

指定是否允许处理 ~/.ssh/environment 以及 ~/.ssh/authorized_keys 中的 environment= 选项。
#PermitUserEnvironment no

是否对通信数据进行加密,还是延迟到认证成功之后再对通信数据加密。
#Compression delayed

#ClientAliveInterval 0 #超时提醒,0 表示不发送"alive"消息提醒。
#ClientAliveCountMax 3 #允许发送多少个"alive"消息。默认值是 3 。

五、基于密钥的认证

5.1、在本地生成密钥对

ssh-keygen 默认使用rsa算法生成密钥,如果要使用dsa算法,则需要使用-t 指定比如($ ssh-keygen -t dsa)

cd ~/.ssh/ #进入.ssh目录
ssh-keygen -N '' #生成无密码的密钥对,然后会提示输入密钥名称

5.2、上传公钥至服务器

通过scp将公钥传复制到远程服务器.ssh目录下,并改名为authorized_keys

scp wangyan.pub wangyan@wangyan.org:.ssh/authorized_keys

5.3、建立安全连接

如果本地.ssh目录下的私钥改名,那么链接失败或改为密码认证。
如果putty作为客户端,那么这个id_rsa需要经过PUTTYGEN.EXE转换一次以后才能使用

ssh wangyan@wangyan.org
sftp wangyan@wangyan.org
scp wangyan@wangyan.org
......

六、SSH 帐号管理

passwd #修改当前用户密码
groupadd SSH #添加组
useradd -g SSH -s /bin/'bash' -d /home/user1 user1 #添加用户
passwd user1 #为用户user1创建密码
userdel user1 #删除用户user1
groupdel SSH #删除组SSH
停用帐号,VIM编辑密码文件,在用户名后添加 ":*" 。
 vim /etc/shadow 
service sshd restart # 重启sshd
ps -aux | grep sshd #查看是否运行成功
支持一下
扫一扫,支持一下