一、telnet
telnet是一种远程连接协议,它为用户提供了在本地计算机上登录远程主机工作的能力。它采用明文传送报文,因此安全性不好,现已基本被ssh取代
telnet工具是telnet协议的开源实现,基于C/S架构:
server:telnet-server,23/tcp,其服务进程为telnetd,为瞬时守护进程,由超级守护进程xinetd管理。
telnet服务端默认禁止以管理员身份直接登录,但可以普通用户身份登录后再 su 到管理员
client:telnet
telnet客户端程序的用法为:
telnet remote_host [port] 例如 telnet 192.168.30.20
telnet命令除了用来登录远程主机,还可确定远程主机的某个端口是否能访问
例 telnet 192.168.30.20 80
二、ssh
ssh(secure shell,安全外壳协议),为建立在应用层和传输层基础上的安全协议,是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议
ssh版本:
sshv1:基于CRC-32做MAC,不安全
sshv2:加密机制及MAC机制由双方协商选定;
基于DH实现密钥交换,基于RSA或DSA实现身份认证;
客户端通过检查服务器端的主机密钥来判断是否能够继续通信;
三、openssh
openssh是ssh的开源实现,是一组用于安全地访问远程计算机的连接工具。 它可以作为 rlogin、 rsh rcp 以及 telnet 的直接替代品使用。更进一步,其他任何 TCP/IP 连接都可以通过 SSH 安全地进行隧道/转发。OpenSSH 对所有的传输进行加密,从而有效地阻止了窃听、连接劫持,以及其他网络级的攻击。OpenSSH 由 OpenBSD project 维护。
登录过程和使用 rlogin 或 telnet 建立的会话非常类似。在连接时,SSH 会利用一个密钥指纹系统来验证服务器的真实性。只有在第一次连接时,用户会被提示输入 yes。之后的连接将会验证预先保存下来的密钥指纹。如果保存的指纹与登录时接收到的不符,则将会给出警告。指纹保存在~/.ssh/known_hosts 中,对于 SSH v2 指纹,则是 ~/.ssh/known_hosts2。
默认情况下,较新版本的 OpenSSH 只接受 SSH v2 连接。如果能用版本 2 则客户程序会自动使用, 否则它会返回使用版本 1 的模式。此外,也可以通过命令行参数 -1 或 -2 来相应地强制使用版本 1 或 2。保持客户端的版本 1 能力是为了考虑较早版本的兼容性。
[root@node1 ~]# rm -f .ssh/* [root@node1 ~]# ssh 192.168.30.20 #第一次连接会提示是否保存ssh服务端的密钥指纹 The authenticity of host '192.168.30.20 (192.168.30.20)' can't be established. RSA key fingerprint is a3:d3:a0:9d:f0:3b:3e:53:4e:ee:61:87:b9:3a:1c:8c. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.30.20' (RSA) to the list of known hosts. [email protected]'s password: Last login: Tue Nov 24 17:33:25 2015 from node1 [root@node2 ~]# logout Connection to 192.168.30.20 closed. [root@node1 ~]# cat .ssh/known_hosts 192.168.30.20 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAzanDCNAhPaTOyvmOF3zWM0LaxPTTZnYqNeRAdtiEj5F4SS3f0JRbCt9vDNELLOtOMpPwehqmvxDtfjQ4l/3nQkMlt7FXJuLCuLSjORTEK3T5GDLXh7S8ZoiNy8TQqg+XqfI+7GTkMpgsQ+ITbvSVXlhyOXKKCgrVQmPnIkzRSuutfJH/PdoCz/cK3txgk8uWUdE+OahoFcxpjZH7qk/ly98QfgEZz36U1adH1upvd6NQzLJtFNAJapBgUmnCWriOytj2Nyu8QAHFvef9ZATUxI6vup99wfXKHBzeszWNeC9ttvKmn/qlDf2M37H3YcKJ1FJ6YM+t77lIIh41zMdagw== [root@node1 ~]# ssh -2 192.168.30.20
1、openssh采用C/S架构:
server:openssh-server,sshd,22/tcp
client:openssh-clients(软件包),ssh
windows上常用的ssh客户端工具:xshell,putty,securecrt,sshshellclient
2、openssh客户端:
配置文件:/etc/ssh/ssh_config
ssh命令的使用:
ssh [-p PORT] [username@]host [COMMAND] 或者ssh [-p PORT] -l username host [COMMAND]
后面若带上 COMMAND 则表示只是临时登录远程主机执行指定命令,取回结果后就立即断开,返回本地
[root@node2 ~]# ssh [email protected] hostname [email protected]'s password: node1 [root@node2 ~]#
3、基于ssh协议的scp和sftp
■scp:利用ssh协议在主机之间实现文件安全传输的工具
用法:scp [option] SRC1... DEST
分两种情形:
①源文件在本机,目标为远程
# scp /path/to/somewhere... USERNAME@HOST:/path/to/somewhere
②源文件在远程,本地为目标
# scp USERNAME@HOST:/path/to/somewhere /path/to/somewhere
常用选项:
-r:复制目录
-p:保持源文件的元数据信息,包括mode和timestamp
-q:静默模式
-P PORT:指定远程主机端口号;如非默认的22号端口,则需使用该选项明确指定
[root@node2 ~]# scp anaconda-ks.cfg 192.168.30.10:/tmp [email protected]'s password: anaconda-ks.cfg 100% 1282 1.3KB/s 00:00 [root@node2 ~]# scp -r 192.168.30.10:/root/test /tmp/ [email protected]'s password: c.txt 100% 0 0.0KB/s 00:00 b.txt 100% 0 0.0KB/s 00:00 [root@node2 ~]# ls /tmp/test b.txt c.txt
■sftp:基于ssh的ftp服务,安全性比ftp好得多,openssh服务端内置并默认启用该功能
用法:sftp [-oPORT=#] USERNAME@HOST[:/path/to/somewhere]
若openssh服务端不是默认的22号端口,要用选项-oPORT指定
cd:切换远程目录
lcd:切换本地目录
[root@node1 ~]# sftp -oPORT=7796 [email protected] Connecting to 192.168.30.20... sftp> help Available commands: bye Quit sftp cd path Change remote directory to 'path' chgrp grp path Change group of file 'path' to 'grp' chmod mode path Change permissions of file 'path' to 'mode' chown own path Change owner of file 'path' to 'own' df [-hi] [path] Display statistics for current directory or filesystem containing 'path' exit Quit sftp get [-P] remote-path [local-path] Download file help Display this help text lcd path Change local directory to 'path' lls [ls-options [path]] Display local directory listing lmkdir path Create local directory ln oldpath newpath Symlink remote file lpwd Print local working directory ls [-1aflnrSt] [path] Display remote directory listing lumask umask Set local umask to 'umask' mkdir path Create remote directory progress Toggle display of progress meter put [-P] local-path [remote-path] Upload file pwd Display remote working directory quit Quit sftp rename oldpath newpath Rename remote file rm path Delete remote file rmdir path Remove remote directory symlink oldpath newpath Symlink remote file version Show SFTP version !command Execute 'command' in local shell ! Escape to local shell ? Synonym for help sftp> ls tesla.txt sftp> get tesla.txt /tmp/test Fetching /home/tesla/tesla.txt to /tmp/test/tesla.txt sftp> quit [root@node1 ~]# ls /tmp/test tesla.txt
4、openssh的服务器端:
服务脚本:/etc/rc.d/init.d/sshd
脚本配置文件:/etc/sysconfig/sshd
配置文件:/etc/ssh/sshd_config
配置参数:(man sshd_config)
Port:修改默认监听的端口
ListenAddress
★为安全起见,在网络上提供ssh服务的主机应尽量不要使用众所周知的22号端口,容易被暴力攻击;使用 lastb 命令可查看最近登录系统失败的信息(该命令详见博客http://9124573.blog.51cto.com/9114573/1700512),还可查看/var/log/secure(只有管理员才有权限访问)获取详细信息
[root@node2 ~]# vim /etc/ssh/sshd_config ... #Port 22 #默认监听22号端口 port 7796 #修改监听的端口 #AddressFamily any #监听的地址家族(ipv4还是ipv6) #ListenAddress 0.0.0.0 #默认监听在本机所有地址(ipv4)上 #ListenAddress :: #默认监听在本机所有地址(ipv6)上 # Disable legacy (protocol version 1) support in the server for new # installations. In future the default will change to require explicit # activation of protocol 1 Protocol 2 #优先使用ssh v2 # HostKey for protocol version 1 #HostKey /etc/ssh/ssh_host_key #ssh v1所用的密钥指纹 # HostKeys for protocol version 2 #HostKey /etc/ssh/ssh_host_rsa_key #HostKey /etc/ssh/ssh_host_dsa_key # Lifetime and size of ephemeral version 1 server key #KeyRegenerationInterval 1h #对称密钥每隔一小时换一次 #ServerKeyBits 1024 # Logging # obsoletes QuietMode and FascistLogging #SyslogFacility AUTH SyslogFacility AUTHPRIV #LogLevel INFO # Authentication: #LoginGraceTime 2m #等待客户端执行登录操作的时长 #PermitRootLogin yes #是否允许以管理员身份直接登录;建议改为no,以普通用户登录后再su到管理员 #StrictModes yes #MaxAuthTries 6 #最大尝试次数,避免暴力攻击 #MaxSessions 10 #最大ssh会话数 #RSAAuthentication yes #PubkeyAuthentication yes #是否支持公钥认证 #AuthorizedKeysFile .ssh/authorized_keys #认证客户端的密钥文件 #AuthorizedKeysCommand none #AuthorizedKeysCommandRunAs nobody ... #ClientAliveInterval 0 #客户端空闲时长,超时则自动断开 #ClientAliveCountMax 3 #允许客户端空闲的次数 #ShowPatchLevel no #UseDNS yes #PidFile /var/run/sshd.pid #MaxStartups 10:30:100 #PermitTunnel no #ChrootDirectory none # no default banner path #Banner none # override default of no subsystems Subsystem sftp /usr/libexec/openssh/sftp-server #默认启用sftp功能 # Example of overriding settings on a per-user basis #Match User anoncvs # X11Forwarding no # AllowTcpForwarding no # ForceCommand cvs server [root@node2 ~]# service sshd restart #修改服务监听的端口或地址后要重启服务,而其它修改通常只需reload即可 Stopping sshd: [ OK ] Starting sshd: [ OK ] [root@node2 ~]# netstat -tnl #可以看到7796端口已被监听 Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:7796 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:49951 0.0.0.0:* LISTEN tcp 0 0 :::111 :::* LISTEN tcp 0 0 :::49553 :::* LISTEN tcp 0 0 :::7796 :::* LISTEN tcp 0 0 ::1:631 :::* LISTEN tcp 0 0 ::1:6010 :::* LISTEN [root@node2 ~]# iptables -R INPUT 4 -p tcp --dport 7796 -j ACCEPT #若有开启防火墙,还要修改防火墙规则 [root@node2 ~]# logout ... [c:\~]$ ssh 192.168.30.20 7796 #指定新的端口重新登录 Connecting to 192.168.30.20:7796... Connection established. To escape to local shell, press 'Ctrl+Alt+]'. Last login: Tue Nov 24 19:46:16 2015 from 192.168.30.1 [root@node2 ~]#
5、sshd认证客户端的方式:
(1)基于口令的认证
(2)基于密钥的认证
①客户端生成密钥对
# ssh-keygen -t rsa
常用选项:
-f /path/to/somefile:密钥文件保存位置;默认位于当前用户家目录下的.ssh目录中
-P '':指定oldpassword
生成的密钥默认为id_rsa, id_rsa.pub
②将公钥信息导入到远程主机某个用户家目录下的 .ssh/authorized_keys 文件中
方式有两种:
㈠客户端:scp -P 7796 .ssh/id_rsa.pub 用户@192.168.30.20:用户的家目录
服务器端:cat id_rsa.pub >> .ssh/authorized_keys
㈡ssh-copy-id -i .ssh/id_rsa.pub USERNAME@HOST
如果远程主机不是监听在默认的22号端口,则要指明端口:
ssh-copy-id -i .ssh/id_rsa.pub '-p PORT USERNAME@HOST'
示例:以下node2为openssh服务端,node1为客户端
[root@node1 ~]# ssh-keygen -t rsa #生成密钥对 Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: ca:8c:ba:06:7a:33:58:73:54:fe:f1:f6:59:89:a7:d0 root@node1 The key's randomart image is: +--[ RSA 2048]----+ | | | . | | o | | . . . | | . .So . . . | |. o .+ .. + E + | |.+ o. + . o = | |o =. + | | oo+ | +-----------------+ [root@node1 ~]# ls .ssh id_rsa id_rsa.pub known_hosts [root@node1 ~]# ll .ssh total 12 -rw------- 1 root root 1675 Nov 24 21:23 id_rsa -rw-r--r-- 1 root root 392 Nov 24 21:23 id_rsa.pub -rw-r--r-- 1 root root 395 Nov 24 09:51 known_hosts [root@node1 ~]# scp -P 7796 .ssh/id_rsa.pub 192.168.30.20:/root #第一种方式,将公钥先传给远程主机的某个用户 [email protected]'s password: id_rsa.pub 100% 392 0.4KB/s 00:00 [root@node1 ~]# ssh-copy-id -i .ssh/id_rsa.pub '-p 7796 [email protected]' #第二种方式,直接将公钥信息导入远程主机某个用户的.ssh/authorized_keys文件中 [email protected]'s password: Now try logging into the machine, with "ssh '-p 7796 [email protected]'", and check in: .ssh/authorized_keys to make sure we haven't added extra keys that you weren't expecting. [root@node1 ~]# ssh -p 7796 [email protected] #不用再输密码了 Last login: Fri Nov 27 03:30:38 2015 from 192.168.30.1 [tesla@node2 ~]$ logout Connection to 192.168.30.20 closed.
[root@node2 ~]# ls anaconda-ks.cfg boot.iso digest Downloads httpd.crt id_rsa.pub install.log.syslog key2 messages.cipher Pictures Templates test.sh vmware-tools-distrib awk.txt Desktop Documents fstab httpd.csr install.log key1 messages Music Public test Videos [root@node2 ~]# cat id_rsa.pub >> .ssh/authorized_keys #将客户端传来的公钥信息追加至.ssh/authorized_keys中 [root@node2 ~]# cat .ssh/authorized_keys ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAzMvlCKm+I3UgisZAak3Os6MTcNaC2mtP8H31L+mf0m+hsrq1fXk+QTMPsel1NHkPF5k3p3aMzbar+xpw57Tv97/amnhFATDA+rFCwT6bHyoxV2z+UhlhAFPGzin9bbBsBAqnxtNxuCDdQPUpXgbmz7zF3Impy/386Xt03fO3nnbcVnF5n6kMQ1tMD7x0ldPaR6N5kc92FtFMPrEKBiponsck8duW+73zHk9alcK0Q8e7Y+KFcMJtJogQsWjzjBbcunDLpzmHN3qAFna9sHQ93Xxy2WRuqfcJT/kYBWTHWHm7i+xW+fKhbvvuKRARXH8nVCdumELE44xACoPbCKIThQ== root@node1 [root@node2 ~]# ll .ssh total 8 -rw-r--r-- 1 root root 392 Nov 27 22:59 authorized_keys -rw-r--r-- 1 root root 395 Nov 27 19:02 known_hosts [root@node2 ~]# chmod 600 .ssh/authorized_keys #通常应缩小.ssh/authorized_keys的访问权限
[root@node1 ~]# ssh -p 7796 [email protected] #可以不输密码连接了 Last login: Sat Nov 28 00:06:48 2015 from 192.168.30.1 [root@node2 ~]#
7、ssh实践建议:
①不要使用默认的22号端口
②不要使用protocol 1
③限制可登录的用户
在sshd配置文件中:
白名单:
AllowUsers user1 user2 ...
AllowGroups grp1 grp2...
黑名单:
DenyUsers
DenyGroups
④设定空闲会话超时时长
ClientAliveInterval 300
ClientAliveCountMax 0
⑤利用防火墙设置ssh访问策略;
⑥仅监听在特定的IP地址上,而非本机所有的IP地址;
⑦使用强密码策略
# tr -dc A-Za-z0-9_ < /dev/urandom | head -c 30 | xargs
⑧使用基于密钥的认证;
⑨禁止使用空密码;
⑩禁止root用户直接登录;
⒒限制ssh的访问频度
⒓做好日志,经常分析;