一、ssh密钥对无交互登录
实战1:通过密钥进行sshd服务认证
服务端:linl_S IP:10.0.0.15
客户端:lin_C IP:10.0.0.16
1)在客户端生成密钥对
命令:
ssh-keygen
1 [root@linl_C ~]# ssh-keygen 2 Generating public/private rsa key pair. 3 Enter file in which to save the key (/root/.ssh/id_rsa): 4 Enter passphrase (empty for no passphrase): 5 Enter same passphrase again: 6 Your identification has been saved in /root/.ssh/id_rsa. #$HOME/.ssh/id_rsa私钥 7 Your public key has been saved in /root/.ssh/id_rsa.pub. #$HOME/.ssh/id_rsa.pub公钥 8 The key fingerprint is: 9 ca:d7:72:c0:ee:5d:61:cc:ea:e4:06:c4:b4:a5:7f:cf root@linl_C 10 The key's randomart image is: 11 +--[ RSA 2048]----+ 12 | | 13 | . . | 14 | o + | 15 | .= o | 16 | .S. = | 17 | . o.o.o.. | 18 | o +.=..o | 19 | o B.. E | 20 | ..+ | 21 +-----------------+ 22 [root@linl_C ~]# ls .ssh/ 23 id_rsa id_rsa.pub
2)发布公钥到服务端
使用ssh-copy-id 命令将客户端生成的公钥发布到远程服务器,并使用 -i 参数指定本地公钥的存放位置。
命令格式:
ssh-copy-id -i [公钥] [远程主机用户名]@[远程服务器主机名或IP地址]
1 [root@linl_C ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub lin_S #如果用root账号,则主机可以省略用户名 2 root@lin_s's password: 3 Now try logging into the machine, with "ssh 'lin_S'", and check in: 4 .ssh/authorized_keys 5 to make sure we haven't added extra keys that you weren't expecting.
3)测试
1 [root@linl_C ~]# ssh lin_S #无交互登录 2 Last login: Fri May 20 11:00:50 2016 from 10.0.0.16 3 [root@linl_S ~]# ls $HOME/.ssh/ #在lin_S上$HOME/.ssh/下查看拷贝过来的文件,会将id_rsa.pub重命名为authorized_keys 4 authorized_keys known_hosts
4)使用其他帐号登录,需要重新上传密钥
1 [root@linl_C ~]# ssh-copy-id -i .ssh/id_rsa.pub linypwb@lin_S 2 linypwb@lin_s's password: 3 Now try logging into the machine, with "ssh 'linypwb@lin_S'", and check in: 4 .ssh/authorized_keys 5 to make sure we haven't added extra keys that you weren't expecting. 6 [root@linl_C ~]# ssh linypwb@lin_S 7 Last login: Fri May 20 11:30:07 2016 from lin_c 8 [linypwb@linl_S ~]$ 9 [linypwb@linl_S ~]$ ls .ssh/ 10 authorized_keys
5)只使用密钥对验证
1 [root@linl_S ~]# vi /etc/ssh/sshd_config 2 #PasswordAuthentication yes #将认证设置为no 3 PasswordAuthentication no 4 [root@linl_S ~]# service sshd restart #重启sshd服务 5 Stopping sshd: [ OK ] 6 Starting sshd: [ OK ]
二、sshd服务防止暴力破解—fail2ban
实战2:sshd服务防止暴力破解
方法1:提高密码安全等级
长度:8位以上,最好14位以上
复杂性:大小写字母,数字,特殊符号
方法2:修改默认的端口号
方法3:不使用root账号登录
互动:是否可以禁止root身份登录? 不行,因为有些程序需要使用root身份登录并运行。另外判断一个用户是不是超级管理员,看的是用户的ID是否为0。
1)修改登录shell
将 /bin/bash 改为 /sbin/nologin
1 [root@linl_S ~]# vim /etc/passwd 2 #root:x:0:0:root:/root:/bin/bash 3 root:x:0:0:root:/root:/sbin/nologin
2)修改sshd配置文件
将PermitRootLogin 设置为no
1 [root@linl_S ~]# vim /etc/ssh/sshd_config 2 #PermitRootLogin yes 3 PermitRootLogin no
3)将普通用户提升为系统管理员
将UID和GID改为0
一般情况这个就可以解决了暴力破解的问题了。
1 [root@linl_S ~]# vi /etc/passwd 2 #linypwb:x:500:500::/home/linypwb:/bin/bash 3 linypwb:x:0:0::/home/linypwb:/bin/bash 4 5 [root@linl_C ~]# ssh linypwb@lin_S 6 linypwb@lin_s's password: 7 Last login: Fri May 20 14:22:53 2016 from lin_c 8 [root@linl_S ~]# id linypwb 9 uid=0(root) gid=0(root) groups=0(root) 10 [root@linl_S ~]# pwd 11 /home/linypwb 12 [root@linl_S ~]# whoami 13 root
情况2:暴力破解问题比较严重。 需要把暴力破解的用的IP地址直接禁掉
实战3:fail2ban
实战背景:
最近公网网站一直被别人暴力破解sshd服务密码。虽然没有成功,但会导致系统负载很高,原因是在暴力破解的时候,系统会不断地认证用户,从而增加了系统资源额外开销,导致访问公司网站速度很慢。
fail2ban可以监视你的系统日志,然后匹配日志的错误信息(正则式匹配)执行相应的屏蔽动作(一般情况下是防火墙),而且可以发送e-mail通知系统管理员,很好、很实用、很强大!
简单来说其功能就是防止暴力破解。工作的原理是通过分析一定时间内的相关服务日志,将满足动作的相关IP利用iptables加入到drop列表一定时间。
注:重启iptables服务的话,所有DROP将重置。
1)获取软件包
附件:
fail2ban-0.8.14.tar.gz
2)上传软件包到服务器
安装lrzsz包
rz 上传
sz 下载
1 [root@linl_S ~]# rpm -ivh /mnt/Packages/lrzsz-0.12.20-27.1.el6.x86_64.rpm 2 warning: /mnt/Packages/lrzsz-0.12.20-27.1.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY 3 Preparing... ########################################### [100%] 4 1:lrzsz ########################################### [100%] 5 [root@linl_S ~]# rz #选择上传安装包 6 [root@linl_S ~]# ls fail2ban* 7 fail2ban-0.8.14.tar.gz
3)解压fail2ban压缩包
1 [root@linl_S ~]# tar -zxf fail2ban-0.8.14.tar.gz 2 [root@linl_S ~]# ls 3 fail2ban-0.8.14 fail2ban-0.8.14.tar.gz
4)查看README.md文档帮助,获取安装方法
1 [root@linl_S ~]# vim fail2ban-0.8.14/README.md

需要安装python 开发环境,并且版本要大于2.4
查看当前系统中python 的版本:
1 [root@linl_S ~]# python -V 2 Python 2.6.6
5)安装fail2ban
根据README.md文档安装步骤安装
1 [root@linl_S ~]# cd fail2ban-0.8.14 2 [root@linl_S fail2ban-0.8.14]# python setup.py install 3 running install 4 running build 5 ... 6 Please do not forget to update your configuration files. 7 They are in /etc/fail2ban/.
6)生成服务启动脚本
将file/redhat-initd 拷贝到/etc/init.d/ ,命名为fail2ban
加入到启动列表
1 [root@linl_S fail2ban-0.8.14]# cp files/redhat-initd /etc/init.d/fail2ban 2 [root@linl_S fail2ban-0.8.14]# chkconfig --add fail2ban 3 [root@linl_S fail2ban-0.8.14]# chkconfig --list fail2ban 4 fail2ban 0:off 1:off 2:off 3:on 4:on 5:on 6:off
互动: 你怎么知道要复制这个文件? 一个新的软件包,后期怎么可以知道哪个文件是启动脚本文件?
这就要找服务器启动脚本文件中有什么特点,然后过滤出来对应的文件名。
1 [root@linl_S fail2ban-0.8.14]# grep chkconfig ./* -R 2 ./files/redhat-initd:# chkconfig: - 92 08
7)相关主要文件
/etc/fail2ban/action.d #动作文件夹,内含默认文件。iptables以及mail等动作配置
/etc/fail2ban/fail2ban.conf #定义了fai2ban日志级别、日志位置及sock文件位置
/etc/fail2ban/filter.d #条件文件夹,内含默认文件。过滤日志关键内容设置
/etc/fail2ban/jail.conf #主要配置文件,模块化。主要设置启用ban动作的服务及动作阀值
# jail [dʒeɪl] 监狱
/etc/rc.d/init.d/fail2ban #启动脚本文件
1 [root@linl_S ~]# ls /etc/fail2ban/ 2 action.d fail2ban.conf fail2ban.d filter.d jail.conf jail.d
应用实例:
设置条件:ssh远程登录5分钟内3次密码验证失败,禁止用户IP访问主机1小时,1小时该限制自动解除,用户可重新登录。
因为动作文件(action.d/iptables.conf)以及日志匹配条件文件(filter.d/sshd.conf )安装后是默认存在的。基本不用做任何修改。所以主要需要设置的就只有jail.conf文件。启用sshd服务的日志分析,指定动作阀值即可。
实例文件/etc/fail2ban/jail.conf 及说明如下:
1 [DEFAULT] #全局设置 2 ignoreip = 127.0.0.1/8 #忽略的IP列表,不受设置限制 3 bantime = 600 #屏蔽时间,单位:秒 4 findtime = 600 #这个时间段内超过规定次数会被ban掉 5 maxretry = 3 #最大尝试次数 6 backend = auto #日志修改检测机制(gamin、polling和auto这三种) 7 [sshd] #单个服务检查设置,如设置bantime、findtime、maxretry和全局冲突,服务优先级大于全局设置。 8 enabled = false #是否激活此项(true/false) 9 filter = sshd #过滤规则filter的名字,对应filter.d目录下的sshd.conf 10 action = iptables[name=SSH, port=ssh, protocol=tcp] #动作的相关参数,对应action.d/iptables.conf文件 11 sendmail-whois[name=SSH, dest=you@example.com, sender=fail2ban@example.com, sendername="Fail2Ban"] #触发报警的收件人 12 logpath = /var/log/sshd.log #检测的系统的登陆日志文件。
1)jail.conf 配置如下:
1 [ssh-iptables] 2 enabled = true #是否激活此项(true/false)修改成 true 3 filter = sshd 4 action = iptables[name=SSH, port=ssh, protocol=tcp] 5 sendmail-whois[name=SSH, dest=you@example.com, sender=fail2ban@example.com, sendername="Fail2Ban"] 6 logpath = /var/log/secure #这里要写sshd服务日志文件 7 findtime = 300 #在5分钟内内出现规定次数就开始工作 8 maxretry = 3 #3次密码验证失败 9 bantime = 3600 #禁止用户IP访问主机1小时
2)启动fail2ban服务
1 [root@linl_S ~]# service fail2ban start 2 Starting fail2ban: [ OK ]
3)清空日志,准备测试
1 [root@linl_S ~]# > /var/log/secure #清空日志,从现在开始 2 [root@linl_S ~]# /etc/init.d/fail2ban restart #重启fail2ban 服务 3 Stopping fail2ban: [ OK ] 4 Starting fail2ban: [ OK ] 5 [root@linl_S ~]# iptables -nL #查看防火墙状态 6 Chain INPUT (policy ACCEPT) 7 target prot opt source destination 8 fail2ban-SSH tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 9 10 Chain FORWARD (policy ACCEPT) 11 target prot opt source destination 12 13 Chain OUTPUT (policy ACCEPT) 14 target prot opt source destination 15 16 Chain fail2ban-SSH (1 references) #多出一条fail2ban-SSH的规则链 17 target prot opt source destination 18 RETURN all -- 0.0.0.0/0 0.0.0.0/0
4)lin_C失败远程登录到lin_S
1 [root@linl_C ~]# ssh lin_S #正确密码可以登录 2 root@lin_s's password: 3 Last login: Fri May 20 19:26:32 2016 from 10.0.0.1 4 [root@linl_S ~]# ssh lin_S 5 ssh: Could not resolve hostname lin_S: Name or service not known 6 [root@linl_S ~]# logout 7 Connection to lin_S closed. 8 [root@linl_C ~]# ssh lin_S #3次错误密码后,被拒绝 9 root@lin_s's password: 10 Permission denied, please try again. 11 root@lin_s's password: 12 Permission denied, please try again. 13 root@lin_s's password: 14 Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password). 15 [root@linl_C ~]# ssh lin_S #重新尝试,被锁定 16 ssh: connect to host lin_S port 22: Connection refused
5)查看防火墙、fail2ban 等状态
1 [root@linl_S ~]# iptables -nL |tail -4 #查看防火墙,多了一条REJECT条目,禁止10.0.0.16主机访问 2 Chain fail2ban-SSH (1 references) 3 target prot opt source destination 4 REJECT all -- 10.0.0.16 0.0.0.0/0 reject-with icmp-port-unreachable 5 RETURN all -- 0.0.0.0/0 0.0.0.0/0 6 [root@linl_S ~]# fail2ban-client status #查看fail2ban 工作状态 7 Status 8 |- Number of jail: 1 9 `- Jail list: ssh-iptables 10 [root@linl_S ~]# fail2ban-client status ssh-iptables #查看具体某一项工作状态 11 Status for the jail: ssh-iptables 12 |- filter 13 | |- File list: /var/log/secure #读取的日志:/var/log/secure 14 | |- Currently failed: 0 15 | `- Total failed: 3 #一共失败了3次 16 `- action 17 |- Currently banned: 1 #当前ban掉了1个IP 18 | `- IP list: 10.0.0.16 #IP 19 `- Total banned: 1
6)解除ban限定
方法1:删除/var/log/fail2ban.log 日志中ban掉的IP信息,需重启fail2ban 服务
1 [root@linl_S ~]# vim /var/log/fail2ban.log 2 ... 3 #2016-05-20 20:03:17,553 fail2ban.actions[3465]: WARNING [ssh-iptables] Ban 10.0.0.16 #删除ban掉IP 的日志信息 4 [root@linl_S ~]# service fail2ban restart 5 Stopping fail2ban: [ OK ] 6 Starting fail2ban: [ OK ] 7 [root@linl_C ~]# ssh lin_S #此时,lin_C再尝试可以进行登录 8 root@lin_s's password: 9 Last login: Fri May 20 19:34:43 2016 from lin_c 10 [root@linl_S ~]#
方法2:清空防火墙
1 [root@linl_S ~]# iptables -F #清空防火墙 2 [root@linl_S ~]# iptables -nL |tail -2 #REJECT条目已清空 3 Chain fail2ban-SSH (0 references) 4 target prot opt source destination 5 6 [root@linl_C ~]# ssh lin_S #此时,lin_C再尝试可以进行登录 7 root@lin_s's password: 8 Last login: Fri May 20 20:08:17 2016 from lin_c 9 [root@linl_S ~]#
三、两台Linux服务器之间复制数据
不同的Linux之间copy文件常用有多种方法,这里利用scp 命令来进行文件复制。
scp基于ssh登录并复制数据。远程复制过程中很安全。操作起来比较方便。
例1:把当前一个文件copy到远程另一台主机上。
命令:
scp local_file remote_username@remote_ip:remote_folder
1 [root@linl_C ~]# scp /etc/passwd root@10.0.0.15:/tmp 2 root@10.0.0.15's password: 3 passwd 100% 1578 1.5KB/s 00:00
然后会提示你输入另外那台10.0.0.15 主机的root 用户的登录密码,接着就开始copy了。
例2:把文件从远程copy到当前系统。
命令:
scp remote_username@remote_ip:remote_folder local_file
1 [root@linl_S ~]# scp root@10.0.0.16:/etc/passwd /tmp 2 root@10.0.0.16's password: 3 passwd 100% 1578 1.5KB/s 00:00