1. 程式人生 > >Linux安全管理

Linux安全管理

文件查看 base64 ash 支持 序列號 詳細 設置 ssh服務 start

安全


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算法加密

-in:輸入文件

-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安全管理