一、SSH服務
1、ssh簡介:
ssh: secure shell, protocol, 22/tcp, 安全的遠程登錄? ? ?安全高于telnet,被抓包也不會泄露
具體的軟件實現:
OpenSSH: ssh協議的開源實現,CentOS默認安裝
dropbear:另一個開源實現
SSH協議版本
v1: 基于CRC-32做MAC,不安全;man-in-middle
v2:雙方主機協議選擇安全的MAC方式
基于DH算法做密鑰交換,基于RSA或DSA實現身份認證
兩種方式的用戶登錄認證:
基于password
基于key? ? (掌握?。。∩a中常用)
2、Openssh軟件組成
相關包:
openssh
openssh-clients????客戶端
openssh-server???服務器端
工具:
基于C/S結構
Client: ssh,scp,sftp,slogin
Windows客戶端: xshell,putty,SecureCRT,sshsecureshellclient
Server: sshd
3、ssh客戶端
客戶端組件:
ssh, 配置文件:/etc/ssh/ssh_config??????服務器端文件/etc/ssh/sshd_config
Host PATTERN
StrictHostKeyChecking no 首次登錄不顯示檢查提示
CheckHostIP no? 檢查遠程連接的主機是否可信賴,根據第一次連接時遠程主機的秘鑰對(/root/.ssh/known_hosts),防止假冒;
補充:若要假冒,盜取對方的私鑰文件 /etc/ssh/ssh_host_rsa_key,屬組改成ssh_keys(參考別的秘鑰對)
?4、獲取關于服務配置文件的幫助:man sshd_config
/etc/ssh/sshd_config配置文件簡介:(#開始的選項表示默認值)
Port 22 ?指明ssh服務監聽的端口? ??修改之后不影響已連接用戶,新連接要更改
ListenAddress IP_ADDR ?表示監聽的地址,可出現多次? ? ? ? ? 0.0.0.0表示當前主機的所有地址
SyslogFacility AUTHPRIV? ?日志存放路徑,/etc/rsyslog.conf文件中有相關定義,此處表示/var/log/secure
LogLevel INFO ?表示定義記錄的日志級別
PermitRootLogin yes|no ?是否允許管理員以ssh登錄? 生產中常禁止no
MaxAuthTries 6 ?表示認證時的重試次數,為此數字的一半,超過次數后會被鎖定一定時間
MaxSessions 10? ??同一個連接最大會話? ? 即一個連接最多開幾個克隆
AllowUsers ?接受那些用戶使用ssh,做用戶白名單,只要不在此名單內的用戶,都不允許登錄
如:AllowUsers nwc1 nwc2 nwc3 root
DenyUsers ?不允許那些用戶使用ssh,用戶黑名單? ? ?優先級高于白名單
AllowGroups ?接受那些用戶組使用ssh,組的白名單
DenyGroups ?不允許那些用戶組使用ssh,組黑名單
白名單和黑名單不要同時使用
X11Forwarding yes|no ?是否轉發圖形窗口
#ServerKeyBits 1024 密鑰長度
#LoginGraceTime 2m 登陸寬限期
#PermitRootLogin yes? ? root是否可以登錄
#StrictModes yes 嚴格模式,檢查 .ssh/文件的所有者,權限等
PasswordAuthentication yes 是否使用用戶名和密碼的方式,可禁用,基于key更安全
PubkeyAuthentication yes? ??是否允許公鑰認證
Kerberos??集中認證管理
5、SSH服務的最佳實踐方案:
1)禁止使用protocol version 1????禁止使用老版本
2)限定僅允許哪些用戶訪問ssh服務
白名單 ? ? ? Allowusers root vivek jerry
黑名單? ? ? ?DenyUser saroj anjali foo
3)配置空閑會話超時長
ClientAliveCountMax ?0
ClientAliveInterval ?300
4)使用iptables設置ssh服務安全訪問策略
5)改變默認的端口和監聽的IP? ?勿使用默認22端口?。。?/span>
port 300
ListenAddress 192.168.1.5
ListenAddress 202.54.1.5
6)使用基于密鑰的認證
7)禁止空密碼登錄
8)禁止root用戶直接登錄
9)限制ssh訪問頻度
10)記錄好日志,經常做日志分析? ? ? ??lastb命令查看訪問失敗記錄
11)基于口令認證時,使用強密碼策略???tr -dc A-Za-z0-9_ < /dev/urandom | head -c 30| xargs
6、用戶登錄信息的獲?。?/strong>
/var/log/wtmp ?用戶成功登錄的日志信息,也可直接用?last?命令顯示
/var/log/btmp ?用戶失敗登錄的日志信息,也可用 lastb 命令顯示
??lastlog 每個用戶最近一次成功登錄的信息
7、客戶端ssh命令
格式:ssh [user@]host [COMMAND]??可以連接與命令一步執行
ssh [-l user] host [COMMAND]
-p port? ??遠程服務器監聽的端口
-b? ? ? ? ?指定連接的源IP
-v? ? ? ? ??調試模式???查看連接過程
-C?? ? ? ? ?壓縮方式???局域網一般帶寬夠,不用
-X? ? ? ? ? 支持x11轉發?????支持使用所連接主機上的圖形工具,例:xclock (centos6.9有此命令)
-Y?? ? ? ? ?支持信任x11轉發
ForwardX11Trusted yes
-t? ? ? ? ? ?強制偽tty分配???堡壘機/跳板機:做記錄
? ? ? ? ? ? ? ? ?例:ssh -t host1?ssh?host2
? ? ? ? ? ? ? ? ? 本機無法直連host2,以host1做跳板連接host2
8、ssh服務登錄驗證
- 基于用戶和口令登錄驗證
1 客戶端發起ssh請求,服務器會把自己的公鑰發送給用戶
2 用戶會根據服務器發來的公鑰對密碼進行加密
3 加密后的信息回傳給服務器,服務器用自己的私鑰解密,如果密碼正確,則用戶登錄成功
- 基于密鑰的登錄方式
1 首先在客戶端生成一對密鑰(ssh-keygen)
2 并將客戶端的公鑰ssh-copy-id 拷貝到服務端
3 當客戶端再次發送一個連接請求,包括ip、用戶名
4 服務端得到客戶端的請求后,會到authorized_keys中查找,如果有響應的IP和用戶,就會隨機生成一個字符串,例如:acdf
5 服務端將使用客戶端拷貝過來的公鑰進行加密,然后發送給客戶端
6 得到服務端發來的消息后,客戶端會使用私鑰進行解密,然后將解密后的字符串發送給服務端
7服務端接受到客戶端發來的字符串后,跟之前的字符串進行對比,如果一致,就允許免密碼登錄
- 基于密鑰的認證:? 須掌握!??!
(1) 在客戶端生成密鑰對
ssh-keygen?[-t rsa??[-P ”] [-f “~/.ssh/id_rsa”]?] 交互,-t指定加密方法,可不寫 -f生成指定文件
(2) 把公鑰文件傳輸至遠程服務器對應用戶的家目錄
ssh-copy-id [-i [identity_file]] [user@]host
?-i指定公鑰所在文件,這里寫私鑰文件會自動發送公鑰,不寫文件系統也會默認搜尋
(3) 測試? :scp文件過去不用輸入密碼
(4) 在SecureCRT或Xshell實現基于key驗證
在SecureCRT工具—>創建公鑰—>生成Identity.pub文件
轉化為openssh兼容格式,并復制到需登錄主機上相應文件authorized_keys中,注意權限必須為600,在需登錄的ssh主機上執行:
ssh-keygen -i -f Identity.pub >> .ssh/authorized_keys
注意!Xshell中生成的文件不需要轉化格式,直接復制上述文件中,其它步驟同上。
(5)重設私鑰口令:
ssh-keygen -p?交互式命令
(6)驗證代理(authentication agent)保密解密后的密鑰
這樣口令就只需要輸入一次
在GNOME中,代理被自動提供給root用戶
否則運行ssh-agent bash???????重啟后服務關閉,手動開啟
(7)鑰匙通過命令添加給代理
ssh-add???交互命令
二、基于SSH的客戶端相關工具
1、scp命令
相同的文件傳多少遍都會再次整個傳,效率較低
兩種方式:
scp [options] [user@]host:/sourcefile /destpath?從別處傳文件到自己的指定目錄下
scp [options] /sourcefile [user@]host:/destpath??傳文件給別人指定目錄下
常用選項:
-C? ? ? 壓縮數據流
-r? ? ? ?遞歸復制
-p? ? ? 保持原文件的屬性信息
-q? ? ? ?靜默模式
-P PORT? ? ? ?指明remote host的監聽的端口???目標服務器的端口不是標準端口時
2、rsync命令
基于ssh和rsh服務實現高效率的遠程系統之間復制文件
使用安全的shell連接做為傳輸方式
? ? ? ? rsync –av?/etc server1:/tmp 復制目錄和目錄下文件
rsync –av /etc/ server1:/tmp 只復制目錄下文件
比scp更快,只復制不同的文件??效率更高 ?增量型復制
常用選項:
-n 模擬復制過程
-v 顯示詳細過程
-r 遞歸復制目錄樹
-p 保留權限
-t 保留時間戳
-g 保留組信息
-o 保留所有者信息
-l 將軟鏈接文件本身進行復制(默認)
-L 將軟鏈接文件指向的文件復制
-a 存檔,相當于–rlptgoD,但不保留ACL(-A)和SELinux屬性(-X)
?
3、sftp命令
交互式文件傳輸工具
用法和傳統的ftp工具相似
利用ssh服務實現安全的文件上傳和下載
使用ls cd mkdir rmdir pwd get put等指令,可用?或help獲取幫助信息
sftp [user@]host
sftp> help
4、pssh工具
pssh是一個python編寫可以在多臺服務器上執行命令的工具,也可實現文件復制
選項如下:
–version:查看版本
-h:主機文件列表,內容格式”[user@]host[:port]”
-H:主機字符串,內容格式”[user@]host[:port]”
連接多個主機 -H XX -H XX或-H XX XX用空格分開
-l:登錄使用的用戶名
-p:并發的線程數【可選】
-o:輸出的文件目錄【可選】
-e:錯誤輸入文件【可選】
-t:TIMEOUT 超時時間設置,0無限制【可選】
-O:SSH的選項
-v:詳細模式
-A:手動輸入密碼模式???若基于key驗證后不用這個
-x:額外的命令行參數使用空白符號,引號,反斜線處理
-X:額外的命令行參數,單個參數模式,同-x
-i:每個服務器內部處理信息輸出
-P:打印出服務器返回信息
5、PSCP.PSSH命令
pscp.pssh功能是將本地文件批量復制到遠程主機
pscp [-vAr] [-h hosts_file] [-H [user@]host[:port]] [-l user] [-p par] [-o outdir] [-e errdir]?[-t timeout] [-O options] [-x args] [-X arg] local remote
Pscp-pssh選項
-v 顯示復制過程
-a 復制過程中保留常規屬性
-r 遞歸復制目錄
示例:
將本地curl.sh 復制到/app/目錄
pscp.pssh -h host.txt /root/test/curl.sh /app/???本機文件 ?批量主機指定目錄
將本地多個文件批量復制到/app/目錄
pscp.pssh -H 192.168.1.10 /root/f1.sh /root/f2.sh /app/
將本地目錄批量復制到/app/目錄
pscp.pssh -H 192.168.1.10 -r /root/test/ /app/
6、PSLURP.PSSH命令
pslurp.pssh功能是將遠程主機的文件批量復制到本地
pslurp [-vAr] [-h hosts_file] [-H [user@]host[:port]] [-l user] [-p par][-o?outdir] [-e errdir] [-t timeout] [-O options] [-x args] [-X arg] [-L localdir]
remote local(本地名)
Pslurp-pssh選項
-L 指定從遠程主機下載到本機的存儲的目錄,local是下載到本地后的名稱
-r 遞歸復制目錄
-h ?IP地址匯總文件,同上
示例:
批量下載目標服務器的passwd文件至/app下,并更名為user
pslurp -H 192.168.1.10 -L /app/ /etc/passwd user指定本機目錄 遠程主機文件 文件在本機上新名
三、SSH端口轉發
1、SSH端口轉發
? ? ? SSH 會自動加密和解密所有 SSH 客戶端與服務端之間的網絡數據。但是,SSH還能夠將其他 TCP 端口的網絡數據通過 SSH 鏈接來轉發,并且自動提供了相應的加密及解密服務。這一過程也被叫做“隧道”(tunneling),這是因為 SSH 為其他 TCP 鏈接提供了一個安全的通道來進行傳輸而得名。例如,Telnet,SMTP,LDAP 這些 TCP 應用均能夠從中得益,避免了用戶名,密碼以及隱私信息的明文傳輸。而與此同時,如果工作環境中的防火墻限制了一些網絡端口的使用,但是允許 SSH 的連接,也能夠通過將 TCP 端口轉發來使用 SSH 進行通訊。
SSH 端口轉發能夠提供兩大功能:
加密 SSH Client 端至 SSH Server 端之間的通訊數據
突破防火墻的限制完成一些之前無法建立的 TCP 連接
2、本地轉發:(本機在外網,目標是訪問公司內網某臺服務器)
?-L localport:remotehost:remotehostport sshserver
注釋:本機連接本機端口:遠程主機地址:遠程主機端口號 中間服務器地址
選項:
-f? ? 后臺啟用???啟用后臺退出只能ps aux|grep ssh,kill進程號,不啟用后臺會變成前臺等待狀態
-N 不打開遠程shell,處于等待狀態???不自動登錄中間主機
-g 啟用網關功能
示例
ssh –L 9527:telnetsrv:23 -N sshsrv?客戶端連接本機端口:遠程主機地址:遠程主機端口號 中間服務器地址
telnet 127.0.0.1 9527
過程簡介:當訪問本機的9527的端口時,被加密后轉發到sshsrv的ssh服務,再解密被轉發到telnetsrv:23
即:data —?localhost:9527本機端口—?localhost:XX本機另開端口—?sshsrv:22 —?sshsrv:YY中間主機—?telnetsrv:23?遠程主機,端口
補充:不讓用root賬號連接,只能普通用戶
3、遠程轉發: (本機在內網,目標是讓外網的客戶端訪問內部某臺服務器)
?-R sshserverport:remotehost:remotehostport sshserver外界機端口:右邊主機IP:右邊主機端口?外界主機IP
示例:
ssh –R 9527:telnetsrv:23 –N sshsrv
過程簡介:讓sshsrv偵聽9527端口的訪問,如有訪問,就加密后通過ssh服務轉發請求到本機ssh客戶端,再由本機解密后轉發到telnetsrv:23
即:Data? ? sshsrv:9527互聯網機? ?sshsrv:22互聯網機? ? ?localhost:XXX本機? ? ? ?localhost:YYY本機? ? ? telnetsrv:23目標服務器
4、動態端口轉發:
當用firefox訪問internet時,本機的1080端口做為代理服務器,firefox的訪問請求被轉發到sshserver上,由sshserver替之訪問internet
ssh -D 1080 root@sshserver
在本機firefox設置代理socket proxy:127.0.0.1:1080
curl –socks5 127.0.0.1:1080 http://www.qq.com
?
5、X 協議轉發
所有圖形化應用程序都是X客戶程序
能夠通過tcp/ip連接遠程X服務器
數據沒有加密機,但是它通過ssh連接隧道安全進行
ssh -X user@remotehost gedit?
remotehost主機上的gedit工具,將會顯示在本機的X服務器上
傳輸的數據將通過ssh連接加密
四、dropbear編譯安裝
ssh協議的另一個實現:dropbear
源碼編譯安裝:
1、安裝開發包組? ? yum -y groupinstall “Development tools”
2、下載源碼包? ? ?dropbear-2018.76.tar.bz2
3、解壓? ?tar xf dropbear-2018.76.tar.bz2
4、查看安裝幫助手冊? ? less INSTALL? |? README
5、進入解壓后目錄后 ./configure?–prefix=/data/dropbear/ –sysconfdir=/etc/dropbear/ ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?./configure? –help查看幫助
6、make PROGRAMS=”dropbear dbclient dropbearkey dropbearconvertscp”
指定要安裝的工具, 若scp安裝失敗,不影響
7、make install
啟動ssh服務:
8、ls /usr/local/sbin/ /usr/local/bin/
9、/usr/local/sbin/dropbear -h
10、mkdir /etc/dropbear
11、dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key -s 2048
12、或者dropbearkey -t dss -f /etc/dropbear/dropbear_dsa_host_key
13、dropbear -p :2222 -F –E #前臺運行
? ?因為本機有SSH,為了避免端口沖突,手動指定其運行在2222端口
dropbear -p :2222 #后臺運行
客戶端訪問:
14、ssh -p 2222 root@127.0.0.1
15、dbclient -p 2222 root@127.0.0.1
五、AIDE
當一個入侵者進入了你的系統并且種植了木馬,通常會想辦法來隱蔽這個木馬(除了木馬自身的一些隱蔽特性外,他會盡量給你檢查系統的過程設置障礙),通常入侵者會修改一些文件,比如管理員通常用ps -aux來查看系統進程,那么入侵者很可能用自己經過修改的ps程序來替換掉你系統上的ps程序,以使用ps命令查不到正在運行的木馬程序。如果入侵者發現管理員正在運行crontab作業,也有可能替換掉crontab程序等等。所以由此可以看出對于系統文件或是關鍵文件的檢查是很必要的。目前就系統完整性檢查的工具用的比較多的有兩款:Tripwire和AIDE,前者是一款商業軟件,后者是一款免費的但功能也很強大的工具。
- AIDE(Advanced Intrusion Detection Environment)
- 高級入侵檢測環境)是一個入侵檢測工具,主要用途是檢查文件的完整性,審計計算機上的那些文件被更改過了。
- AIDE能夠構造一個指定文件的數據庫,它使用aide.conf作為其配置文件。AIDE數據庫能夠保存文件的各種屬性,包括:權限(permission)、索引節點序號(inode number)、所屬用戶(user)、所屬用戶組(group)、文件大小、最后修改時間(mtime)、創建時間(ctime)、最后訪問時間(atime)、增加的大小以及連接數。AIDE還能夠使用下列算法:
sha1、md5、rmd160、tiger,以密文形式建立每個文件的校驗碼或散列號.
- 這個數據庫不應該保存那些經常變動的文件信息,例如:日志文件、郵件、/proc文件系統、用戶起始目錄以及臨時目錄.
安裝? ? ? ?yum install aide
修改配置文件
- vim /etc/aide.conf (指定對哪些文件進行檢測)
/test/chameleon R
/bin/ps R+a
/usr/bin/crontab R+a
/etc PERMS
!/etc/mtab #“!”表示忽略這個文件的檢查
R=p+i+n+u+g+s+m+c+md5
權限+索引節點+鏈接數+用戶+組+大小+最后一次修改時間+創建時間+md5校驗值
NORMAL = R+rmd60+sha256
初始化默認的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
六、更改身份
su 切換身份:su –l username –c ‘command‘
sudo
來自sudo包
man 5 sudoers
sudo能夠授權指定用戶在指定主機上運行某些命令。如果未授權用戶嘗試使用 sudo,會提示聯系管理員
sudo可以提供日志,記錄每個用戶使用sudo操作
sudo為系統管理員提供配置文件,允許系統管理員集中地管理用戶的使用權限和使用的主機
sudo使用時間戳文件來完成類似“檢票”的系統,默認存活期為5分鐘的“入場券”
通過visudo命令編輯配置文件,具有語法檢查功能visudo –c 檢查語法
sodo相關文件:
配置文件:文件/etc/sudoers? ? ? 目錄?/etc/sudoers.d/?
?授權者建議寫在目錄下方便管理,授權之后普通用戶也不能直接使用命令,格式 sudo COMMAND
時間戳文件:?centos6? ?:/var/db/sudo/
centos7? :? /var/run/sudo/ts/??(目錄下生成授權對象名字的文件)
日志文件:/var/log/secure
配置文件支持使用通配符glob:
?? ? ?任意單一字符
*? ? ? ?匹配任意長度字符
[wxc]? ? ? ?匹配其中一個字符
[!wxc]? ? ? 除了這三個字符的其它字符
\x? ? ? ? ? ? ?轉義
[[alpha]]? ? ? ? ? ? 字母 示例: /bin/ls [[alpha]]*
配置文件規則有兩類:
1、別名定義:不是必須的
2、授權規則:必須的
授權規則格式:
user host=(runas) command??????
格式說明:
user: 運行命令者的身份?????????????????wang ALL=(mage) ALL ??mage有的權限wang都有
host: 通過哪些主機? ? ? ? ? ? ??
(runas):以哪個用戶的身份??????????? 不寫默認root
command: 運行哪些命令??????????????????wang ALL=(mage) NOPASSWD:ALL? ? ?不用輸口令
示例:
root ALL=(ALL) ALL
補充:??執行命令時要精確?sudo mount /dev/cdrom /mnt/少個符號都不行
sudo別名和示例
Users和runas:
username
#uid???????????例: #1001 ALL=(ALL) ALL
%group_name
%#gid
user_alias|runas_alias
host:
ip或hostname
network(/netmask)
host_alias
command:
command name
directory
sudoedit
Cmnd_Alias
別名有四種類型:User_Alias?,Runas_Alias?,Host_Alias ,Cmnd_Alias
別名格式:[A-Z]([A-Z][0-9]_)*???大寫字母開頭
別名定義:
Alias_Type NAME1 = item1, item2, item3 : NAME2 = item4, item5
?別名名字 = 組成。。。:別名名字 = 組成
示例1
User_Alias SYSADER=wang,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???這里沒寫Runas則默認root
DISKADER ALL=(OP) DSKCMD
示例2
User_Alias ADMINUSER = adminuser1,adminuser2
Cmnd_Alias ADMINCMD = /usr/sbin/useradd, /usr/sbin/usermod,/usr/bin/passwd [a-zA-Z]*,!/usr/bin/passwd root
ADMINUSER ALL=(root) NOPASSWD:ADMINCMD,PASSWD:/usr/sbin/userdel
示例3
Defaults:wang runas_default=tom
wang ALL=(tom,jerry) ALL???默認Tom,需要jerry時sudo -u jerry
示例4
wang 192.168.175.136,192.168.175.138=(root)?/usr/sbin/,!/usr/sbin/useradd
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 這里命令寫的目錄,則目錄下所有命令都可用
注意!若這樣授權? ?wang ALL=(ALL) /bin/cat /var/log/messages*? ?會有漏洞!
例: wang用戶執行? /bin/cat /var/log/messages? ?/etc/passwd? ? 后面的文件也可查看
要精確成以下格式:
防漏洞(!后面有空格)
sudo命令
ls -l /usr/bin/sudo
sudo –i –u wang 切換身份???依賴性較大,類似于su -,沒su 好用
sudo [-u user] COMMAND
-V 顯示版本信息等配置信息??編譯選項、配置文件等
-u user 默認為root
-l,ll 列出用戶在主機上可用的和被禁止的命令,格式不一樣,內容一樣,su – bican;sudo -l或-ll
-v 再延長密碼有效期限5分鐘,更新時間戳??su – bican ; sudo -v
-k 清除時間戳(1970-01-01),下次需要重新輸密碼
-K 與-k類似,還要刪除時間戳文件
-b 在后臺執行指令
-p 改變詢問密碼的提示符號
示例:-p ”password on %h for user %p:” ??%h 主機名 %p 用戶名
sudoedit命令,若授權普通用戶bican執行此命令/usr/bin/sudoedit,
bican ALL=(ALL) sudoedit;
su – bican;
sudoedit /var/run/sudo/ts可以直接編輯自己的權限,無敵!
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/99826