1. 程式人生 > >SSH遠程訪問及控制

SSH遠程訪問及控制

ssh 遠程訪問 sshd tcp wrappers 楊書凡

大多數企業服務器是通過遠程登錄的方式來進行管理的,如何更加安全、高效的遠程管理網絡中的各種服務器是作為網絡管理人員的必修課。這裏將針對Linux環境使用安全的SSH遠程管理途徑,以及通過TCP Wrappers機制為應用提供訪問控制


SSH(secure shell)是一種安全的通道協議,主要用來實現字符界面的遠程登錄、遠程復制等功能。SSH協議對通信雙方的數據傳輸進行了加密處理,其中包括用戶登錄時輸入的用戶口令,與早期的TELNET、RSH、RCP等應用相比,SSH協議提供了更好的安全性


配置OpenSSH服務端

在RHEL系統中,OpenSSH服務器的openssh等軟件包默認已經安裝,並已添加為系統服務,只需配置並啟動sshd服務,大部分用戶(擁有合法的登錄shell)都可以遠程登錄系統。sshd的配置文件位於/etc/ssh/sshd_config目錄下,正確調整相關配置項,有助於提高sshd遠程登錄的安全性

[root@localhost ~]# vim /etc/ssh/sshd_config 
Port 22                              //默認端口號22,必要時可修改
ListenAddress 192.168.1.1            //監聽地址
Protocol 2                           //使用SSH v2協議,比v1更安全
UseDNS no                            //禁用DNS反向解析,提高服務器響應速度

LoginGraceTime 2m                    //登錄驗證時間為2分鐘
PermitRootLogin yes                  //禁止root用戶登錄,用普通用戶登錄後,su切換為root更加安全
MaxAuthTries 6                       //最大重試次數為6
PermitEmptyPasswords no              //禁止空密碼用戶登錄

AllowUsers ysf [email protected]     //當只允許某些用戶登錄時
DenyUsers yangshufan                  //當只禁止某些用戶登錄時,註意兩者不要同時使用

PasswordAuthentication yes             //啟用密碼驗證
PubkeyAuthentication yes               //啟用密鑰對驗證
AuthorizedKeysFile      .ssh/authorized_keys      //指定公鑰庫數據文件

[root@localhost ~]# service sshd reload            //配置完後,需要更新服務
重新載入 sshd:                                            [確定]

當密碼驗證、密鑰對驗證都啟用時,服務器將優先使用密鑰對驗證。對於安全性較高的服務器,建議禁止密碼驗證方式,只允許密鑰對驗證方式;若沒有特殊要求,則兩種都可以啟用



使用SSH客戶端程序

在Linux系統中,SSH客戶端默認已安裝,其中包括ssh、scp、sftp等命令。實際上,任何支持SSH協議的客戶端程序都可以與OpenSSH服務器進行通信,如Windows平臺中的Xshell、SecureCRT、Putty等圖形工具。

(1)ssh遠程登錄

通過ssh命令,可以遠程登錄sshd服務,為用戶提供一個安全的shell環境,以便對服務器進行管理和維護

[root@localhost ~]# ssh [email protected]           //如果不是默認端口,需要使用"-p 端口號"
Are you sure you want to continue connecting (yes/no)? yes         //第一次連接,必須輸入yes
[email protected]'s password:                       //輸入密碼
Last login: Thu Dec 28 05:01:52 2017 from 192.168.1.2
[ysf@localhost ~]$


(2)scp遠程復制

通過scp命令可以利用SSH安全連接與遠程主機互相復制文件

[root@localhost ~]# scp /etc/passwd  [email protected]:/root/passwd.txt       //將本地文件復制到遠程主機
[email protected]'s password: 
passwd                                                100% 1915     1.9KB/s   00:00  
[root@localhost ~]# scp -r [email protected]:/home/   /opt                  //將遠程主機的home目錄復制到本地
[email protected]'s password: 
.bash_profile                                         100%  176     0.2KB/s   00:00    
.bash_logout                                          100%   18     0.0KB/s   00:00    
[root@localhost ~]#


(3)sftp安全FTP

通過sftp命令可以利用SSH安全連接與遠程主機上傳、下載文件,采用了與FTP類似的登陸過程和交互式環境,便於管理資源

[root@localhost ~]# sftp [email protected]
Connecting to 192.168.1.1...
[email protected]'s password: 
sftp> help
sftp> bye
[root@localhost ~]#



使用密鑰對驗證SSH的方式

密鑰對驗證方式可以為遠程登錄提供更好的安全性,下面將介紹在Linux服務器、客戶機中構建密鑰對驗證SSH體系的基本過程,如下圖所示:

技術分享圖片

1. 在客戶機創建密鑰對

[yang@localhost ~]$ ssh-keygen -t rsa                    //ssh-keygen工具為當前用戶創建密鑰對文件,rsa為加密算法,也可以為dsa加密算法
Generating public/private rsa key pair.
Enter file in which to save the key (/home/yang/.ssh/id_rsa):            //指定私鑰位置,按Enter鍵確定
Created directory '/home/yang/.ssh'.
Enter passphrase (empty for no passphrase):                              //設置私鑰密碼,也可以設置為空,實現無密碼登錄,但使用密碼更加安全
Enter same passphrase again:                                             //確認密碼
Your identification has been saved in /home/yang/.ssh/id_rsa.

[yang@localhost ~]$ ls -lh ~/.ssh/id_rsa*                           //確認生成的密鑰文件
-rw-------. 1 yang yang 1.8K 12月 29 08:47 /home/yang/.ssh/id_rsa          //私鑰文件,不能泄露
-rw-r--r--. 1 yang yang  408 12月 29 08:47 /home/yang/.ssh/id_rsa.pub      //公鑰文件,用來提供給服務器


2. 將公鑰上傳至服務器

3. 在服務器中導入公鑰文本

上面兩個步驟有兩種方式完成導入:

方式一:命令格式如下

ssh-copy-id -i 公鑰文件 目標主機用戶@目標主機

[yang@localhost ~]# ssh-copy-id -i .ssh/id_rsa.pub [email protected]
[email protected]'s password:              //輸入ysf的密碼
Now try logging into the machine, with "ssh '[email protected]'", and check in:
  .ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
[ysf@localhost ~]#        //驗證密碼後,會將公鑰自動添加到宿主目錄下的.ssh/authorized_keys


方式二:使用FTP、scp等方式上傳到服務器,在將文件導入到目標用戶的公鑰數據庫

[yang@localhost ~]$ scp .ssh/id_rsa.pub [email protected]:/tmp         //使用scp命令上傳到服務器
[email protected]'s password:                                          //輸入服務器root的密碼
Could not chdir to home directory /home/ysf: No such file or directory
id_rsa.pub                                            100%  408     0.4KB/s   00:00    
[yang@localhost ~]$ ssh  [email protected]                    //遠程登錄到服務器
[email protected]'s password: 
[root@localhost ~]# mkdir /home/ysf/.ssh                //將公鑰導入到公鑰數據庫
[root@localhost ~]# cat /tmp/id_rsa.pub >> /home/ysf/.ssh/authorized_keys       
[root@localhost ~]# ls -l /home/ysf/.ssh/authorized_keys          //註意:公鑰庫文件的權限必須是root用戶或宿主用戶
-rw-rw-r--. 1 ysf ysf 408 12月 29 10:01 .ssh/authorized_keys


4. 在客戶端上使用密鑰對驗證

[yang@localhost ~]$ ssh [email protected]
Enter passphrase for key '/home/yang/.ssh/id_rsa':            //輸入私鑰密碼,如未設置密碼,則直接登錄服務器
Last login: Fri Dec 29 10:57:12 2017 from 192.168.1.2
[ysf@localhost ~]$



TCP Wrappers訪問控制

TCP Wrappers將其他TCP服務程序包裹起來,增加了一個安全檢測過程,外來的連接請求必須先通過這層安全檢測,獲得許可後才能訪問真正的服務程序。對於大多數Linux發行版,TCP Wrappers是默認提供的功能。

技術分享圖片


1. 策略的配置格式

TCP Wrappers機制的保護對象為各種網絡服務程序,針對訪問服務程序的客戶機地址進行訪問控制。對應的策略文件為/etc/hosts.allow和/etc/hosts.deny,分別提供允許和拒絕的要求

配置格式如下:

服務程序列表:客戶機地址列表


其中,

(1)服務程序列表分為以下幾類:

ALL:代表所有服務

單個服務程序:如“sshd”

多個服務程序組成的列表:如“httpd,sshd”,以逗號分隔


(2)客戶機地址列表分為以下幾類:

ALL:代表任何客戶機服務

LOCAL:代表本機地址

單個IP地址:如“192.168.1.1”

網絡段地址:如“192.168.1.0/255.255.255.0”或者“192.168.1.”

域名:如“.ysf.com”匹配ysf.com域中的所有主機

通配符*、?:前者代表任意長度字符,後者僅代表一個字符

多個客戶機地址組成的列表:如“192.168.1.1,172.16.10.,.ysf.com”


2. 訪問控制的基本原則

(1)技術分享圖片先檢查hosts.allow,找到匹配則允許訪問

(2)技術分享圖片否則再檢查hosts.deny,找到則拒絕訪問

(3)技術分享圖片若兩個文件中均無匹配策略,則默認允許訪問


實際使用TCP Wrappers機制時,較為寬松的策略可以是“允許所有,拒絕個別”,較為嚴格的可以是“允許個別,拒絕所有”。前者只需在hosts.deny文件中添加相應的策略;而後者需要在hosts.allow中添加允許策略外,還要在hosts.deny文件中添加“ALL:ALL”的拒絕策略


例如:

1)技術分享圖片僅允許從主機61.63.65.67,網段192.168.2.0/24 地址訪問sshd服務 ,技術分享圖片禁止其他所有地址訪問受保護的服務

2)拒絕192.168.2.2訪問httpd服務

[root@localhost ~]# vim /etc/hosts.allow
sshd:61.63.65.67,192.168.2.*

[root@localhost ~]# vim /etc/hosts.deny
sshd:ALL
httpd:192.168.2.2



SSH遠程訪問及控制