首先声明,这里的Password并非是指生成的SSH Key上的那个密码,那个应该叫Passphrase,即密码短语,是绑定在SSH Key上的一层密码,和服务器的Password是没有关系的,Passphrase的创建,修改和删除都只需用户在客户端软件上完成就可以了。
今天,收到了一封上级发来的邮件,希望把服务器登陆从现在的SSH Key验证方式提升为SSH Key和Password两级验证方式,也就是说,一般情况下,我们设置的Password和SSH Key是“或”关系,现在需要设置为“与”关系。之前为了提升服务器的安全性,我们禁用了所有服务器的Password验证,让服务器仅支持SSH Key。
具体方法可以参考这篇文章:http://www./LINUXjishu/2692.html
但现在接到了这样的要求,上级的考虑肯定是出于管理的角度,而我们就需要验证该方案的可行性,如果不行的话,可以通过哪些其它的方式来实现其目的。
经过了一阵Google之后,我所找到的资料全是免密码登陆的,这就是我们目前的方式。
有一些朋友说,你们都在密钥上加上密码短语不就达到目的了?但是,在管理上,我们很难要求所有的人都给他们的密钥加上密码短语,而且即使他们加上了,其复杂度也是难以控制的。
我还尝试了在pam.d/sshd中进行一些设置,但都未能实现,最终我发现了一篇文章:
http://serverfault.com/questions/161699/how-can-i-increase-ssh-security-can-i-require-both-a-key-and-password
作者与我有着类似的需求,并且有人也给出了答案:
1. OpenSSH Server是不支持SSH Key和Password两级验证的,也就是说,只能存在 “或” 的关系,不能存在 “与” 的关系;
2. 采用其他的SSH Server,例如Tectia SSH server,是可以实现的,只需要添加参数“RequiredAuthentications publickey, password”就可以了;
建议:
1.即使其他的SSH Server如Tectia SSH Server支持这样的功能,我们也不能用其替换OpenSSH Server,原因很简单,OpenSSH Server作为Linux与众多Unix的默认SSH Server,其安全性是有保障的,我们想采用两级验证的目的是为了提供更好的安全性,采用其他的SSH Server,很可能存在各种安全上的漏洞隐患;
2.我们想采用两级验证,并非一定要从SSH Server本身去实现,上级所要求的只是管理上达到的一种效果,我们完全可以通过将服务器设置为只允许部分白名单IP地址登陆,然后将办公室的IP和几台VPN服务器的地址加入,这样每次大家都需要先通过VPN的一道密码或证书验证,才能再登陆服务器,上级的要求也就满足了。
使用SSH Key实现安全的密钥证书方式登陆,一篇非常好的关于ssh密钥证书方式登录的文章,不容错过哦。
SSH作为Linux服务器的缺省登陆方式,安全性上需要进一步的增强,就我个人经验来讲,主要有以下方法:
1.禁止root用户登陆:
修改/etc/ssh/sshd_config
PermitRootLogin yes
2.仅允许某一用户(如Jack)登陆
修改/etc/ssh/sshd_config
UserAllow Jack
3.修改SSH监听端口(如7890)
修改/etc/ssh/sshd_config
Port 7890
4.通过hosts.allow仅允许指定IP(如8.8.8.8)或IP段(如8.8.8.x)通过
修改/etc/hosts.deny
sshd:all
修改/etc/hosts.allow
sshd:8.8.8.8
sshd:8.8.8.
5.禁用密码方式验证,使用密钥证书方式登陆
具体实现过程将稍后在本文中进行讲解
6.在服务器上安装OpenVPN Server,然后仅允许OpenVPN的本地IP段通过
这样每次都需要通过证书登陆到OpenVPN,才能再登陆到SSH,具体OpenVPN的搭建请参考我的这篇文章:http://heylinux.com/archives/555.html
从1到6,安全级别逐渐加强,但安全与便捷始终存在着矛盾,这一点需要大家自己进行取舍。
下面,我将对利用SSH Key实现安全的密钥证书方式登陆进行介绍,介绍中包括的客户端为 SSH Secure Shell,PuTTY,SecureCRT以及Linux终端。
一、配置OpenSSH服务端
1.修改配置文件中的以下记录
# vim /etc/ssh/sshd_config
================================
PermitEmptyPasswords no
PasswordAuthentication no
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
StrictModes no
================================
2.为用户(如jack)创建authorized_keys文件
# cd /home/jack
# mkdir .ssh
# touch .ssh/authorized_keys
# chmod 700 .ssh
# chmod 600 .ssh/authorized_keys
# chown -R jack:jack .ssh(SUSE上需要执行 chown -R jack:users .ssh)
3.重启OpenSSH服务
# /etc/init.d/sshd restart
二、配置SSH客户端
使用SSH Secure Shell客户端生成SSH Key
打开SecureCRT客户端,点击 “ Edit- Settings ”;
选择 “ Global Settings - User Authentication – Keys ”,点击 “ Generate New ”;
再出现的界面中选择 “ RSA ” 与 “ 1024 ”,点击 “ 下一步 ”;
会出现一个密码生成的界面,完成之后,点击下一步;
在界面中输入 文件名,提示信息与密码短语,点击下一步;
可以看到刚刚生成的key;
进入密钥存放路径中,用记事本打开Jack.pub公钥文件;
将文件中的密钥信息复制到新的文件中,重新编辑为可被OpenSSH接受的格式;
例如原有格式:
---- BEGIN SSH2 PUBLIC KEY ----Comment: "Jack [1024-bit rsa, Digby ]"
AAAAB3NzaC1yc2EAAAADAQABAAAAgQDSaMbbAmwE/b0NaqGN/9yq56UEYzQ0PEUCgTCN
qnCPOXnHqqH0H7G/77MXZ0j9ekzL7arLzjcZBXpYSrg7ueSj+6yIsGnlH8g0k1u/uqTe
9/8xDIwxww9OFvRPk9KP7W1653ahj9w/gOxYu66+sT5tt4lu643zPIOO7Fm3cjuy7Q==
---- END SSH2 PUBLIC KEY ----
可被OpenSSH接受的格式,即“ssh-rsa 密钥 提示信息”,需要去除换行,将整个处理为单行记录:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDSaMbbAmwE/b0NaqGN/9yq56UEYzQ0PEUCgTCNqnCPOXn
HqqH0H7G/77MXZ0j9ekzL7arLzjcZBXpYSrg7ueSj+6yIsGnlH8g0k1u/uqTe9/8xDIwxww9OFvRPk9KP7W1653a
hj9w/gOxYu66+sT5tt4lu643zPIOO7Fm3cjuy7Q== Jack
将编辑后的内容复制下来,并粘贴到服务器中需要通过密钥登陆的用户(如jack)的 ~/.ssh/authorized_keys 文件中。
此时SSH Secure Shell默认已经使用Identity文件作为本地私钥了;
使用SSH Secure Shell工具进行登陆,当出现以下提示框,说明密钥已经验证通过,输入设置的密码短语,即可登陆。
使用Linux终端生成SSH Key
使用ssh-keygen生成SSH Key,依次输入:回车,密码短语,密码短语。
然后进入密钥存放路径中,打开 id_rsa.pub 公钥文件;
将文件中的内容复制下来,粘贴到服务器中需要通过密钥登陆的用户(如jack)的 ~/.ssh/authorized_keys 文件中。
使用命令行进行登陆,当出现以下提示框,说明密钥已经验证通过,输入设置的密码短语,即可登陆。
使用PuTTY客户端生成SSH Key
打开PUTTYGEN.exe程序,点击Generator,在出现的界面中滑动鼠标来输入随机数据,进入到如下界面。
执行以下操作:
在Key comment:输入key的提示信息;
在Key passphrase:输入key的密码短语,在Confirm passphrase:再次输入key的密码短语;
在Type of key to generate:选择SSH-2 RSA;
在Number of bits in a generated key:输入1024;
点击Save public key保存 公钥 到本地,命名为ssh-rsa.pub;
点击Save private key保存 私钥 到本地,命名为ssh-rsa.ppk。
将最上方的Public key for pasting into OpenSSH authorized_keys file:的文本框中的内容复制下来,并粘贴到服务器中需要通过密钥登陆的用户(如jack)的 ~/.ssh/authorized_keys 文件中。
使用PuTTY,在Connection-SSH-Auth中的Private key file for authentication中选择刚生成的ssh-rsa.ppk文件。
使用PuTTY进行登陆,当出现以下提示框,则说明密钥已经验证通过,输入开始设置的密码短语,即可登陆。
使用SecureCRT客户端生成SSH Key
打开SecureCRT客户端,点击 “ Tools - Create Public key ”;
在陆续出现的界面中,执行以下操作:
选择 下一步,然后选择密钥类型为“ RSA ”;
输入密码短语与提示信息;
输入密钥长度(位):1024;
选择 “ OpenSSH Key format ” 并确认密钥存放路径,点击 完成;
进入密钥存放路径中,用记事本打开Identity.pub公钥文件;
将文件中的内容复制下来,粘贴到服务器中需要通过密钥登陆的用户(如jack)的 ~/.ssh/authorized_keys 文件中。
如果使用的SecureCRT客户端版本比较低,不能够选择“OpenSSH Key format”格式来存储密钥,那么就需要将文件中的密钥信息复制到新的文件中,重新编辑为可被OpenSSH接受的格式;
例如原有格式:
---- BEGIN SSH2 PUBLIC KEY ----
Subject: Digby
Comment: "Jack"
ModBitSize: 1024
AAAAB3NzaC1yc2EAAAADAQABAAAAgQDSaMbbAmwE/b0NaqGN/9yq56UEYzQ0PEUCgTCN
qnCPOXnHqqH0H7G/77MXZ0j9ekzL7arLzjcZBXpYSrg7ueSj+6yIsGnlH8g0k1u/uqTe
9/8xDIwxww9OFvRPk9KP7W1653ahj9w/gOxYu66+sT5tt4lu643zPIOO7Fm3cjuy7Q==
---- END SSH2 PUBLIC KEY ----
可被OpenSSH接受的格式,即“ssh-rsa 密钥 提示信息”,需要去除换行,将整个处理为单行记录:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDSaMbbAmwE/b0NaqGN/9yq56UEYzQ0PEUCgTCNqnCPOXn
HqqH0H7G/77MXZ0j9ekzL7arLzjcZBXpYSrg7ueSj+6yIsGnlH8g0k1u/uqTe9/8xDIwxww9OFvRPk9KP7W1653a
hj9w/gOxYu66+sT5tt4lu643zPIOO7Fm3cjuy7Q== Jack
将编辑后的内容复制下来,粘贴到服务器中需要通过密钥登陆的用户(如jack)的 ~/.ssh/authorized_keys 文件中。
此时SecureCRT默认已经使用Identity文件作为本地私钥了,如果需要指定私钥文件,需要在 “Connection - SSH2 - Authentication(PublicKey) - Properties ”中进行设置;
使用SecureCRT工具进行登陆,当出现以下提示框,则说明密钥已经验证通过,输入开始设置的密码短语,即可登陆。
三、注意事项
在生成了key之后,一定要保存好生成的两个证书文件,它们分别代表了 公钥 和 私钥;
其中公钥用于添加到服务器端用来识别私钥,私钥用于服务器认证,如果不单独复制出来好好的保存的话,极有可能在重装系统或SSH客户端之后,造成两个证书文件的丢失,也就再也无法登陆服务器了。
另外,为证书创建一个密码短语也是非常有必要的,因为如果一旦证书泄露了,且没有密码短语的保护,那么拿到证书的人就可以直接登陆到服务器中。
优化history历史命令记录并加上执行时间的方法,供大家学习参考。
加入新公司以后,我发现很多的开发与测试服务器的权限放得很开,很多人都有账号,而且不少人还有root权限,因此常常出现一些误操作问题,每次在出现问题的时候他们都会来找我查一下哪个用户在什么时间执行了什么操作导致的问题。
由于Linux默认的history记录仅保存了命令的内容,没有具体的时间,我只能通过查出用户的登录与退出的时间,来给他们一个时间范围。
因此,我们非常有必要对history历史命令的记录功能进行优化,我推荐的参数如下:
编辑/etc/bashrc,添加以下配置信息:
export HISTFILESIZE=1000000000
# 保存历史命令条数
export HISTSIZE=1000000
# 实时记录历史命令,默认只有在用户退出之后才会统一记录,很容易造成多个用户间的相互覆盖。
export PROMPT_COMMAND="history -a"
# 记录每条历史命令的执行时间
export HISTTIMEFORMAT="%Y-%m-%d_%H:%M:%S "
使更改立即生效:
# source /etc/bashrc
查看历史命令记录:
# history
即可看到如下图所示的带有执行时间的新格式:
另外,加上一些其它的别名,也能起到一些优化作用。
alias rm='rm -i' #删除时确认
alias cp='cp -i' #复制覆盖时确认
alias mv='mv -i' #移动覆盖时确认
alias grep='grep --color=auto' #为grep增加颜色
alias ll='ls -l' #详细信息列表
alias la='ls -A' #带有隐藏文件输出的详细信息列表
如果想暂时取消别名的附加参数功能,比如不经过确认直接删除文件,可以用“\”将命令转义一次再执行,如下所示:
[root@localhost ~]# echo "I am old" > oldfile.txt
[root@localhost ~]# cp newfile.txt oldfile.txt
cp: overwrite `oldfile.txt'? no
[root@localhost ~]# cat oldfile.txt
I am old
[root@localhost ~]# \cp newfile.txt oldfile.txt
[root@localhost ~]# cat oldfile.txt
I am new
本文转自:http://heylinux.com