Linux ssh安全远程登录
本章内容:
构建SSH远程登录系统
SSH(secure shell)是标准的网络协议,主要用于实现字符界面的远程登录管理,及远程文件复制功能。SSH协议对通过网络传输的数据进行了加密处理,其中包括了用户登录时输入的用户口令。与早期的Telnet(远程登录)、rsh(远程执行命令)、rcp(远程文件复制)等应用相比,SSH协议提供了更好的安全性,SSH协议监听的端口:tcp22。
SSH协议支持两种方式的用户登录认证:
(1)基于密码验证的SSH登录体系
(2)基于密钥对儿验证的SSH登录体系
openssh:
client/server:客户端/服务器
client:客户端软件有ssh、scp、sftp
server:服务器软件有sshd
Windows上的远程客户端有:xshell securecrt putty sshsecureshellclinet
ssh服务器:
sshd服务器主配置文件:/etc/ssh/sshd_config
常用参数:
Port #### //监听端口
AddressFamily any //监听地址
PasswordAuthentication yes |no //是否允许密码验证登录
protocol //协议
LoginGraceTime 2m //登录等待超时时间
PermitRootLogin yes |no //是否允许root登录
MaxAuthTries 6 //尝试错误密码输入次数(一半)
MaxSessions 10 //每个网络连接尝试最大会话次数
AuthorizedKeysFile .ssh/authorized_keys //key验证默认公钥存放路径
ClientAliveInterval 0 //用户连接上sshd服务多久不活动就断开连接
UseDNS yes |no //是否使用DNS
#no default banner path //登录sshd服务时的提示标语
Banner /etc/ssh.txt //登录sshd服务时的提示标语
限制可登录用户的办法:
AllowUsers zheng mage //如果此处没有添加root用户,那么root也就拒绝
DenyUsers zhangsan lisi //拒绝登录sshd服务的用户,拒绝优先
AllowGroup //允许那些组内用户登录
DenyGroup //拒绝哪些组内用户登录
ssh服务的最佳实践:
1、不要使用默认端口
2、禁止使用protocol version 1
3、限制可登录用户
4、设定空闲会话超时时长
5、利用防火墙设置ssh访问策略
6、仅监听特定的IP地址
7、基于口令认证时,使用强密码celv
例:tr -dc A-Za-z0-9_ < /dev/urandom | head -c 30 | xargs
8、使用基于密钥的认证
9、禁止root用户直接登录
10、禁止使用空密码
11、限制ssh的访问频率和并发在线数
12、做好日志,经常分析
ssh客户端:
ssh客户端主配置文件:/etc/ssh/ssh_config
命令行客户端工具:
1)ssh远程登录:使用ssh命令远程登录服务器时,最典型的命令格式如下。
ssh username@sshserver [command]
或者简写为:
ssh ip address
ssh支持的选项:
-p:port远端服务器监听的端口
-b:指定连接的源ip
-v:调试模式
-c:压缩方式
-X:支持x11转发
-y:支持信任x11转发 forward x11 trusted yes
-t:强制伪tty分配
ssh -t remoteserver1 ssh remoteserver2
-l:直接以谁的身份登录sshd服务器
ssh -l zheng 192.168.3.2 (必须指定用户名)
命令格式中sshserver表示需要登录到的SSH服务器的地址,可以是主机名或者IP地址,而username表示用于登录的用户账号,该账号应该是SSH服务器中的系统用户账号。用户名与服务器地址之间使用“@”符号进行分隔。
当客户端第一次使用ssh客户端命名连接sshd服务器时,在你输入yes的时候,客户机会自动复制sshd服务器/etc/ssh/ssh_host_rsa_key.pub中的公钥到自己家目录./.ssh/known_hosts文件中。下次再连接时,sshd服务器就会发一个私钥签名数据给ssh客户端,如果ssh客户端能解开则证明是原来连接过的sshd服务器,否则客户端则会报警提示。(WARNING REMOTE HOST IDENTIFICATION CHANGED!)远程主机标识发生改变。
修改sshd服务器的监听端口号:
[root@centos7 ssh]# vim /etc/ssh/sshd_config
[root@centos7 ssh]# systemctl reload sshd //重新加载服务
如果selinux是开启状态,还需执行:
[root@centos7 ssh]# semanage port -a -t ssh_port_t -p tcp 2222
使用centos6客户机测试:
[root@centos6 ssh]# ssh 192.168.3.11 -p 2222
若不想每次ssh连接时都输入指定的端口号2222,我们这是就可以更改客户端(centos6)的配置文件。
[root@centos6 ssh]# vim /etc/ssh/ssh_config
客户端改完配置文件无需重启服务。
使用centos6客户机测试:
[root@centos6 ssh]# ssh 192.168.3.11
基于key验证远程登录openssh服务器:
在客户端创建密钥对:
在客户端使用ssh-keygen命令工具为当前用户创建密钥对文件,可以使用的加密算法为rsa或dsa(ssh-keygen命令的-t选项用于指定算法类型),ssh-keygen命令执行完毕后将密钥文件保存到用户指定的位置,默认位于用户宿主目录下的.ssh/目录下。其中id_rsa.pub是用户的公钥文件,可以提供给ssh服务器;id_rsa是用户的私钥文件,权限默认为600,私钥文件用妥善保管,不能泄露给他人。用户可以在创建密钥对儿的过程中设置一个私钥密码短语或(ssh-keygen -P “ PASSWD”)直接指定。
(1)在客户端生成密钥对儿;
ssh-keygen -t rsa|dsa -P PASSWD
或者写成:
(2)ssh-keygen (私钥保护密码在创建的过程中填写,默认为rsa加密算法)
(3)给私钥保护密码设置密码代理;
* 这样口令就只需要输入一次;
* 需先执行ssh-agent bash 启动密码代理服务;
* 在使用ssh-add命令把私钥保护密码托管给密码代理服务;
* 如果客户机重启还需重新设置私钥保护密码托管。
上传公钥文件给服务器:
将客户端用户创建的公钥文件发送给openssh服务器,并保存到服务器的授权密钥库中。服务器的授权密钥库文件位于各用户宿主目录下的.ssh/目录,默认的文件名是authorized_keys。
(1)拷贝公钥文件到远程服务器上;
ssh-copy-id -i (public_file绝对路径) [user@]host
测试基于key验证远程登录openssh服务器:
实验环境部署:
(1)在客户端centos7服务器上使用ssh-keygen命令生成密钥对。
(2)使用ssh-copy-id命令把生成的公钥文件发送给openssh服务器。
(3)在客户端centos7上使用ssh命令进行key验证远程登录测试。
1、在客户端centos7服务器上使用ssh-keygen命令生成密钥对;
查看/root/.ssh目录下生成的public/private文件
2、使用ssh-copy-id命令把生成的公钥文件发送给openssh服务器;
在centos6主机上查看/root/.ssh/目录下是否多出了一个授权密钥文件,authorized_keys。
3、在客户端centos7上使用ssh命令进行key验证远程登录测试。
注意:在ssh连接centos6时需要输入一下保护私钥的密码,如果这样决定麻烦,我们也可以启用ssh私钥保护密码托管。
* 需执行ssh-agent bash 启动密码代理服务;
* 使用ssh-add命令把私钥保护密码托管给密码代理服务;
* 如果客户机重启还需重新设置私钥保护密码托管。
使用SecureCRT、Xshell实现基于key验证:
SecureCRT实现基于key验证:
在SecureCRT工具—–>创建公钥—–>生成Identity.pub文件,并复制到需要远程登录的openssh服务器上相应文件authorized_keys中,需注意新建的authorized_keys文件权限为600,并且要转换Identity.pub为openssh服务器兼容的格式,需在openssh服务器上执行ssh-keygen -i -f Identity.pub >> .ssh/authorized_keys.
Xshell实现基于key验证:
在xshell工具中——->新建用户密钥生成向导——–>生产密钥参数——->密钥类型:RSA|DSA———->密钥长度:768|1024|2048|3072——–>下一步——–>生成公钥对——->下一步———>用户密钥信息(密钥名称、输入给用户密钥加密的密码)——–>下一步———>公钥注册—–保存为文件(将公钥文件保存桌面)——>完成。
复制到需要远程登录的openssh服务器上相应文件authorized_keys中,需注意新建的authorized_keys文件权限为600;然后就可以新建会话连接了,输入主机IP,在用户身份验证中选择publickey,输入用户名,选择用户密钥,点击完成。
scp命令:
scp [options] SRC ……..DEST/
两种方式:
scp [options] [user@]host:/sourcefile /desrpath
scp [options] /sourcefile [user@]host:/destpat
常用选项:
-c:压缩数据流;
-r:递归复制;
-p:保持原文件的属性信息;
-q:静默模式;
-P:port 指明 remote host的监听的端口;
注意:scp命令目标主机中存在的文件也会重新拷贝,效率较低。
示例:
[root@centos7 Desktop]# scp 192.168.3.7:/root/f1.sh ./
[root@centos7 Desktop]# scp ./linux-3.18.42.tar.xz 192.168.3.7:/root
rsync命令:
rsync命令:基于ssh和rsh服务实现高效率的远程系统之间复制文件;
使用安全的shell连接作为传输方式;
比scp命令效率更快,只复制不同的文件;适用于更新网站;
rsync -av /etc server1:/tmp 把整个目录复制过来
rsync -av /etc/ server1:/tmp 只复制目录下文件
常用选项:
-n:模拟复制过程
-v:显示详细过程
-r:递归复制目录树
-p:保留权限
-t:保留时间戳
-g:保留组信息
-o:保留所有者信息
-l:把符号链接文件做为符号文件进行复制(默认)
-L:将软链接文件指向文件复制
-a:存档模式,相当于-riptgoD,但不保留ACL(-A)和SELinux属性(-x)。
注意:rsync命令只复制目标服务器上不存在的文件,效率高。
示例:
[root@centos7 ~]# rsync ./f1.md5 192.168.3.7:/root
[root@centos7 ~]# rsync -rp 192.168.3.7:/etc ./
xftp命令:
交互式文件传输工具;
用法和传统的ftp工具相似;
sftp命令利用ssh服务实现安全的文件上传和下载;
使用 ls cd mkdir rmdir pwd get put等指令;
sftp [user@]host
示例:
[root@centos7 ~]# sftp 192.168.3.7
ssh端口转发:
什么是SSH端口转发?
SSH 会自动加密和解密所有SSH 客户端与服务端之间的网络数据。但是,SSH 还能够将其他TCP 端口的网络数据通过SSH 链接来转发,并且自动提供了相应的加密及解密服务。这一过程也被叫做“隧道”(tunneling),这是因为SSH 为其他TCP 链接提供了一个安全的通道来进行传输而得名。例如,Telnet,SMTP,LDAP 这些TCP 应用均能够从中得益,避免了用户名,密码以及隐私信息的明文传输。而与此同时,如果工作环境中的防火墙限制了一些网络端口的使用,但是允许SSH 的连接,也能够通过将TCP 端口转发来使用SSH 进行通讯
SSH 端口转发能够提供两大功能:
•加密SSH Client 端至SSH Server 端之间的通讯数据。
•突破防火墙的限制完成一些之前无法建立连接的tcp连接。
本地转发:
-L localport:host:hostportsshserver
ssh–L 9527:telnetsrv:23 -N sshsrv
telnet 127.0.0.1 9527
当访问本机的9527的端口时,被加密后转发到sshsrv的ssh服务,再解密被转发到telnetsrv:23
dataßàlocalhost:9527 ßàlocalhost:XXXXXßàsshsrv:22 ßàsshsrv:YYYYY ßàtelnetsrv:23
选.项:
-f 后台启用
-N 不开远程shell
-g 启用网关功能
远程转发:
-R sshserverport:host:hostport sshserver
ssh -R 9527:telnetsrv:23 -N sshsrv
让sshsrv侦听9527端口的访问,如有访问,就加密后通过ssh服务转发请求到本机ssh客户端,再由本机解密后转发到telnetsrv:23
Data <—->sshsrv:9527<—–>sshsrv:22<—–>localhost:xxx<—–>localhost:yyyy<—>telnet:23
示例:
实验环境:centos5使用ssh隧道Telnet centos7主机。
centos5 ip:192.168.3.5
centos6 ip:192.168.3.6
centos7 ip:192.168.3.7
(1)centos6 和centos7在同一个局域网内,centos5为互联网上的设备;
(2)局域网内的策略允许centos5访问centos6;
(3)使用ssh端口转发实现centos5安全访问centos7;
[root@centos5~]#ssh -L 9527:192.168.3.7:23 -N 192.168.3.6
[root@centos5~]#telnet 127.0.0.1 9527 //这样就可以telnet(ssh安全)连接centos7了。
动态端口转发:
当用firefox访问internet时,本机的1080端口做为代理服务器,Firefox的访问请求被转发到sshserver上,由sshserver替之访问Internet。
在本机firefox设置代理socket proxy:127.0.0.1:1080
#ssh -D 1080 root@sshserver
X协议转发:
所有图形化应用程序都是x客户程序:
能够通过tcp/ip连接远程x服务器
数据没有加密机,但是它通过ssh连接隧道安全进行
ssh -X user@remotehost gedit
remotehost主机上的gedit工具,将会显示在本机的x服务器上。
传输的数据将通过ssh连接加密。
AIDE:高级入侵检测环境
当一个入侵者进入了你的系统并且种植了木马,通常会想办法隐藏这个木马(除了木马本身的一些隐藏特性外,他会尽量给你检查系统的过程设置障碍),通常入侵者会修改一些文件,比如管理员通常使用ps aux来查看系统进程,那么入侵者很可能用自己修改过的ps程序来替换掉你系统上的ps程序,以使用ps命令查不到正在运行的木马程序。如果入侵者发现管理员正在运行crontab作业,也有可能替换掉crontab程序等。所以由此可见对于系统文件或是关键文件的检查是很重要的,目前就系统完整性检查的工具用的比较多的由两款免费的但功能也很强大的工具。
AIDE(adevanced intrusion detection environment)高级入侵检测环境,是一个入侵检测工具,只要用途是检查文件的完整性,审计计算机上的那些文件被更改过了。
AIDE能够构造一个指定文件的数据库,它使用aide.conf作为其配置文件。AIDE数据库能够保存文件的各种属性,包括:权限(permission)、索引节点序号(inode number)、所属用户(user)、所属用户组(group)、文件大小、最后修改时间(mtime)、创建时间(ctime)、最后访问时间(atime)、增加的大小以及连接数。AIDE还能够使用下列算法:sha1、md5、rmd160、tiger,以密文形式建立每个文件的校验码或散列号。
这个数据库不应该保存那些经常变动的文件信息,例如:日志文件、邮件、/proc文件系统、用户起始目录以及临时目录。
安装AIDE:
yum -y install aide
初始化默认的AIDE的库:
/usr/local/bin/aide –init
生成检查数据库(建议初始数据库存放到安全的地方)
cd /var/lib/aide
mv aide.db.new.gz aide.db.gz
检测:
/usr/local/bin/aide —check
更新数据库:
aide –update
AIDE的主配置文件:/etc/aide.conf
对要监控的目录或文件初始信息生成数据库文件;系统会默认把生成的aide.db.new.gz数据库文件保存到/var/lib/aide目录下:
如果要校验的时候,需改名为:aide.db.gz
校验aide监控的目录和文件:
改变一下f1文件的大小:
在次使用aide –check检测监控的目录和文件:
由此可见aide已经检测到了f1文件哈希值发生了改变。
如果说现在想监控f3文件了,只需改/etc/aide.conf配置文件,把!/testdir/f1删除。
使用aide –update监控数据库信息:
再次修改新生成的aide.db.new.gz监控数据库文件为aide.db.gz;
su 切换用户身份:
在大多数的Linux服务器中,通常并不建议用户直接使用root用户登录系统。这样一方面尽可能地减少了以“超级用户”身份发生误操作的可能性,另一方面也降低了root密码在不安全网络中被泄露(或暴力破解)的风险。
su -l username -c “command”
sudo命令:
sudo命令提供了一种机制,只要预先在/etc/sudoers配置文件中进行授权,即可以允许特定的用户以超级管理员(或其他普通用户)的身份去执行命令,而该用户不需要知道root用户(或其他普通用户)的密码。
1、sudo能够授权指定用户在指定主机上运行某些命令。如果未授权用户尝试使用sudo,会提示联系管理员。
2、sudo可以提供日志,记录每个用户使用sudo操作。
3、sudo为系统管理员提供配置文件,允许系统管理员集中地管理用户的使用权限和使用主机。
4、sudo使用时间戳文件来完成类似“检票”的系统,默认存活期为5分钟的“入场券”。
5、通过visudo命令编辑配置文件,具有语法检查功能。
sudo的配置文件/etc/sudoers 或 /etc/sudoers.d/
/etc/sudoers文件的默认权限位440,通常使用专门的visudo命令进行编辑。如果直接使用vi命令编辑,则在保存文件的时候需要使用:wq!,否则系统将提示为只读文件而拒绝保存。
sudo命令配置文件支持使用通配符glob:
?:任意单一字符;
*:匹配任意长度字符;
[wxc]:匹配其中一个字符;
[!wxc]:除了这三个字符的其它字符;
\x:转义;
[[alpha]]:字母;示例:/bin/ls[[alpha]]
配置文件规则有两类:
(1)别名定义:不是必须的
(2)授权规则:必须的
授权规则格式:
用户 登入主机=(代表用户) 命令
示例:
root ALL=(ALL) ALL
格式说明:
user:运行命令者的身份;
host:通过哪些主机
(runas):以哪个用户的身份;
command:运行哪些命令;
别名:
user和runas:
#uid
%group_name
%#gid
user_alias | runas_alias
host:
ip或hostname
network(/netmask)
host_ailas
command:
command name
directory
sudoedit
cmnd_alias
sudo别名:
别名的四种类型:
User_Alias Runas_Alias Host_Alias Cmnd_Alias
别名格式:
[A-Z]([A-Z][0-9]_)* 别名必须是大写字母且大写字母开头后可以跟数字。
别名定义:
Alias_Type NAME1 = item1,item2,item3 : NAME2 = item4, item5
定义两个相同的别名时可以使用“:”进行分隔开。
示例1:
student ALL=(ALL) ALL
%wheel ALL=(ALL) ALL
示例2:
student ALL=(root) /sbin/pidof,/sbin/ifconfig
%wheel ALL=(ALL) nopasswd:ALL
示例3:
User_Alias NETADMIN = netuser1,netuser2
Cmnd_Alias NETCMD = /usr/sbin/ip
NETADMIN ALL=(root)NETCMD
示例4:
User_Alias SYSADER = zheng,mage,%admins
User_Alias DISKADER = tom
Host_Alias SERS = www.magedu.com,172.16.0.0/24
Runas_Alias OP = root
Cmnd_Alias SYDCMD = /bin/chown,/bin/chmod
Cmnd_Alias DSKCMD = /sbin/parted,/sbin/fdisk
SYSADER SERS = SYDCMD,DSKCMD
DISKADER ALL=(OP) DSKCMD
示例5:
User_Alias ADMINUSER = adminuser1,adminuser2
Cmnd_Alias ADMINCMD = /usr/sbin/useradd,/usr/sbin/usermod,/usr/bin/passwd,!/usr/bin/passwd root
ADMINUSER ALL=(root) NOPASSWD:ADMINCMD,PASSWD:/usr/sbin/userdel
示例6:
Defaults:wang runas_default=tom
wang ALL = (tom,jerry) ALL
示例7:
wang 192.168.175.136,192.168.175.138=(root) /usr/sbin,!/usr/sbin/useradd
示例8:
wang ALL=(ALL) /bin/cat /var/log/message*
sudo [-u user] command
-i:为了频繁的执行某些只有超级用户才能执行的权限,而不用每次输入密码,可以使用该命令。
-V:显示版本信息等配置信息;
-u:user 默认为root
-l:列出用户在主机上可用的和被禁止的命令
-v:在延长密码有效期限5分钟,更新时间戳 //认证时间戳目录:/var/db/sudo
-k:清除时间戳,下次需要重新输入密码
-K:与-k类似,还要删除时间戳文件
-b:在后台执行指令
-p:改变询问密码的提示符
如 -p “password on %h for user %p”
示例1:授权zheng用户以管理员权限:
[root@centos7 Desktop]# visudo
切换到zheng用户使用sudo -l 查看:
示例2:
zheng ALL=(root) NOPASSWD:/usr/bin/passwd,!/usr/bin/passwd root
原创文章,作者:zhengyibo,如若转载,请注明出处:http://www.178linux.com/50541