加密與安全
SSH端口轉發
SSH 會自動加密和解密所有 SSH 客戶端與服務端之間的網絡數據。但是,SSH 還能夠將其他 TCP 端口的網絡數據通過 SSH 鏈接來轉發,并且自動提供了相應的加密及解密服務。這一過程也被叫做“隧道”(tunneling),這是因為 SSH 為其他 TCP 鏈接提供了一個安全的通道來進行傳輸而得名。例如,Telnet,SMTP,LDAP 這些 TCP 應用均能夠從中得益,避免了用戶名,密碼以及隱私信息的明文傳輸。而與此同時,如果工作環境中的防火墻限制了一些網絡端口的使用,但是允許 SSH 的連接,也能夠通過將 TCP 端口轉發來使用 SSH 進行通訊
SSH 端口轉發能夠提供兩大功能:
?加密 SSH Client 端至 SSH Server 端之間的通訊數據
?突破防火墻的限制完成一些之前無法建立的 TCP 連接
ssh 命令:
本地轉發:
ssh? -L localport:remotehost:remotehostport ?sshserver
本機端口;內網的端口 ;遠程主機端口號 ;ssh服務器地址
?選項:
-f 后臺啟用
-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:XXXXX ?è? sshsrv:22 ??è? sshsrv:YYYYY ?è telnetsrv:23
yum? install? telnet-server??????? 安裝telnet包
遠程轉發:
-R sshserverport:remotehost:remotehostport sshserver
示例:
ssh –R 9527:telnetsrv:23 –N sshsrv
讓sshsrv偵聽9527端口的訪問,如有訪問,就加密后通過ssh服務轉發請求到本機ssh客戶端,再由本機解密后轉發到telnetsrv:23
Data ??è ? sshsrv:9527 ??è ? sshsrv:22 ??è ? localhost:XXXXX ??è ? localhost:YYYYY ??è ? telnetsrv:23
動態端口轉發:
?? 當用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
X 協議轉發
?所有圖形化應用程序都是X客戶程序
- 能夠通過tcp/ip連接遠程X服務器
- 數據沒有加密機,但是它通過ssh連接隧道安全進行
?ssh -X user@remotehost gedit
remotehost主機上的gedit工具,將會顯示在本機的X服務器上
傳輸的數據將通過ssh連接加密
ssh服務器
?服務器端:sshd, 配置文件: /etc/ssh/sshd_config
?常用參數:
?Port
?ListenAddress ip
?LoginGraceTime 2m
?PermitRootLogin yes
?StrictModes yes 檢查.ssh/文件的所有者,權限等
?MaxAuthTries 6
?MaxSessions 10 同一個連接最大會話
?PubkeyAuthentication yes
?PermitEmptyPasswords no
?PasswordAuthentication yes
常用參數:
?GatewayPorts no
?ClientAliveInterval:單位:秒
?ClientAliveCountMax:默認3
?UseDNS yes
?GSSAPIAuthentication yes 提高速度可改為no
?MaxStartups 未認證連接最大值,默認值10
?Banner /path/file
限制可登錄用戶的辦法:
AllowUsers user1 user2 user3
DenyUsers
AllowGroups
DenyGroups
ssh服務的最佳實踐:
?建議使用非默認端口
?禁止使用protocol version 1
?限制可登錄用戶
?設定空閑會話超時時長
?利用防火墻設置ssh訪問策略
?僅監聽特定的IP地址
?基于口令認證時,使用強密碼策略
tr -dc A-Za-z0-9_ < /dev/urandom | head -c 30| xargs
?使用基于密鑰的認證
?禁止使用空密碼
?禁止root用戶直接登錄
?限制ssh的訪問頻度和并發在線數
?經常分析日志
編譯安裝dropbear示例
?ssh協議的另一個實現:dropbear
源碼編譯安裝:
1、安裝開發包組:yum groupinstall “Development tools”
2、下載dropbear-2017.75.tar.bz2
3、tar xf dropbear-2017.75.tar.bz2
4、less INSTALL README
5、./configure
6、make PROGRAMS=”dropbear dbclient dropbearkey dropbearconvert scp”
7、make PROGRAMS=”dropbear dbclient dropbearkey dropbearconvert scp” 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 #前臺運行
dropbear -p :2222 #后臺運行
客戶端訪問:
14、ssh -p 2222 root@127.0.0.1
15、dbclient -p 2222 root@127.0.0.1
AIDE(Advanced Intrusion Detection Environment)
高級入侵檢測環境)是一個入侵檢測工具,主要用途是檢查文件的完整性,審計計算機上的那些文件被更改過了。
AIDE能夠構造一個指定文件的數據庫,它使用aide.conf作為其配置文件。AIDE數據庫能夠保存文件的各種屬性,包括:權限(permission)、索引節點序號(inode number)、所屬用戶(user)、所屬用戶組(group)、文件大小、最后修改時間(mtime)、創建時間(ctime)、最后訪問時間(atime)、增加的大小以及連接數。AIDE還能夠使用下列算法:sha1、md5、rmd160、tiger,以密文形式建立每個文件的校驗碼或散列號.
這個數據庫不應該保存那些經常變動的文件信息,例如:日志文件、郵件、/proc文件系統、用戶起始目錄以及臨時目錄.
安裝AIDE:??? 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 檢查語法
配置文件:/etc/sudoers, /etc/sudoers.d/
口令的時間戳文件:/var/db/sudo? 6版本????? /var/run/sudo/ts? 7版本?? 時間戳路徑
日志文件:/var/log/secure????? 可以看到sudo的授權行為
配置文件支持使用通配符glob:
?:任意單一字符
* :匹配任意長度字符
[wxc]:匹配其中一個字符
[!wxc]:除了這三個字符的其它字符
\x : 轉義
[[alpha]] :字母 示例: /bin/ls [[alpha]]*
sudo命令
?ls -l /usr/bin/sudo
?sudo –i –u wang 切換身份
?sudo [-u user] COMMAND
-V 顯示版本信息等配置信息 以及 顯示sudo的一些必要信息
-u user 默認為root
-l,ll 列出用戶在主機上可用的和被禁止的命令(ll? 的格式會與l不同)
-v 再次延長密碼有效期限為5分鐘,更新時間戳(密碼的有效期一般只有5分鐘)
-k 清除時間戳(1970-01-01),下次需要重新輸密碼
-K 與-k類似,還要刪除時間戳文件
-b 在后臺執行指令
-p 改變詢問密碼的提示符號
示例:-p ”password on %h for user %p:”
export? EDITOR=vim
visudo? /etc/sudoers
wang? 192.168.30.7=(root)???? /bin/mount?? /dev/cdrom???? /mnt/?? ( which?? mount )
給與wang用戶在192.168.30.7的主機上執行掛載命令的權限
mount? /dev/cdrom? /mnt/?????? 兩邊需要一樣,一點都不能變
不僅能授權用戶還能授權組,不過要在組名前加上%
gpasswd? -d? wang?? while
將wang用戶從while組中移除
setfacl? -m? u:wang:rw? f1?? 授權wang用戶對f1文件有rw權限
visudo? -f? /etc/sudoers.d/mage
visudo?? -c?? 檢查語法
配置文件規則有兩類;
1、別名定義:不是必須的
2、授權規則:必須的
授權規則格式:
用戶 登入主機=(代表用戶) 命令
示例:
root ?ALL=(ALL) ?ALL??? root在任何主機上(代表任何用戶)擁有任何命令的權限
格式說明:
user: 運行命令者的身份
host: 通過哪些主機
(runas):以哪個用戶的身份
command: 運行哪些命令
Users和runas:
username
#uid
%group_name
%#gid
user_alias|runas_alias
host:
ip或hostname
network(/netmask)
host_alias
command:
command name
directory
sudoedit
Cmnd_Alias
sudo別名和示例
?別名有四種類型:User_Alias, Runas_Alias, Host_Alias ,Cmnd_Alias
?別名格式:[A-Z]([A-Z][0-9]_)*?? 要當別名必須大寫字母開頭數字在后面,小寫字母不能有
?別名定義:
Alias_Type NAME1 = item1, item2, item3 : NAME2 = item4, item5? 冒號隔開可以定義多個別名
?示例1:
Student ALL=(ALL) ALL
%wheel ALL=(ALL) ALL
?示例2:
student ALL=(root) /sbin/pidof,/sbin/ifconfig??? 每個命令要寫完整路徑
%wheel ALL=(ALL) NOPASSWD: ALL??? 代表不輸任何口令的情況下執行任何命令
?示例3
User_Alias NETADMIN= netuser1,netuser2
用戶別名? 別名??? =用戶1,用戶2
Cmnd_Alias NETCMD = /usr/sbin/ip
系統別名
NETADMIN ALL=(root) NETCMD
?示例4
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
DISKADER ALL=(OP) DSKCMD
?示例4
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
?示例5
Defaults:wang runas_default=tom
wang ALL=(tom,jerry) ALL
?示例6
wang 192.168.175.136,192.168.175.138=(root) /usr/sbin/,!/usr/sbin/useradd
?示例7
wang ALL=(ALL) /bin/cat /var/log/messages*
TCP_Wrappers介紹
?作者:Wieste Venema,IBM,Google
?工作在第四層(傳輸層)的TCP協議
?對有狀態連接的特定服務進行安全檢測并實現訪問控制
?以庫文件形式實現
?某進程是否接受libwrap的控制取決于發起此進程的程序在編譯時是否針對libwrap進行編譯的
?判斷服務程序是否能夠由tcp_wrapper進行訪問控制的方法:
ldd /PATH/TO/PROGRAM|grep libwrap.so
strings PATH/TO/PROGRAM|grep libwrap.so
TCP_Wrappers的使用
?配置文件:/etc/hosts.allow, /etc/hosts.deny???? 白名單你,黑名單
?幫助參考:man 5 hosts_access,man 5 hosts_options
?檢查順序:hosts.allow,hosts.deny(默認允許)allow 可以允許也支持拒絕,deny只支持拒絕;白名單優先級更高。
注意:一旦前面規則匹配,直接生效,將不再繼續
?基本語法:
?daemon_list@host: client_list [ :options :option… ]
?Daemon_list@host格式
?單個應用程序的二進制文件名,而非服務名,例如vsftpd
?以逗號或空格分隔的應用程序文件名列表,如:sshd,vsftpd
?ALL表示所有接受tcp_wrapper控制的服務程序
?主機有多個IP,可用@hostIP來實現控制
如:in.telnetd@192.168.0.254
客戶端Client_list格式
?以逗號或空格分隔的客戶端列表
?基于IP地址:192.168.10.1 192.168.1.
?基于主機名:www.magedu.com .magedu.com 較少用
?基于網絡/掩碼:192.168.0.0/255.255.255.0
?基于net/prefixlen: 192.168.1.0/24(CentOS7)
?基于網絡組(NIS 域):@mynetwork
?內置ACL:ALL,LOCAL,KNOWN,UNKNOWN,PARANOID
?EXCEPT用法:
示例:vsftpd: 172.16. EXCEPT 172.16.100.0/24 EXCEPT 172.16.100.1
示例:只允許192.168.1.0/24的主機訪問sshd
/etc/hosts.allow
sshd: 192.168.1.
/etc/hosts.deny
sshd :ALL
示例:只允許192.168.1.0/24的主機訪問telnet和vsftpd服務
/etc/hosts.allow
vsftpd,in.telnetd: 192.168.1.
/etc/host.deny
vsftpd,in.telnetd: ALL
TCP_Wrappers的使用
?[:options]選項:
?幫助:man 5 hosts_options
deny 主要用在/etc/hosts.allow定義“拒絕”規則
如:vsftpd: 172.16. :deny
allow 主要用在/etc/hosts.deny定義“允許”規則
如:vsftpd:172.16. :allow
spawn 啟動一個外部程序完成執行的操作
twist 實際動作是拒絕訪問,使用指定的操作替換當前服務,標準I/O和ERROR發送到客戶端,默認至/dev/null
?測試工具:
tcpdmatch [-d] daemon[@host] client
-d 測試當前目錄下的hosts.allow和hosts.deny
示例
?sshd: ALL :spawn echo “$(date +%%F) login attempt from %c to %s,%d” >>/var/log/sshd.log
說明:
?在/etc/hosts.allow中添加,允許登錄,并記錄日志
?在/etc/hosts.deny中添加,拒絕登錄,并記錄日志
?%c 客戶端信息
?%s 服務器端信息
?%d 服務名
?%p 守護進程的PID
?%% 表示%
?vsftpd: 172.16. :twist /bin/echo “connection prohibited
PAM認證機制
?PAM:Pluggable Authentication Modules??? 可插入的驗證模塊
?認證庫:文本文件,MySQL,NIS,LDAP等
?Sun公司于1995 年開發的一種與認證相關的通用框架機制
?PAM 是關注如何為服務驗證用戶的 API,通過提供一些動態鏈接庫和一套統一的API,將系統提供的服務和該服務的認證方式分開
?使得系統管理員可以靈活地根據需要給不同的服務配置不同的認證方式而無需更改服務程序
?一種認證框架,自身不做認證
它提供了對所有服務進行認證的中央機制,適用于login,遠程登錄(telnet,rlogin,fsh,ftp,點對點協議(PPP)),su等應用程序中。系統管理員通過PAM配置文件來制定不同應用程序的不同認證策略;應用程序開發者通過在服務程序中使用PAM API(pam_xxxx( ))來實現對認證方法的調用;而PAM服務模塊的開發者則利用PAM SPI來編寫模塊(主要是引出一些函數pam_sm_xxxx( )供PAM接口庫調用),將不同的認證機制加入到系統中;PAM接口庫(libpam)則讀取配置文件,將應用程序和相應的PAM服務模塊聯系起來。
PAM相關文件
?模塊文件目錄:/lib64/security/*.so
?環境相關的設置:/etc/security/
?主配置文件:/etc/pam.conf,默認不存在
?為每種應用模塊提供一個專用的配置文件:/etc/pam.d/APP_NAME
?注意:如/etc/pam.d存在,/etc/pam.conf將失效
pam認證原理
?PAM認證一般遵循這樣的順序:Service(服務)→PAM(配置文件)→pam_*.so
?PAM認證首先要確定那一項服務,然后加載相應的PAM的配置文件(位于/etc/pam.d下),最后調用認證文件(位于/lib/security下)進行安全認證
PAM認證過程:
1.使用者執行/usr/bin/passwd 程序,并輸入密碼
2.passwd開始調用PAM模塊,PAM模塊會搜尋passwd程序的PAM相關設置文件,這個設置文件一般是在/etc/pam.d/里邊的與程序同名的文件,即PAM會搜尋/etc/pam.d/passwd此設置文件
3.經由/etc/pam.d/passwd設定文件的數據,取用PAM所提供的相關模塊來進行驗證
4.將驗證結果回傳給passwd這個程序,而passwd這個程序會根據PAM回傳的結果決定下一個動作(重新輸入密碼或者通過驗證)
通用配置文件/etc/pam.conf格式
application type control module-path arguments
?專用配置文件/etc/pam.d/* 格式
type control module-path arguments
?說明:
?服務名(application)
telnet、login、ftp等,服務名字“OTHER”代表所有沒有在該文件中明確配置的其它服務
?模塊類型(module-type)
?control PAM庫該如何處理與該服務相關的PAM模塊的成功或失敗情況
?module-path 用來指明本模塊對應的程序文件的路徑名
?Arguments 用來傳遞給該模塊的參數
模塊類型(module-type)
?Auth 賬號的認證和授權
?Account 與賬號管理相關的非認證類的功能,如:用來限制/允許用戶對某個服務的訪問時間,當前有效的系統資源(最多可以有多少個用戶),限制用戶的位置(例如:root用戶只能從控制臺登錄)實現賬號的有效性檢查
?Password 用戶修改密碼時密碼復雜度檢查機制等功能
?Session 用戶獲取到服務之前或使用服務完成之后需要進行一些附加的操作,如:記錄打開/關閉數據的信息,監視目錄等
?-type 表示因為缺失而不能加載的模塊將不記錄到系統日志,對于那些不總是安裝在系統上的模塊有用
Control:控制
PAM庫如何處理與該服務相關的PAM模塊成功或失敗情況
?兩種方式實現:
簡單和復雜
?簡單方式實現:一個關健詞實現
?required :一票否決,表示本模塊必須返回成功才能通過認證,但是如果該模塊返回失敗,失敗結果也不會立即通知用戶,而是要等到同一type中的所有模塊全部執行完畢再將失敗結果返回給應用程序。即為必要條件
requisite :一票否決,該模塊必須返回成功才能通過認證,但是一旦該模塊返回失敗,將不再執行同一type內的任何模塊,而是直接將控制權返回給應用程序。是一個必要條件
?sufficient :一票通過,表明本模塊返回成功則通過身份認證的要求,不必再執行同一type內的其它模塊,但如果本模塊返回失敗可忽略,即為充分條件
?optional :表明本模塊是可選的,它的成功與否不會對身份認證起關鍵作用,其返回值一般被忽略
?include: 調用其他的配置文件中定義的配置信息
復雜詳細實現:使用一個或多個“status=action”
?[status1=action1 status2=action …]
Status:檢查結果的返回狀態
Action:采取行為 ok,done,die,bad,ignore,reset
?ok 模塊通過,繼續檢查
?done 模塊通過,返回最后結果給應用
?bad 結果失敗,繼續檢查
?die 結果失敗,返回失敗結果給應用
?ignore 結果忽略,不影響最后結果
?reset 忽略已經得到的結果
module-path: 模塊路徑
?相對路徑:
/lib64/security目錄下的模塊可使用相對路徑
如:pam_shells.so、pam_limits.so
?絕對路徑:
?模塊通過讀取配置文件完成用戶對系統資源的使用控制
/etc/security/*.conf
?注意:修改PAM配置文件將馬上生效
?建議:編輯pam規則時,保持至少打開一個root會話,以防止root身份驗證錯誤
?Arguments 用來傳遞給該模塊的參數
pam文檔說明
?/user/share/doc/pam-*
?rpm -qd pam
?man –k pam_
?man 模塊名 如man rootok
?《The Linux-PAM System Administrators’ Guide》
PAM模塊示例:
?模塊:pam_shells
?功能:檢查有效shell
?man pam_shells
?示例:不允許使用/bin/csh的用戶本地登錄
vim /etc/pam.d/login
auth required pam_shells.so
vim /etc/shells
去掉 /bin/csh
useradd –s /bin/csh testuser
testuser將不可登錄
tail /var/log/secure
模塊:pam_securetty.so
?功能:只允許root用戶在/etc/securetty列出的安全終端上登陸
?示例:允許root在telnet登陸
vi /etc/pam.d/remote
#auth required pam_securetty.so #將這一行加上注釋
或者/etc/securetty文件中加入
pts/0,pts/1…pts/n
模塊:pam_nologin.so
?功能:
?如果/etc/nologin文件存在,將導致非root用戶不能登陸
?如果用戶shell是/sbin/nologin 時,當該用戶登陸時,會顯示/etc/nologin文件內容,并拒絕登陸
模塊:pam_limits.so
?功能:在用戶級別實現對其可使用的資源的限制,例如:可打開的文件數量,可運行的進程數量,可用內存空間
?修改限制的實現方式:
?(1) ulimit命令,立即生效,但無法保存
-n 最多的打開的文件描述符個數
-u 最大用戶進程數
-S 使用 soft(軟)資源限制
-H 使用 hard(硬)資源限制
?(2) 配置文件:/etc/security/limits.conf, /etc/security/limits.d/*.conf
?配置文件:每行一個定義;
<domain> <type> <item> <value>
pam_limits.so
?<domain> 應用于哪些對象
?Username 單個用戶
?@group 組內所有用戶
?* 所有用戶
?<type> 限制的類型
?Soft 軟限制,普通用戶自己可以修改
?Hard 硬限制,由root用戶設定,且通過kernel強制生效
?- 二者同時限定
?<item> 限制的資源
?nofile 所能夠同時打開的最大文件數量,默認為1024
?nproc 所能夠同時運行的進程的最大數量,默認為1024
?<value> 指定具體值
示例:pam_limits.so
?限制用戶最多打開的文件數和運行進程數
?/etc/pam.d/system-auth
session required pam_limits.so
?vim /etc/security/limits.conf
apache – nofile 10240 apache用戶可打開10240個文件
student hard nproc 20 不能運行超過20個進程
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/100819