Linux安全管理
ssl 功能
機密性 認證 完整性 重放保護
TLS協議工作在應用層的下層傳輸層的上層
TLS協議(也是大的協議集合)
Handshake協議:協商 服務器身份驗證 密鑰交換
ChangeCipherSpec協議:代表握手階段已經完成 會發送消息通知
Alert協議:警報 warning(警告) fatal(高度危險)
Record協議:對消息認證和完整性保護 加密等
HTTPS協議:和ssl/tls協議的組合
https工作過程
1 客戶端發送hello消息給服務器
2 服務器將CA簽過名的私鑰證書發送給客戶端
3 客戶端擁有CA的公鑰就可以解開CA簽過名的私鑰證書 從而得到服務器公鑰
4 客戶端隨機生成對稱密鑰 使用解密出來的服務器公鑰加密再發送給服務器
5 服務器收到後使用自己的私鑰解密獲取對稱密鑰
6 雙方都擁有了對稱密鑰就可以使用對稱密鑰加密
支持ssl功能的Openssl
openssl命令
對稱加密:
工具:enc
幫助:man enc
openssl enc -e -des3 -a -salt -in fstab -out fstab.des3(將fstab文件使用對稱秘鑰進行加密)
-a:使用base64編碼
-e:加密
-des3:使用des3算法加密
-out:將加密後的文件生成為一個新的文件
-salt:指定鹽
解密:
openssl enc -d -des3 -a -salt -in fstab.des3 -out fstab
-d:解密
-salt:指定鹽(隨機字符中第二個$到第三個$之間的值成為鹽)
生成文件hash值
工具:dgst
幫助:man dgst
openssl dgst -md5[-hex] fstab(生成此文件的hash值)
-hex:默認,16進制
生成用戶密碼
passwd
-1:代表md5
openssl passwd -1(生成密碼的md5值)
生成隨機數
幫助:man sslrand
openssl rand -base64 10(隨機生成10位的base64的字符)
-base64位置可以替換不同的編碼格式;當換成hex時那麽每個字符為16進制,相當於4位二進制,出現的字符數要x2
生成私鑰加密
(umask 066;openssl genrsa -out test.key 2048)
(umask 066;openssl genrsa -out test2.key -des3 4096)將生成的私鑰文件使用對稱算法加密
-out:生成後的私鑰文件名稱
2048:長度 可自行修改
-des3:對稱算法加密
修改umask值 這樣生成的文件默認權限就為600提高安全性 如果不在括號中執行後續創建的文件默認權限都會為600 括號的含義是在子shell中執行 不影響後續創建文件的操作
解密被加密的私鑰
openssl rsa -in test2.key -out test2.key.out
選項含義同上
從私鑰中提取公鑰
openssl rsa -in test.key -pubout -out test.key2.pub
-in:從test.key文件
-pubout:輸出
-out:到test.key2.pub
生成隨機數
根據鍵盤和鼠標的操作生成隨機數
/dev/random:生成隨機數的文件 並且需要操作鼠標和鍵盤才能生成隨機數
/dev/urandom:不停的生成隨機數
cat /dev/urandom | tr -dc '[:alnum:]' | head -c30 由於/dev/urandom中會不斷的生成隨機數 於是要使用"tr"取除了數字的所有隨機數 並且取前30個字節
CA的搭建
建立私有CA:
OpenCA
openssl
證書申請以及簽署步驟:
1 生成申請請求
2 RA核驗
3 CA簽署
4 獲取證書
/etc/pki/tls/openssl.cnf : openssl生成證書需要用到的配置文件
1 創建所需要的文件
touch /etc/pki/CA/index.txt 生成證書數據庫文件
echo 01 > /etc/pki/CA/serial 指定第一個頒發證書的序列號
2 搭建CA
生成私鑰
cd /etc/pki/CA/ #生成的私鑰必須要在這個目錄下 並且私鑰名比喻為cakey.pem
(umask 066;openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)
生成自簽名證書
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3650
-new:生成新證書請求
-x509:用於自簽證書
-key:生成請求時用到的私鑰文件
-days 3650(以天為單位):證書的有限期限
-out:證書保存路徑
操作完成後系統會提示輸入一系列信息
國家:
省:
城市:
公司名:
部門:
網站名:*.域名(泛域名)比如*.tianmao.com
郵箱(可選):
文件生成
openssl x509 -in cacert.pem -noout -text #以文本方式查看自簽證書
3 客戶端申請證書
1 創建私鑰
(umask 066;openssl genrsa -out /app test.key 2048)
/app:私鑰存放位置
test.key:私鑰名稱
2 申請證書
openssl req -new -key test.key -out app.csr
操作完成後系統會提示輸入信息
國家: 與上述相同
省: 與上述相同
城市: 可以不同
公司名: 與上述相同
部門: 可以不同
網站名:*.test.com(給這個網站頒發證書)
郵箱(可選):
3 將證書申請文件存放到CA服務器並檢查申請信息
4 頒發證書
openssl ca -in app.csr -out certs/app.crt -days 730
[ ca ]
default_ca = CA_default #默認使用的CA
#unique_subject = no #是否允許申請兩次
[ CA_default ]
dir = /etc/pki/CA #CA工作的主目錄
certs = $dir/certs #存放證書文件的位置
crl_dir = $dir/crl #吊銷證書列表
database = $dir/index.txt #將證書信息添加到這個文件中
new_certs_dir = $dir/new_certs #默認證書的路徑
certificate = $dir/cacert.pem #私鑰存放位置
serial = $dir/serial #證書的編號 存放的是下一個要頒發的證書的編號
crlnumber = $dir/crlnumber #吊銷證書的編號
crl = $dir/crl.pem #
default_days = 365 #證書有效期 默認365天
default_md = sha256 #默認算法
policy = policy_match 或者 policy_anything
[ policy_match ]
countryName = match #兩邊國家必須相同
stateOrProVinceName = match #省份
organizationName = match #地區名
commonName = supplied #部門名
[ policy_anything ]
內容全為"optional" 也就是有些選項可以不同
Openssh
工具:
基於C/S結構
Client:ssh,scp,sftp,slogin
Windows客戶端:
xshell,putty,securecrt,sshsecureshellclient
Server:sshd
ssh客戶端
ssh配置文件:/etc/ssh/ssh_config
.ssh文件中存放的是登錄過的主機的公鑰,也就是已知主機,下次登錄不會提示yes or no;known_hosts文件中的內容與登錄過主機下的/etc/ssh/ssh_host_rsa_key.pub內容相同
格式:ssh [user@]host [command]
例子:ssh [email protected] who 在目標主機上執行who命令
-p port:指定服務器端端口號 默認為22;"可在/etc/ssh/ssh_config中修改Port這一行的端口號 對正在連接的用戶不起作用"
-b:指定連接的源IP;"當發起端IP不止一個的時候並且想刻意使用某一個ip去連接就使用此選項"
-v:顯示連接的詳細過程
-C:壓縮;可使數據包變小
-X:支持x11轉發;"可以在目標主機上啟用圖形化的功能"
-t:A-->B-->C當C禁止A連接則A可以使用ssh -t "B的IP" ssh "C的IP"
ssh服務登錄驗證
基於用戶名口令驗證
1 客戶端發起ssh請求,服務器會把自己的公鑰發送給客戶端
2 用戶會根據服務器發來的公鑰對密碼進行加密
3 加密後傳給服務器,服務器使用自己的私鑰解密,密碼正確,登錄成功
/etc/ssh中存放了許多公鑰與私鑰".pub"後綴的為公鑰
基於密鑰的驗證方法
1 在客戶端生成一對兒密鑰,將公鑰復制給服務器端並且在服務器端自動存放到authorized_keys
2 客戶端發起連接請求,服務器端收到後會在存放公鑰的位置查,如果有對應的主機和用戶信息,會生成隨機字符串 將字符串使用客戶端的公鑰進行加密傳送給客戶端
3 客戶端收到後使用私鑰解密查看字符串是否相等,相等的話傳送給服務器端查看是否相等,相等就可以進行互相
實現基於密鑰的驗證方法:
1在客戶端生成秘鑰對
ssh-keygen -t rsa [-P ''] [-f "~/.ssh/id_rsa"] 中括號內可不指定
-P:給秘鑰加口令
-t:指定算法;默認為rsa算法
-f:指定生成的文件存放的位置;默認就為用戶家目錄下的/.ssh/id_rsa下
2 把公鑰文件傳輸到服務端對應用戶的家目錄
ssh-copy-id -i id_rsa.pub root@"對方IP地址"
3 再次登錄可以不用輸入用戶名密碼直接登錄
轉換不正確的公鑰格式
ssh-keygen -i -f "公鑰文件名稱"
###給生成好的密鑰添加口令:ssh-keygen -p 再次登錄需要輸入私鑰的密碼
將私鑰的密碼交給代理程序,這樣以後連接也不用輸入私鑰的密碼,但關閉終端連接後代理也會停止,每次連接要啟動一下代理
1 啟動代理程序
ssh-agent bash
2 將私鑰口令用它代理
ssh-add
要添加新的基於密鑰的驗證的話;將客戶端公鑰發送到被連接主機並且將內容追加到 authorized_keys中即可
解決ssh連接過慢
修改服務器端的/etc/ssh/sshd_config中的UseDNS no以及GSSAPIAuthentication no
sshd服務的配置文件,兩個文件都存放在/etc/ssh目錄下
ssh_config:客戶端配置文件
Port:默認連接端口 -p可以指定端口號
StrictHostKeyChecking ask:管理第一次連接是否提示yes or no,不啟用的話講ask改為no
scp命令:
scp [options]源...目標/
兩種方式:
scp [options] [user@]host:/sourcefile /目標路徑
scp [options] /sourcefile [user@]host:/目標路徑
[options]:
-q:靜默模式
-r:遞歸復制
-C:壓縮
-p:保持源文件的屬性
-P:指定端口
rsync
rsync [options] "文件名" "目標IP:/目標目錄路徑"
比scp更快,只復制發生變化的文件
註意:如果要復制整個目錄就不要在目錄最後加"/" 加了/的話就把整個目錄復制過去
選項:
-n 模擬復制過程
-v 顯示詳細過程
-r 遞歸復制目錄
-p 保留權限
-t 保留時間戳
-g 保留組信息
-o 保留所有者信息
-l 將軟鏈接文件本身進行復制(默認)
-L 將軟鏈接文件指向的文件復制
-a 保留源文件所有屬性
sftp命令
sftp "目標IP地址"
基於ssh協議的ftp
帶!的命令是在本地執行
get:下載
put:上傳
?:查看幫助
pssh工具(適用於小型環境)
語法:pssh [options] [user@]hostip command
pssh存放在epel源中
註意:執行命令中如果存在星號 $符號的時候需要用單引號將命令引起來才能實現在目標主機上操作
-H:指定對方的IP地址 後方可以跟多個主機IP地址雙引號引起來 用空格隔開
-i:將結果輸出
-h:讀取文件中數據 可將多個主機ip地址寫入到文件中 使用-h讀取文件數據
-o:將輸出結果生成文件單獨放在指定目錄中 以ip地址為文件名
pscp.pssh將本地文件批量復制到遠程主機(要在基於密鑰驗證的前提下才能使用)
語法:pscp.pssh [options] [本地文件or目錄] [目標主機文件or目錄]
-h:讀取文件中數據 可將多個主機ip地址寫入到文件中 使用-h讀取文件數據
-v:顯示復制過程
-a:保留所有常規屬性
-r:遞歸復制目錄
-H:指定目標主機ip地址
將目標主機文件拉取到本機
pslurp -h ip.txt -L /app /var/log/secure remote_secure
-L:指定本地目錄
remote_secure:復制到本地/app目錄下並且改名
ssh的端口轉發
例子:
從外部向內部
C是telnet服務器
B是ssh服務器
A是ssh telnet客戶端
在A主機上進行操作
當A想通過telnet訪問C的時候過程可能不安全,所以可以使用ssh進行端口轉發,建立隧道,使用ssh協議封裝telnet 訪問,過程相對安全
A主機端口隨機
1 建立隧道
ssh -L A主機端口:C telnet主機IP:C主機的telnet端口 B主機的IP -Nf
-N:不登錄目標shell
-f:後臺運行
2 telnet 127.0.0.1 端口 此時建立成功 但在C服務器上認為的是B主機在訪問
從內部向外部
A為ssh服務器
B為ssh客戶端
C為smtp服務器
在B主機上進行操作
1 ssl -R A主機sshd服務的端口:C主機IP:C主機的smtp端口 A主機的IP -Nf
2 telnet 127.0.0.1 端口
動態端口轉發:
例子:
A為國內服務器
B為中間服務器
C為google服務器
1 在C服務器上搭建httpd服務
yum -y install httpd
2 在C服務器上設置防火墻策略禁止A訪問
iptables -A INPUT -s A主機IP -j REJECT
3 在A服務器上執行;A與B服務器建立了ssh連接;在A服務器上的瀏覽器中進行代理設置;
ssh -D "隨機本地端口" B服務器IP地址 -N
4 測試
curl --socks5 127.0.0.1:A上的隨機端口 http://C主機IP地址
ssh服務器:
服務器端:sshd
配置文件:/etc/ssh/sshd_config
# Port:端口;
# AddressFamily any:支持的ip格式,ipv4 ipv6默認都支持;
# ListenAddress:默認監聽的IP地址是任意的,後方對應的ip就是對外可連接的ip地址;
# HostKey:對應的私鑰;
# LoginGraceTime 2m:登錄最長時間;
# PermitRootLogin:禁止root用戶連接,默認是可以的;
# StrictModes:檢查.ssh/目錄下的權限;權限不正確拒絕連接;
# MaxAuthTries 6:默認最多錯誤輸入3次;設置的值的一半;
# MaxSessions 10:在一個連接的情況下最多建立多少個會話,針對克隆連接;
# PubkeyAuthentication yes:是否支持基於密鑰的連接
# PasswordAuthentication yes:是否支持用戶名密碼的連接;一般都是禁用此項使用基於密鑰的連接
# PermitEmptyPasswords:是否允許空口令
# GatewayPorts no:是否充當網關
# ClientAliveInterval:多久發送檢查,檢查如果沒有任何操作就斷開;默認為永久不斷開
# ClientAliveCountMax:最多發送幾個檢查
# UseDNS:將DNS反向解析改為no可提升速度
# GSSAPIAuthentication:改為no提升連接速度
# MaxStartups:用戶沒有輸入密碼的連接數,達到10個以上會拒絕沒有驗證的用戶,以30%的比例拒絕,當10-100的時候比例增長,並發最多達到100個;
# Banner:連接上目標主機之後的提示信息(寫在一個獨立的文件中,sshd_config配置文件中Banner後寫的是文件的絕對路徑)
限制可登錄用戶的方法:
/var/log/secure中可查看到sshd的日誌
# 手動添加Allowusers "用戶名" 沒有寫的所有用戶都不可以連接,包括root
# 手動添加Denyusers "用戶名" 拒絕指定用戶連接 當Allowusers和Denyusers都有同一個用戶時,拒絕優先
# Allowgroups "組名" 寫的組可以連接
# Denygroups "組名" 寫的組都拒絕連接;
AIDE:文件完整性檢查和入侵檢查
安裝:yum -y install aide
aide.conf為配置文件
CONTENT_EX在配置文件中定義了關心哪幾個位置
# /boot/ CONTENT_EX:對boot這個目錄進行所有權限的記錄
........等多個目錄相同含義
也可以自定義關鍵字,方便後期要監控的目錄進行引用
# CUSTOM = p+u+g+s+sha256+m+acl
# /app CUSTOM #監控app目錄下的CUSTOM後方對應的屬性,一系列屬性在配置文件中有解釋
# !/app/f3 #加!的意思是不關心app目錄下的f3文件
# aide --update #更新數據庫中的信息
# aide --init #生成新的數據庫中的信息
新的生成的aide.db.new.gz文件要改為aide.db.gz才能進行比對
# aide --check #比對數據庫中的信息和當前被監控的目錄的信息
/var/log/aide為日誌文件路徑
更改身份
su 切換身份: su -l username -c 'command'
使用用戶登錄並且執行後面的命令
sudo
-u:指定要代表的用戶
-V:查看版本配置信息
-l,ll:列出用戶在主機上可用和禁用的命令
-k:清除時間戳,下次使用sudo需要輸入密碼
-v:將密碼有效期延長
-K:刪除時間戳文件
-b:在後臺執行指令
-p:改變輸入密碼的提示符
/etc/sudoers:在此文件中授權
可使用visudo擁有語法檢查功能,如果有問題,保存退出會提示
格式:username 登錄主機=(以哪個用戶的身份) 要執行的命令;多條命令以逗號作為分隔符,需要些絕對路徑
登錄主機:寫哪一個IP就只能在哪臺主機上進行sudo操作,可以寫多個地址或網段
例子:
1 fang ALL=(root) /usr/bin/mount /dev/cdrom /media #使fang用戶以root用戶使用掛載命令
如果想要用戶可以任意掛載到任何位置將/dev/cdrom /media等去掉只寫命令的絕對路徑即可
2 如果想要單個用戶使用單個配置文件則可以在/etc/sudoers.d下創建文件即可
例子:
vim /etc/sudoers.d/fang #創建新文件
fang ALL=(root) /usr/bin/mount,/usr/bin/umount,/usr/bin/cat /etc/shadow #文件中的格式
3 /etc/sudoers中%開頭的就是對組的配置
%wheel ALL=(ALL) ALL #wheel組默認存在將用戶加入到此組中就附帶ALL權限
usermod -G wheel fang #fang用戶擁有wheel組的所有權限
例子2:
如果希望普通用戶可以查看/var/log/secure-`date +%F`的日誌信息按以下方式寫
vim /etc/sudoers.d/fang
fang ALL=(root) /usr/bin/cat /var/log/secure*,!/usr/bin/cat /var/log/secure* * #既防止了用戶訪問別的文件也賦予了正確權限
sudo在配置文件中,還支持通配符的使用
sudo別名和實例
用戶:user
以哪個用戶身份運行:runas
通過哪些主機:host
運行的命令:command
別名擁有四種類型:
USER_Alias
Runas_Alias
Host_Alias
Cmnd_Alias
別名格式
別名名稱要為大寫在,多個命令使用逗號隔開
User_Alias "別名名稱" = "包括的用戶名"
Cmnd_Alias "命令別名" = "命令的絕對路徑"
用戶別名名稱 ALL=(root) 命令別名名稱
TCP_Wrappers守護進程
工作在傳輸層的TCP協議
判斷服務是否能夠由tcp_wrapper進行訪問控制的方法:
ldd "程序的絕對路徑" (libwarp.so)
配置文件:/etc/hosts.allow,/etc/hosts.deny
當hosts.allow文件中沒有匹配條件的時候才去查看hosts.deny文件
格式:
/etc/host.deny,修改完整後即時生效
"進程名稱","第二個進程名稱":"要拒絕的ip地址" 空格隔開多個IP
當兩個文件都沒有定義的話默認是允許連接的
例子:
in.telnetd,[email protected]:ALL(拒絕所有通過telnet以及ssh訪問172.18.0.6的ip地址)
sshd:192.168.27. EXCEPT 192.168.27.7(拒絕所有27網段的ip,僅允許192.168.27.7訪問,要在allow文件中寫27.7的地址,也可以在deny中如此定義)
EXCEPT:排除後方的ip或網端
sshd:192.168.27. :spawn echo `date +%%F` client login > /app/tcp_warppers.log(記錄27網段登錄後會將echo後面的信息輸入到文件中)
spawn:開啟一個進程
%c:客戶端信息
%s:服務器信息
%u:用戶
twist:當客戶端連接到服務端的時候執行twist後方定義的操作,而服務不做響應
sshd:192.168.27. :twist /bin/echo "Deny access Server sshd 403" (當27網段的客戶端來通過sshd連接到服務端的時候不會響應並且回回復twist後方信息)
PAM:可插入的認證模塊
認證庫:文本文件(/etc/passw;/etc/shadow),MySQL,NIS,LDAP
遠程登錄,本地登錄
PAM相關文件
模塊文件目錄:/lib64/security/*.so
環境相關配置:/etc/security/(有些模塊比較簡單沒有配置文件,比較復雜的就擁有配置文件在此處,模塊在上方目錄)
主配置文件:/etc/pam.conf;默認不存在
為每種應用模塊提供一個專用的配置文件:/etc/pam.d/應用名稱,格式與主配置文件基本相同,文件中主要描述是如何調用/lib64/security/*.so文件
註意:如果/etc/pam.d存在,那麽/etc/pam.conf文件將會失效
PAM模塊認證過程:
Service(服務)→PAM(配置文件)→pam_*.so
PAM首先確定一項服務,然後加載相應的PAM的配置文件(/etc/pam.d/*.conf),然後通過配置文件查看調用某一個模塊以及認證過程
通用配置文件/etc/pam.conf格式
application type control module-path arguments #不常用
專用配置文件/etc/pam.d/*格式
type control module-path arguments
type(類型): Auth(驗證賬號是否合法)
Account(判斷賬號是否可登陸)
Password(在用戶修改密碼的時候做復雜檢查)
Session(用戶在使用服務之前或使用服務之後附帶的一系列信息;比如在用戶登陸後是否要記錄日誌)
-Auth|Account|Password|Session:(對應模塊沒有安裝的話不會記錄到日誌,不會報錯)
control(控制):PAM如何處理模塊的成功或失敗情況
required:一票否決,還會繼續檢查,但總體來說已經失敗,下面有通過也沒用;本模塊必須成功不代表一定成功,但是不一定一定成功,因為後方還有檢測
requisite:一票否決,如果失敗就直接失敗,不會繼續向下檢查
sufficient:一票通過,如果返回通過,則通過,後面就不用看了
optional:結果忽略,不影響結果
include:指定後方模塊是調用
module-path(模塊路徑):默認就去/lib64/security下查找
arguments(參數):傳遞給模塊的參數
例子1 :
模塊:pam_shells.so
說明:檢查登錄有效shell
ssh服務沒有調用此項模塊,所以對sshd無效,編輯/etc/pam.d/sshd在其中添加
auth required pam_shells.so #當ssh連接的用戶使用的shell不在/etc/shells中就會拒絕連接
例子2 :
模塊:pam_securetty.so
說明:如果用戶登錄的是安全的tty(/etc/securetty)則允許root登錄,否則不允許root登錄,不針對其他用戶
telnet默認就是不允許root登錄
remote中調用了pam_securetty.so模塊,就是所有遠程連接如果不是安全的tty都不可以登錄;包括telnet,在/etc/securetty中添加tty即可登錄
例子3 :
模塊:pam_nologin.so
說明:man pam_nologin
當/etc/nologin存在的時候,拒絕用戶的登錄,並且文件內容將顯示在登錄提示位置,對root用戶不影響
touch /etc/nologin #創建/etc/nologin文件
vim /etc/pam.d/su auth required pam_nologin.so #編輯/etc/pam.d/su添加auth required pam_nologin.so
這樣使用su切換用戶的時候也是不可以的,默認是可以的
例子4 :
模塊:pam_limits.so
說明:限制用戶系統資源使用,對root也有影響
ulimit:限制資源,包括shell以及進程創建
-a:顯示當前所有ulimit限制
open files:最多打開的文件個數,默認為1024;每發起一個連接就會打開一個sockets文件
-n:修改最多打開文件個數,最大接收的並發連接數(普通用戶只能調小不能調大)
cpu time:每運行一個程序使用的cpu的時間
max user processes:最大用戶的進程數,最多這麽多進程
配置文件:/etc/security/limits.conf
-:包括軟硬限制都做了限制
nproc:最大進程數
比如"fang"這個用戶最大打開10個進程就使用以下格式
# fang - nproc 10 #如果用戶名部分寫組名的話則要加上@符號
ab -c 10 -n 200 http://IP/
-c:並行發起10個鏈接
-n:總鏈接數200個
Linux安全管理