1 了解sshd服务
SSH(Secure Shell)是一种能够提供安全远程登陆会话的协议,假如希望在远程Linux系统中执行命令,就是通过这个协议啦!
为什么要强调SSH协议是安全的呢?因为比如ftp、telnet等服务在网络上不会对口令或数据进行加密,那么骇客们真的非常容易就可以截获这些信息(尤其是同局域网内的用户),因此它们在本质是就是不安全的。
sshd服务提供两种安全验证的方法:
1. 基于口令的安全验证:经过验证帐号与密码即可登陆到远程主机。
1. 基于密钥的安全验证:需要在本地生成”密钥对“后将公钥传送至服务端,进行公共密钥的比较。
sshd服务的配置文件解析:
sshd服务的配置文件解析:
[root@hd1 ~]# cat /etc/ssh/sshd_config
参数 | 作用 |
---|---|
Port 22 | 默认的sshd服务端口。 |
ListenAddress 0.0.0.0 | 设定sshd服务端监听的IP地址。 |
Protocol 2 | SSH协议的版本号。 |
HostKey /etc/ssh/ssh_host_key | SSH协议版本为1时,私钥存放的位置。 |
HostKey /etc/ssh/ssh_host_rsa_key | SSH协议版本为2时,RSA私钥存放的位置。 |
HostKey /etc/ssh/ssh_host_dsa_key | SSH协议版本为2时,DSA私钥存放的位置。 |
PermitRootLogin yes | 设定是否允许root用户直接登录。 |
StrictModes yes | 当远程用户私钥改变时则直接拒绝连接。 |
MaxAuthTries 6 | 最大密码尝试次数 |
MaxSessions 10 | 最大终端数 |
PasswordAuthentication yes | 是否允许密码验证 |
PermitEmptyPasswords no | 是否允许空密码登陆(很不安全) |
若您想要修改服务的配置参数,请一定要记得删除参数前面的注释符”#“并重启服务才生效的。
[root@hd1 ssh]# service sshd restart
Stopping sshd: [ OK ]
Starting sshd: [ OK ]
在远程主机上启动sshd服务并加入到开机启动项:
[root@localhost ~]# systemctl start sshd
[root@localhost ~]# systemctl enable sshd
2 使用ssh命令登录主机
ssh命令用于远程管理Linux主机,格式为:“ssh [参数] 主机”。
参数 | 作用 |
---|---|
-p | 指定连接端口(默认为22) |
-v | 显示连接过程的详细信息 |
[root@localhost ~]# ssh 192.168.10.20
The authenticity of host '192.168.10.20 (192.168.10.20)' can't be established.
ECDSA key fingerprint is 4f:a7:91:9e:8d:6f:b9:48:02:32:61:95:48:ed:1e:3f.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.10.20' (ECDSA) to the list of known hosts.
root@192.168.10.20's password:此处输入远程主机root用户的密码
Last login: Wed Apr 15 15:54:21 2015 from 192.168.10.10
[root@localhost ~]#
3 安全密钥验证
使用密码验证终归会存在着被骇客暴力破解或嗅探监听的危险,其实也可以让ssh服务基于密钥进行安全验证(可无需密码验证)。
3.1 第一步:使用Xshell生成密钥(在本地主机中生成“密钥对”亦可)
- 我们打开熟悉的XSHELL软件,然后在工具-新建用户密钥生成向导;
生成密钥参数:确定公钥的类型和长度;
我们这里需要选择RSA密钥类型,以及密钥长度可以选择1024或者我这里选择2048.然后点击下一步按钮。生成公钥对:生成公钥和私钥对
继续下一步,我们需要给我们设置的私钥加密。私钥加密:输入密码,只有该密码才能得到私钥(很重要)。
公钥格式:
公钥格式选择SSH2-OPENSSH,保存公钥为文件后完成。
3.2 第二步:上传公钥至服务器中
将我们生成的id_rsa_2048.pub公钥文件上传到/root/.ssh文件夹下面(如果没有我们需要创建),然后我们需要将id_rsa_2048.pub重命名为authorized_keys 并且用chmod 600 authorized_keys设置权限。
3.3 第三步 :修改sshd配置文件
编辑ssh服务程序主配置文件
[root@hd1 ~]# vim /etc/ssh/sshd_config
- 将允许密码验证的参数设置为no
- 将允许密钥验证的参数设置为yes
保存并退出配置文件
重启ssh服务
Debian/Ubuntu执行:/etc/init.d/ssh restart CentOS执行:/etc/init.d/sshd restart或者service sshd restart
3.4 第四步 :配置Xshell使用密钥登陆
- 在Xshell新建一个链接;
- 设置用户身份为Public Key,选择用户密钥;
- 输入我们之前设置的密钥密码,这个时候我们其实就可以登陆。
4 禁用root登录
为了防止root用户被扫描,被暴力破解,可以禁止root用户登录,指定特定用户可以通过su - 的方式切换root身份。
4.1 禁用root登录
修改配置文件
vi /etc/ssh/sshd_config
修改PermitRootLogin为no
PermitRootLogin no
重启sshd服务
service sshd restart
4.2 限制用户切换root身份
我们指定某个用户可以切换root身份,其他用户不可以
1. 修改/etc/pam.d/su配置
[root@h1 ~]# vi /etc/pam.d/su
找到下面这行,去掉行首的“#”
#auth required pam_wheel.so use_uid
1. 将指定用户添加到wheel用户组
```
usermod -G wheel 某用户名
```
1. 修改登录文件
```
[root@h1 ~]# vi /etc/login.defs
```
在末尾添加:
```
SU_WHEEL_ONLY yes
```
5 远程传输命令
要想将一些文件通过网络传送给其他主机,又恰好两台主机都是Linux系统,我们便可以直接用scp命令传输文件到另外一台主机。scp命令用于在网络中安全的传输文件。
5.1 发送文件
格式为:“==scp [参数] 本地文件 远程帐户@远程IP地址:远程目录==”。
参数 | 作用 |
---|---|
-v | 显示详细的连接进度 |
-P | 指定远程主机的sshd端口号 |
-r | 传送文件夹时请加此参数 |
-6 | 使用ipv6协议 |
例如:将本地文件/root/out.txt传送到远程主机的/home目录:
[root@linuxprobe ~]# scp /root/out.txt 192.168.10.20:/home
root@192.168.10.20's password:此处输入远程主机中root用户的密码
out.txt 100% 0 0.0KB/s 00:00
传送文件夹并指定远程用户:
[root@linuxprobe ~]# scp -r results/ linuxprobe@192.168.10.20:/home
linuxprobe@192.168.10.20's password:此处输入远程主机中linuxprobe用户的密码
5.2 下载文件
强大的scp命令还可以将远程主机的文件下载到本地。
格式为:“==scp [参数] 远程用户@远程IP地址:远程文件 本地目录==”。
例如:将远程主机的/etc/issue.net文件下载到本地的/root目录:
[root@linuxprobe ~]# scp linuxprobe@192.168.10.20:/etc/issue.net /root
linuxprobe@192.168.10.20's password:
issue.net 100% 22 0.0KB/s 00:00
例如:将远程主机的/root/test文件夹下载到本地的/root目录:
[root@njupt ~]# scp -r root@192.168.10.20:/root/test /root
Password:
1.txt 100% 0 0.0KB/s 00:00
2.txt 100% 0 0.0KB/s 00:00
1.txt 100% 0 0.0KB/s 00:00