加密和安全

加密算法

對稱加密算法

加密和解密使用同一個密鑰

DES、3DES、AES、Blowfish、Twofish、IDEA、RC6、CAST5

特點:

  1. 加密、解密使用同一個密鑰,效率高
  2. 將原始數據分割成固定大小的塊,逐個進行加密

缺點:

  1. 密鑰過多
  2. 密鑰分發(fā)
  3. 數據來源無法確認

非對稱加密算法

公鑰:public key,公開給所有人
私鑰:secret key,自己留存,必須保證其私密性

公鑰加密

RSA、DSA、ELGamal

特點:用公鑰加密數據,只能使用與之配對的私鑰解密,反之亦然

功能:

  1. 數字簽名:主要在于讓接收方確認發(fā)送方身份
  2. 對稱密鑰交換:發(fā)送方用對方的公鑰加密一個對稱密鑰后發(fā)送給對方
  3. 數據加密:適合加密較小數據

缺點:密鑰長,加密解密效率低下

單向散列

將任意數據縮小成固定大小的“指紋”

md5、sha1、sha224、sha256、sha384、sha512

特點:

  1. 任意長度輸入
  2. 固定長度輸出
  3. 若修改數據,指紋也會改變
  4. 無法從指紋中重新生成數據

功能:校驗數據完整性

數字簽名

數字簽名.jpg

密鑰交換

IKE( Internet Key Exchange)

DH (Deffie-Hellman):

  1. A: g,p 協(xié)商生成公開的整數g, 大素數p

    B: g,p

  2. A:生成隱私數據 :a (a<p ),計算得出 g^a%p,發(fā)送給B

    B:生成隱私數據 :b,計算得出 g^b%p,發(fā)送給A

  3. A:計算得出 [(gb%p)x] %p = g^ab%p,生成為密鑰

    B:計算得出 [(ga%p)y] %p = g^ab%p,生成為密鑰

校驗RPM包完整性

被安裝的文件:

  1. MD5單向散列
  2. rpm --verify package_name (or -V)

發(fā)行的軟件包文件:

  1. GPG公鑰簽名
  2. rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat*
  3. rpm --checksig pakage_file_name (or -K)

gpg

對稱加密:

  1. gpg -c file:對稱加密file文件
  2. gpg -o file -d file.gpg:在另一臺主機上解密file,-o指定輸出文件,注意-o選項位置不能放在后面

公鑰加密:實現hostA和hostB雙向通信

  1. gpg --gen-key:在hostA主機上生成公鑰/私鑰對
  2. gpg --list-keys:在hostA主機上查看公鑰
  3. gpg -a --export -o fanjie.pubkey:在hostA主機上導出公鑰到fanjie.pubkey
  4. scp fanjie.pubkey hostB::從hostA主機上復制公鑰文件到需加密的B主機上
  5. gpg --gen-key;gpg --list-keys:在需加密數據的hostB主機上生成公鑰/私鑰對
  6. gpg --import fanjie.pubkey;gpg --list-keys:在hostB主機上導入公鑰
  7. gpg -e -r fanjie file:用從hostA主機導入的公鑰,加密hostB主機的文件file,生成file.gpg
  8. scp fstab.gpg hostA::復制加密文件到hostA主機
  9. gpg -o file -d file.gpg:在hostA主機解密文件
  10. gpg --delete-keys fanjie;gpg --delete-secret-keys fanjie:刪除公鑰和私鑰

CA和證書

PKI:Public Key Infrastructure

  1. 簽證機構:CA(Certificate Authority)
  2. 注冊機構:RA(Register Authority)
  3. 證書吊銷列表:CRL(Certificate Revocation List )

X.509:一種非常通用的證書格式

1、X.509版本號:指出該證書使用了哪種版本的X.509標準,版本號會影響證書中的一些特定信息。目前的版本是3。

2、證書持有人的公鑰:包括證書持有人的公鑰、算法(指明密鑰屬于哪種密碼系統(tǒng))的標識符和其他相關的密鑰參數。

3、證書的序列號:由CA給予每一個證書分配的唯一的數字型編號,當證書被取消時,實際上是將此證書序列號放入由CA簽發(fā)的CRL(Certificate Revocation List證書作廢表,或證書黑名單表)中。這也是序列號唯一的原因。

4、主題信息:證書持有人唯一的標識符(或稱DN-distinguished name)這個名字在 Internet上應該是唯一的。DN由許多部分組成,看起來象這樣:

CN=Bob Allen, OU=Total Network Security Division

O=Network Associates, Inc.

C=US

這些信息指出該科目的通用名、組織單位、組織和國家或者證書持有人的姓名、服務處所等信息。

5、證書的有效期:證書起始日期和時間以及終止日期和時間;指明證書在這兩個時間內有效。

6、認證機構:證書發(fā)布者,是簽發(fā)該證書的實體唯一的CA的X.509名字。使用該證書意味著信任簽發(fā)證書的實體。(注意:在某些情況下,比如根或頂級CA證書,發(fā)布者自己簽發(fā)證書)

7、發(fā)布者的數字簽名:這是使用發(fā)布者私鑰生成的簽名,以確保這個證書在發(fā)放之后沒有被撰改過。

8、簽名算法標識符:用來指定CA簽署證書時所使用的簽名算法。算法標識符用來指定CA簽發(fā)證書時所使用的公開密鑰算法和HASH算法。

獲取證書的兩種方式:

  1. 使用證書授權機構:生成簽名請求(csr),將csr發(fā)送給CA,從CA處接收簽名
  2. 自簽名的證書:自已簽發(fā)自己的公鑰

SSL協(xié)議

SSL:(Secure Socket Layer,安全套接字層),位于可靠的面向連接的網絡層協(xié)議和應用層協(xié)議之間的一種協(xié)議層。SSL通過互相認證、使用數字簽名確保完整性、使用加密確保私密性,以實現客戶端和服務器之間的安全通訊。該協(xié)議由兩層組成:SSL記錄協(xié)議和SSL握手協(xié)議。

SSL.png
  1. Handshake協(xié)議:包括協(xié)商安全參數和密碼套件、服務器身份認證(客戶端身份認證可選)、密鑰交換
  2. ChangeCipherSpec 協(xié)議:一條消息表明握手協(xié)議已經完成
  3. Alert 協(xié)議:對握手協(xié)議中一些異常的錯誤提醒,分為fatal和warning兩個級別,fatal類型錯誤會直接中斷SSL鏈接,而warning級別的錯誤SSL鏈接仍可繼續(xù),只是會給出錯誤警告
  4. Record 協(xié)議:包括對消息的分段、壓縮、消息認證和完整性保護、加密等
  5. HTTPS 協(xié)議:就是“HTTP 協(xié)議”和“SSL/TLS 協(xié)議”的組合
SSL.png

SSL協(xié)議的工作流程:

服務器認證階段:

1. 客戶端向服務器發(fā)送一個開始信息“Hello”以便開始一個新的會話連接;
  2. 服務器根據客戶的信息確定是否需要生成新的主密鑰,如需要則服務器在響應客戶的“Hello”信息時將包含生成主密鑰所需的信息;
  3. 客戶根據收到的服務器響應信息,產生一個主密鑰,并用服務器的公開密鑰加密后傳給服務器;
  4. 服務器恢復該主密鑰,并返回給客戶一個用主密鑰認證的信息,以此讓客戶認證服務器。

用戶認證階段:在此之前,服務器已經通過了客戶認證,這一階段主要完成對客戶的認證。經認證的服務器發(fā)送一個提問給客戶,客戶則返回(數字)簽名后的提問和其公開密鑰,從而向服務器提供認證。

HTTPS協(xié)議

HTTPS結構.jpg
HTTPS工作原理.png

OpenSSL

openssl ?:查看openssl支持的工具

加密

對稱加密:man enc

  1. openssl enc -e -des3 -a -salt -in testfile
    -out testfile.cipher:加密
  2. openssl enc -d -des3 -a -salt –in testfile.cipher
    -out testfile:解密

單項加密:man dgst

  1. openssl dgst -md5 [-hex默認] /PATH/SOMEFILE
  2. openssl dgst -md5 testfile
  3. md5sum /PATH/TO/SOMEFILE

生成用戶密碼:man sslpasswd

openssl passwd -1 -salt SALT(最多8位):-1選項表示md5加密

生成隨機數:man sslrand

openssl rand -base64|-hex NUM:NUM: 表示字節(jié)數;-hex時,每個字符為十六進制,相當于4位二進制,出現的字符數為NUM*2

生成密鑰對兒:man genrsa

  1. (umask 077; openssl genrsa –out test.key –des 2048):生成私鑰,通過在子shell中修改umask值,來修改私鑰權限,保障私鑰安全
  2. openssl rsa -in test.key –out test2.key:將加密的私鑰解密
  3. openssl rsa –in test.key –pubout –out test.key.pub:從私鑰中提取公鑰

生成隨機數:

  1. /dev/random:僅從熵池返回隨機數;隨機數用盡,阻塞
  2. /dev/urandom:從熵池返回隨機數;隨機數用盡,會利用軟件生成偽隨機數,非阻塞
  3. cat /dev/urandom | tr -cd [[:alnum:]]| head -c8:生成8位隨機字母數字

創(chuàng)建私有CA

配置文件:/etc/pki/tls/openssl.cnf

  1. cd /etc/pki/CA
  2. touch index.txt:生成證書索引數據庫文件,用于存放頒發(fā)證書的信息
  3. echo 01 > serial:指定第一個頒發(fā)證書的序列號,注意:第一次更新serial,才需要執(zhí)行
  4. (umask 066;openssl genrsa -out private/cakey.pem 2048):生成私鑰
  5. openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650:生成自簽名證書,-509選項專用于CA生成自簽證書

證書管理

頒發(fā)證書:

  1. cd /app
  2. (umask 066;openssl genrsa -out app.key 2048):給web服務器生成私鑰
  3. openssl req -new -key app.key -out app.csr:給web服務器生成證書申請文件
  4. 將證書請求文件傳輸給CA
  5. cd /etc/pki/CA
  6. openssl ca -in app.csr -out app.cer -days 300:簽署CA
  7. 將簽署好的證書傳輸給web服務器

查看證書中的信息:

  1. openssl x509 -in /PATH/FROM/CERT_FILE -noout -text|issuer|subject|serial|dates:查看證書文件中的信息
  2. openssl ca -status SERIAL:查看指定編號的證書狀態(tài)
[root@centos7 CA]# openssl x509 -in app.cer -noout -serial
serial=01
[root@centos7 CA]# openssl ca -status 01
Using configuration from /etc/pki/tls/openssl.cnf
01=Valid (V)

吊銷證書:

  1. openssl x509 -in app.cer -noout -serial -subject:在客戶端獲取要吊銷的證書的serial和subject
  2. 在CA上,對比index.txt中對應的信息是否一致
  3. openssl ca -revoke newcerts/01.pem:吊銷證書
  4. echo 01 > /etc/pki/CA/crlnumber:指定第一個吊銷證書的編號,注意:第一次更新證書吊銷列表前,才需要執(zhí)行
  5. openssl ca -gencrl -out /etc/pki/CA/crl.pem:更新證書吊銷列表
  6. openssl crl -in /etc/pki/CA/crl.pem -noout -text:查看crl文件

同步時間

centos6:

  1. ntpdate 172.18.0.1
  2. vim /etc/ntp.conf加上server 172.18.0.1 iburst
  3. chkconfig ntpd on:開機自啟動
  4. service ntpd start:啟動服務

centos7:

  1. ntpdate 172.18.0.1
  2. vim /etc/chrony.conf加上server 172.18.0.1 iburst
  3. systemctl start chronyd:啟動服務
  4. systemctl enable chronyd:開機自啟動

SSH

相關包:

openssh
openssh-clients
openssh-server

ssh客戶端

配置文件:/etc/ssh/ssh_config

注意配置文件中此行:StrictHostKeyChecking no(首次登錄不顯示檢查提示)

格式:ssh [user@]host [COMMAND]

常見選項:

  • -p port:遠程服務器監(jiān)聽的端口
  • -b:指定連接的源IP
  • -v:調試模式
  • -C:壓縮方式
  • -X:支持x11轉發(fā)
  • -Y:支持信任x11轉發(fā)
  • -t:強制偽tty分配,跳轉連接時使用

當用戶遠程連接ssh服務器時,會復制ssh服務器/etc/ssh/ssh_host*key.pub(CentOS7默認是ssh_host_ecdsa_key.pub)文件中的公鑰到客戶機的~./ssh/know_hosts中。下次連接時,會自動匹配相應私鑰,不能匹配,將拒絕連接

實際上,ssh并非直接比對host key,因為host key太長了,比對效率較低。所以ssh將host key轉換成host key指紋,然后比對兩邊的host key指紋即可

ssh服務登錄驗證

基于用戶和口令登錄驗證:

  1. 客戶端發(fā)起ssh請求,服務器會把自己的公鑰發(fā)送給用戶
  2. 用戶會根據服務器發(fā)來的公鑰對密碼進行加密
  3. 加密后的信息回傳給服務器,服務器用自己的私鑰解密,如果密碼正確,則用戶登錄成功
SSH口令登錄過程.jpg

基于密鑰的認證:

  1. 首先在客戶端生成一對密鑰(ssh-keygen)
  2. 并將客戶端的公鑰ssh-copy-id 拷貝到服務端
  3. 當客戶端再次發(fā)送一個連接請求,包括ip、用戶名
  4. 服務端得到客戶端的請求后,會到authorized_keys中查找,如果有響應的IP和用戶,就會隨機生成一個字符串,例如:acdf
  5. 服務端將使用客戶端拷貝過來的公鑰進行加密,然后發(fā)送給客戶端
  6. 得到服務端發(fā)來的消息后,客戶端會使用私鑰進行解密,然后將解密后的字符串發(fā)送給服務端
  7. 服務端接受到客戶端發(fā)來的字符串后,跟之前的字符串進行對比,如果一致,就允許免密碼登錄
SSH密鑰登錄過程.jpg

如何免密登錄:可以實現一臺主機控制所有主機,而且只需要給這臺主機私鑰加密即可,只需要記住加密私鑰的密碼即可

  1. ssh-keygen -t rsa:在客戶端交互式環(huán)境下生成密鑰對

    ssh-keygen -t rsa -P '' -f "~/.ssh/id_rsa":非交互式生成密鑰對

  2. ssh-copy-id [-i [identity_file]][user@]host:把公鑰文件傳輸至遠程服務器對應用戶的家目錄,裝用命令,也可以使用scp命令

  3. cat ~/.ssh/authorized_keys:在服務器端查看是否導入成功,成功后測試連接是否免密,如要取消免密,刪除對應文件中的公鑰即可

  4. ssh-keygen –p:重設私鑰口令

  5. ssh-agent bash;ssh-add:開啟代理托管口令,把口令添加給代理,這樣實現在此shell環(huán)境實現免密登錄

expect實現批量部署ssh-key,從而實現批量基于密鑰的登錄

[root@centos6 ~]#cat hostlist.txt 
192.168.30.7 root centos
192.168.30.17 root magedu

[root@centos6 ~]#cat pushkey.sh
#!/bin/bash
ssh-keygen -t rsa -P ''  -f ~/.ssh/id_rsa &> /dev/null && echo "Ssh key is created"
while read line;do
        ip=`echo $line|awk '{print $1}'`
        user=`echo $line|awk '{print $2}'`
        password=`echo $line|awk '{print $3}'`

        expect <<-EOF # 注意加-是為了讓后面的EOF可以縮進
        set timeout 50
        spawn ssh-copy-id  -i /root/.ssh/id_rsa.pub $user@$ip
        expect {
        "yes/no" { send "yes\n";exp_continue }
        "password" { send "$password\n" }
        }
        expect eof
        EOF
        echo "$ip is finished"
done < hostlist.txt # 注意此文件最好寫絕對路徑

scp

scp [options][user@]host:/sourcefile /destpath,常用選項:

  • -C:壓縮數據流
  • -r:遞歸復制
  • -p:保持原文件的屬性信息
  • -q:靜默模式
  • -P PORT:指明remote host的監(jiān)聽的端口

scp由于基于ssh,所以其端口也是使用ssh的端口。其實,scp拷貝的實質是使用ssh連接到遠程,并使用該連接來傳輸數據。下文有scp執(zhí)行過程的分析。

另外,scp還非常不占資源,不會提高多少系統(tǒng)負荷,在這一點上,rsync遠不及它。雖然 rsync比scp會快一點,但rsync是增量拷貝,要判斷每個文件是否修改過,在小文件眾多的情況下,判斷次數非常多,導致rsync效率較差,而scp基本不影響系統(tǒng)正常使用。

scp每次都是全量拷貝,在某些情況下,肯定是不及rsync的。

rsync

rsync的最終目的或者說其原始目的是實現兩端主機的文件同步 ,默認情況下,rsync使用"quick check"算法快速檢查源文件和目標文件的大小、mtime(修改時間)是否一致,如果不一致則需要傳輸 ,常用選項:

  • -n:模擬復制過程
  • -v:顯示詳細過程
  • -r:遞歸復制目錄樹
  • -p:保留權限
  • -t:保持mtime屬性。強烈建議任何時候都加上"-t",否則目標文件mtime會設置為系統(tǒng)時間,導致下次更新 :檢查出mtime不同從而導致增量傳輸無效
  • -g:保留組信息
  • -o:保留所有者信息
  • -l:將軟連接文件本身進行復制(默認)
  • -L:將軟連接文件指向的文件復制
  • -a:相當于–rlptgoD,但不保留ACL(-A)和SELinux屬性(-X)
  • --exclude:指定排除規(guī)則來排除不需要傳輸的文件
  • --delete:以SRC為主,對DEST進行同步。多則刪之,少則補之。注意"--delete"是在接收端執(zhí)行的,所以它是在exclude/include規(guī)則生效之后才執(zhí)行的

如果僅有一個SRC或DEST參數,則將以類似于"ls -l"的方式列出源文件列表(只有一個路徑參數,總會認為是源文件),而不是復制文件

[root@xuexi ~]# rsync /etc/fstab /tmp                # 在本地同步
[root@xuexi ~]# rsync -r /etc 172.16.10.5:/tmp       # 將本地/etc目錄拷貝到遠程主機的/tmp下,以保證遠程/tmp目錄和本地/etc保持同步
[root@xuexi ~]# rsync -r 172.16.10.5:/etc /tmp       # 將遠程主機的/etc目錄拷貝到本地/tmp下,以保證本地/tmp目錄和遠程/etc保持同步
[root@xuexi ~]# rsync /etc/                          # 列出本地/etc/目錄下的文件列表
[root@xuexi ~]# rsync 172.16.10.5:/tmp/              # 列出遠程主機上/tmp/目錄下的文件列表

另外,使用rsync一定要注意的一點是,源路徑如果是一個目錄的話,帶上尾隨斜線和不帶尾隨斜線是不一樣的,不帶尾隨斜線表示的是整個目錄包括目錄本身,帶上尾隨斜線表示的是目錄中的文件,不包括目錄本身

[root@xuexi ~]# rsync -a /etc /tmp # 在/tmp目錄下創(chuàng)建etc目錄,并把/etc/zhong所有文件放在etc目錄下
[root@xuexi ~]# rsync -a /etc/ /tmp # 不會在/tmp目錄下創(chuàng)建etc目錄,源路徑/etc/中的所有文件都直接放在/tmp目錄下

sftp

交互式文件傳輸工具,利用ssh服務實現安全的文件上傳和下載,和ftp工具類似,不同的是sftp連接客戶端必須驗證密碼,不可以像ftp訪客登錄,直接下載文件

pssh

pssh是一個python編寫可以在多臺服務器上批量執(zhí)行命令的工具,也可實現文件復制,最好基于密鑰認證,常用選項:

  • --version:查看版本
  • -h:主機文件列表,內容格式”[user@]host[:port]”
  • -H:主機字符串,內容格式”[user@]host[:port]”、
  • -A:手動輸入密碼模式
  • -i:每個服務器內部處理信息輸出
  • -l:登錄使用的用戶名
  • -p:并發(fā)的線程數【可選】
  • -o:輸出的文件目錄【可選】
  • -e:錯誤輸入文件【可選】
  • -t:TIMEOUT 超時時間設置,0無限制【可選】
  • -O:SSH的選項
  • -P:打印出服務器返回信息
  • -v:詳細模式
[root@centos6 cd]# pssh -H 192.168.39.136 -H 192.168.39.137 -o /app/ -i hostname # -o選項指定輸出文件目錄,每個目標處理結果都分別存放在指定文件,便于分析
[1] 20:39:28 [SUCCESS] 192.168.39.136
centos6.magedu.com
[2] 20:39:29 [SUCCESS] 192.168.39.137
centos6.magedu.com
[root@centos6 cd]# cd /app
[root@centos6 app]# ls
192.168.39.136  192.168.39.137  hostlist.txt  -i  nihao  nishuo  pushkey.sh
[root@centos6 app]# cat 192.168.39.136
centos6.magedu.com

[root@centos6 app]# pssh -H 192.168.39.134 -o /app/ -i "echo $HOSTNAME"
[1] 20:50:18 [SUCCESS] 192.168.39.134
centos6.magedu.com
[root@centos6 app]# pssh -H 192.168.39.134 -o /app/ -i 'echo $HOSTNAME'
[1] 20:50:43 [SUCCESS] 192.168.39.134
centos7.magedu.com # pssh中變量引用必須用單引號,雙引號的話會默認引用當前主機的變量

批量關閉selinux:

pssh -H root@192.168.1.10 -i "sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config"

pscp.pssh

pscp.pssh功能是將本地文件批量復制到遠程主機,常用選項:

  • -v:顯示復制過程
  • -r:遞歸復制目錄

將本地curl.sh 復制到/app/目錄:

pscp.pssh -H 192.168.1.10 /root/test/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/

pslurp.pssh

pslurp.pssh功能是將遠程主機的文件批量復制到本地,常用選項:

  • -L:指定從遠程主機下載到本機的存儲的目錄
  • -r:遞歸復制目錄

批量下載目標服務器的passwd文件至/app下,并更名為user

[root@centos6 app]# pslurp -H 192.168.39.136 -H 192.168.39.137 -L /app/ /etc/passwd user
[1] 09:21:37 [SUCCESS] 192.168.39.136
[2] 09:21:56 [SUCCESS] 192.168.39.137
[root@centos6 app]# ls # 復制過來的文件會保存在各自ip為名的目錄下,便于查看
192.168.39.136  192.168.39.137  -i
[root@centos6 app]# cd 192.168.39.136
[root@centos6 192.168.39.136]# ls
user

ssh端口轉發(fā)

SSH 會自動加密和解密所有 SSH 客戶端與服務端之間的網絡數據。但是,SSH 還能夠將其他 TCP 端口的網絡數據通過 SSH 鏈接來轉發(fā),并且自動提供了相應的加密及解密服務。這一過程也被叫做“隧道”(tunneling),這是因為 SSH 為其他 TCP 鏈接提供了一個安全的通道來進行傳輸而得名。例如,Telnet,SMTP,LDAP 這些 TCP 應用均能夠從中得益,避免了用戶名,密碼以及隱私信息的明文傳輸。而與此同時,如果工作環(huán)境中的防火墻限制了一些網絡端口的使用,但是允許 SSH 的連接,也能夠通過將 TCP 端口轉發(fā)來使用 SSH 進行通訊

SSH 端口轉發(fā)能夠提供兩大功能:

  1. 加密 SSH Client 端至 SSH Server 端之間的通訊數據
  2. 突破防火墻的限制完成一些之前無法建立的 TCP 連接

本地轉發(fā)

適合本人出差在外地,需要連接內網

ssh -L localport:remotehost:remotehostport sshserver

選項:

  • -f:后臺啟用
  • -N:不打開遠程shell,處于等待狀態(tài)
  • -g:啟用網關功能

示例:

  1. ssh –L 9527:telnetsrv:23 -N sshsrv
  2. telnet 127.0.0.1 9527

當訪問本機的9527的端口時,被加密后轉發(fā)到sshsrv的ssh服務,再解密被轉發(fā)到telnetsrv:23

data ? localhost:9527 ? localhost:XXXXX ? sshsrv:22 ? sshsrv:YYYYY ? telnetsrv:23

遠程轉發(fā)

適合其他人出差在外地,需要連接內網

ssh -R sshserverport:remotehost:remotehostport sshserver

示例:ssh –R 9527:telnetsrv:23 –N sshsrv

讓sshsrv偵聽9527端口的訪問,如有訪問,就加密后通過ssh服務轉發(fā)請求到本機ssh客戶端,再由本機解密后轉發(fā)到telnetsrv:23

Data ? sshsrv:9527 ? sshsrv:22 ? localhost:XXXXX ? localhost:YYYYY ? telnetsrv:23

動態(tài)轉發(fā)

適合翻墻

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協(xié)議轉發(fā)

ssh -X user@remotehost gedit

remotehost主機上的gedit工具,將會顯示在本機的X服務器上,用的顯卡時本機的顯卡,傳輸的數據將通過ssh連接加密

ssh服務器

服務器端:sshd

配置文件:/etc/ssh/sshd_config

日志文件:/var/log/secure

常用參數:

Port:端口號
ListenAddress ip:綁定端口ip,限制只能通過指定ip和端口訪問
LoginGraceTime 2m:登錄時寬限期
PermitRootLogin yes:限制root直接登錄,如被限制,可以使用普通賬戶登錄,再su - root
StrictModes yes:檢查.ssh/文件的所有者,權限等
MaxAuthTries 6:最大驗證次數,輸錯密碼的次數
MaxSessions 10:同一個連接最大會話
PubkeyAuthentication yes:公鑰驗證
PermitEmptyPasswords no:
PasswordAuthentication yes:密碼驗證
GatewayPorts no:
ClientAliveInterval:非活動時間單位:秒
ClientAliveCountMax:非活動時間的次數,,超時斷開,默認3
UseDNS yes:提高速度可改為no
GSSAPIAuthentication yes:提高速度可改為no
MaxStartups:未認證連接最大值,默認值10
Banner /path/file:歡迎詞,為了安全不要設置

AllowUsers user1 user2 user3:用戶白名單
DenyUsers:用戶黑名單
AllowGroups:組白名單
DenyGroups:組黑名單

ssh推薦設置

  1. 建議使用非默認端口
  2. 禁止使用protocol version 1
  3. 限制可登錄用戶
  4. 設定空閑會話超時時長
  5. 利用防火墻設置ssh訪問策略
  6. 僅監(jiān)聽特定的IP地址
  7. 基于口令認證時,使用強密碼策略:tr -dc A-Za-z0-9_ < /dev/urandom | head -c 30| xargs
  8. 使用基于密鑰的認證
  9. 禁止使用空密碼
  10. 禁止root用戶直接登錄
  11. 限制ssh的訪問頻度和并發(fā)在線數
  12. 經常分析日志/var/log/secure

dropbear

Dropbear是一個相對較小的SSH服務器和客戶端

源碼編譯安裝:

  1. 安裝開發(fā)包組:yum groupinstall “Development tools”
  2. 下載dropbear-2017.75.tar.bz2
  3. tar xvf dropbear-2017.75.tar.bz2
  4. less INSTALL README
  5. cd到解壓好的目錄里面
  6. ./configure
  7. make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp"
  8. make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" install

啟動ssh服務:

  1. ls /usr/local/sbin/ /usr/local/bin/

  2. /usr/local/sbin/dropbear -h

  3. mkdir /etc/dropbear

  4. dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key -s 2048

  5. dropbearkey -t dss -f /etc/dropbear/dropbear_dsa_host_key

  6. dropbear -p :2222 -F –E #前臺運行

    dropbear -p :2222 #后臺運行

客戶端訪問:

  1. ssh -p 2222 root@127.0.0.1
  2. dbclient -p 2222 root@127.0.0.1

AIDE

AIDE(Advanced Intrusion Detection Environment),是一個入侵檢測工具,主要用途是檢查文件的完整性,審計計算機上的那些文件被更改過了。

AIDE能夠構造一個指定文件的數據庫,它使用aide.conf作為其配置文件。AIDE數據庫能夠保存文件的各種屬性,包括:權限(permission)、索引節(jié)點序號(inode number)、所屬用戶(user)、所屬用戶組(group)、文件大小、最后修改時間(mtime)、創(chuàng)建時間(ctime)、最后訪問時間(atime)、增加的大小以及連接數。AIDE還能夠使用下列算法:sha1、md5、rmd160、tiger,以密文形式建立每個文件的校驗碼或散列號。

這個數據庫不應該保存那些經常變動的文件信息,例如:日志文件、郵件、/proc文件系統(tǒng)、用戶起始目錄以及臨時目錄

配置文件:/etc/aide.conf

!/etc/mtab:表示忽略這個文件的檢查
R=p+i+n+u+g+s+m+c+md5 權限+索引節(jié)點+鏈接數+用戶+組+大小+最后一次修改時間+創(chuàng)建時間+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

sudo

sudo能夠授權指定用戶在指定主機上運行某些命令。如果未授權用戶嘗試使用 sudo,會提示聯系管理員

sudo可以提供日志,記錄每個用戶使用sudo操作

sudo為系統(tǒng)管理員提供配置文件,允許系統(tǒng)管理員集中地管理用戶的使用權限和使用的主機

sudo使用時間戳文件來完成類似“檢票”的系統(tǒng),默認存活期為5分鐘的“入場券”

通過visudo命令編輯配置文件,具有語法檢查功能

visudo –c:檢查語法
visudo -f /etc/sudoers.d/test:編輯指定文件

配置文件(支持glob通配符):/etc/sudoers, /etc/sudoers.d/(針對每個用戶單獨授權,便于管理)

時間戳文件:/var/db/sudo

日志文件:/var/log/secure

授權規(guī)則格式:用戶 登入主機=(代表用戶) 命令

root ALL=(ALL) ALL

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

別名

別名有四種類型: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
    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

  5. 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

  6. Defaults:wang runas_default=tom
    wang ALL=(tom,jerry) ALL

  7. wang 192.168.1.6,192.168.1.8=(root) /usr/sbin/,!/usr/sbin/useradd

  8. wang ALL=(ALL) /bin/cat /var/log/messages*

    存在安全隱患,這樣設置的話,可以使用cat /var/log/messages /etc/shadow來訪問密碼文件

命令

sudo [-u user] COMMAND,常用選項:

  • -V:顯示版本信息等配置信息
  • -u user:指定runas,默認是root
  • -l:列出用戶在主機上可用的和被禁止的命令
  • -ll:詳細列出用戶在主機上可用的和被禁止的命令
  • -v:再延長密碼有效期限5分鐘,更新時間戳
  • -k:清除時間戳(1970-01-01),下次需要重新輸密碼
  • -K:與-k類似,還要刪除時間戳文件
  • -b:在后臺執(zhí)行指令
  • -p:改變詢問密碼的提示符號

TCP_Wrappers

TCP_Wrappers是一個工作在第四層(傳輸層)的的安全工具,對有狀態(tài)連接的特定服務進行安全檢測并實現訪問控制,凡是包含有l(wèi)ibwrap.so庫文件的的程序就可以受TCP_Wrappers的安全控制。它的主要功能就是控制誰可以訪問,常見的程序有rpcbind、vsftpd、sshd,telnet。

工作原理

TCP_Wrappers有一個TCP的守護進程叫作tcpd。以ssh為例,每當有ssh的連接請求時,tcpd即會截獲請求,先讀取系統(tǒng)管理員所設置的訪問控制文件,符合要求,則會把這次連接原封不動的轉給真正的ssh進程,由ssh完成后續(xù)工作;如果這次連接發(fā)起的ip不符合訪問控制文件中的設置,則會中斷連接請求,拒絕提供ssh服務。

工作原理.png

使用

TCP_Wrappers的使用主要是依靠兩個配置文件/etc/hosts.allow, /etc/hosts.deny,用于拒絕和接受具有TCP_Wrappers控制全的程序,詳細信息具體可以查看man幫助,這里我們就做簡單的演示和使用(man 5 hosts_access, man 5 hosts_options)

要說明的是當我們啟動一個受控制的軟件的時候,比如ssh

不過在剛開始的時候,/etc/hosts.allow,/etc/hosts.deny什么都沒有添加,此時沒有限制,是都可以連接的,現在我們來說如何設置,禁止和允許連接,配置文件格式遵循如下規(guī)則:

daemon_list@host: client_list [:options :option…]

daemon_list: 是程序的列表,可以是多個,是多個時,使用,隔開 
@host:可以沒有,是我們的限制的網卡訪問接口(自己的),設置允許或禁止他人從自己的那個網口進入。這一項不寫,就代表全部
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 
        ALL:所有主機 
        LOCAL:本地主機 
        KNOWN:主機名可解析成ip的 
        UNKNOWN:主機名無法解析成IP的 
        PARANOID:正向解析與反向解析不對應的主機

示例:

準備三個主機:

centOS 7:192.168.111.120
centOS 6:192.168.111.110
centOS 5:192.168.111.130

  1. 現在,我的centOS 6想拒絕centOS 7 的ssh訪問: 我在hosts.deny中寫:

    sshd@192.168.111.110:192.168.111.120
    

    然后我使用centOS 7 連接,就無法連接:

    [root@CT73 ~]$ssh 192.168.111.110
    ssh_exchange_identification: read:Connection reset by peer
    
  2. 或者我們還可以這樣寫(hosts.deny):

    in.telnetd,sshd: ALL
    

    這就意味著我們使用ssh,或者telnetd訪問這個機器都是無法訪問的,然后,我們就在hosts.allow中添加如下一行:

    sshd:192.168.111.120
    

    出現了下面的效果:

    [root@CT73 ~]$ssh 192.168.111.110
    root@192.168.111.110's password:
    Last login: Thu Sep 28 14:51:57 2017 from 192.168.111.120
    

    我們就可以連接了,我們想要訪問其他主機的資源,在連接過程中,對方的機器會按照順序先檢查/etc/hosts.allow,再檢查/etc/hosts.deny。如果在allow中允許連接,就可以連接的上,即便是又在deny中添加了限制也沒效果,但是在allow中沒有添加你的機器,但是在deny中設置了你的主機無法連接,那你是無法連接上對方的主機的。

  3. 我們還可以禁止后允許某個網段進行連接,以禁止為例:

    in.telnetd,sshd@192.168.111.110:192.168.37.
    

    這樣的話192.168.37.網段的所有機器都無法通過這連個程序訪問到我的機器。

  4. 現在,我們使用一個關聯詞,EXCEPT,host.deny文件配置如下:

    in.telnetd,sshd: ALL
    

    hosts.allow文件配置如下:

    sshd:192.168.111. EXCEPT 192.168.111.120
    

    此時,centOS 7 能否訪問centOS 6呢:

    [root@CT73 ~]$ssh 192.168.111.110
    ssh_exchange_identification: read:Connection reset by peer
    

    實驗證明,我們是無法連接的,這是由于,雖然我們在hosts.allow文件中設置了整個192.168.111.這個網段都可以訪問,但是使用EXCEPT關鍵字將192.168.111.120排除, 所以我們還是不能連接。 然后,我們重寫一下hosts.allow文件:

    sshd:192.168.111. EXCEPT 192.168.111.
    

    然后,我們使用centOS 5和centOS 7連接:

    [root@CT511 ~]#ssh 192.168.111.110
    ssh_exchange_identification:Connection closed by remote host
    
    [root@CT73 ~]#ssh 192.168.111.110
    ssh_exchange_identification:Connection closed by remote host
    

選項

上面還有 [ :options :option… ]選項,我們我們看看他們是咋用的 (更多使用方法查看 man 5 hosts_options)

deny 主要用在/etc/hosts.allow定義“拒絕”規(guī)則
allow 主要用在/etc/hosts.deny定義“允許” 規(guī)則
spawn 啟動一個外部程序完成執(zhí)行的操作
twist 實際動作是拒絕訪問,使用指定的操作替換當前服務,標準I/O和ERROR發(fā)送到客戶端,默認至/dev/null

示例:

  1. 在hosts.allow拒絕連接:

    sshd:192.168.111.120:deny
    

    這樣,雖然我們雖然在allow文件中添加可用規(guī)則,但是我們使用了:deny,生生的還是將該地址給拒絕了:

    [root@CT73 ~]$ssh 192.168.111.110
    ssh_exchange_identification: read:Connection reset by peer
    
  2. 在hosts.deny拒絕連接:

    sshd:192.168.111.120:allow
    

    這樣,雖然我們雖然在deny文件中添加不可用規(guī)則,但是我們使用了:allow,依舊允許該IP連接:

    [root@CT73 ~]$ssh 192.168.111.110
    root@192.168.111.110's password:
    Last login: Thu Sep 28 15:44:27 2017 from 192.168.111.130
    
  3. 我們可以使用spawn啟用外部命令,那么我們就能使用外部命令寫日志文件: 在hosts.allow中:

    sshd,in.telnetd:192.168.111.:spawn echo "`date +'%%F %%T'` login from client\: %c to %d">>/var/log/tcpwrap.log
    

    我們在使用centOS 7 訪問后,看一下日志:

    [root@CT691 ~]#tail /var/log/tcpwrap.log
    2017-09-2816:27:28 login from client:192.168.111.120 to sshd
    

    在/etc/hosts.allow中添加,允許登錄,并記錄日志

    在/etc/hosts.deny中添加,拒絕登錄, 并記錄日志

    %c 客戶端信息 %s 服務器端信息 %d 服務名 %p 守護進程的PID %% 代表% : 符號轉義

  4. 我們可以使用twist拒絕用戶訪問,并返回一個信息:

    sshd,in.telnetd:192.168.111.:twist echo "Hello I am T_T !"
    

    然后我們進行連接,使用調試模式,因為默認ssh是看不到返回信息的,telnet可以:

    [root@centos6 ~]# ssh -v 192.168.111.110
    OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013
    debug1: Reading configuration data /etc/ssh/ssh_config
    debug1: Applying options for *
    debug1: Connecting to 192.168.39.129 [192.168.39.129] port 22.
    debug1: Connection established.
    debug1: permanently_set_uid: 0/0
    debug1: identity file /root/.ssh/identity type -1
    debug1: identity file /root/.ssh/identity-cert type -1
    debug1: identity file /root/.ssh/id_rsa type -1
    debug1: identity file /root/.ssh/id_rsa-cert type -1
    debug1: identity file /root/.ssh/id_dsa type -1
    debug1: identity file /root/.ssh/id_dsa-cert type -1
    debug1: identity file /root/.ssh/id_ecdsa type -1
    debug1: identity file /root/.ssh/id_ecdsa-cert type -1
    debug1: ssh_exchange_identification: Hello I am T_T !    # 返回的信息
    
    ssh_exchange_identification: Connection closed by remote host  # 被拒絕訪問
    

調試工具

tcpdmatch [-d] daemon[@host] client

-d 測試當前目錄下的 hosts.allow和hosts.deny

這樣,在別人沒有連接的時候,我們就可以知道我們設置的那些IP是否可以連接我們的主機: (hosts.deny)

sshd:192.168.111.120
[root@CT691 ~]#tcpdmatch -d ssh 192.168.111.120
client: address 192.168.111.120
server: process ssh
access: granted

PAM

Pluggable Authentication Modules

PAM 是關注如何為服務驗證用戶的 API,通過提供一些動態(tài)鏈接庫和一套統(tǒng)一的API,將系統(tǒng)提供的服務和該服務的認證方式分開。使得系統(tǒng)管理員可以靈活地根據需要給不同的服務配置不同的認證方式而無需更改服務程序。是一種認證框架,自身不做認證。

它提供了對所有服務進行認證的中央機制,適用于login,遠程登錄(telnet,rlogin,fsh,ftp,點對點協(xié)議(PPP)),su等應用程序中。系統(tǒng)管理員通過PAM配置文件來制定不同應用程序的不同認證策略;應用程序開發(fā)者通過在服務程序中使用PAM API(pam_xxxx( ))來實現對認證方法的調用;而PAM服務模塊的開發(fā)者則利用PAM SPI來編寫模塊(主要調用函數pam_sm_xxxx( )供PAM接口庫調用,將不同的認證機制加入到系統(tǒng)中;PAM接口庫(libpam)則讀取配置文件,將應用程序和相應的PAM服務模塊聯系起來

架構

PAM架構.jpg

配置文件

模塊文件目錄:/lib64/security/*.so

環(huán)境相關的設置:/etc/security/

主配置文件:/etc/pam.conf,默認不存在,格式如下:

application type control module-path arguments

服務名(application)
telnet、login、ftp等,服務名字“OTHER”代表所有沒有在該文件中明確配置的其它服務
模塊類型(module-type)
    Auth 賬號的認證和授權
    Account 與賬號管理相關的非認證類的功能,如:用來限制/允許用戶對某個服務的訪問時間,當前有效的系統(tǒng)資源(最多可以有多少個用戶),限制用戶的位置(例如:root用戶只能從控制臺登錄)
    Password 用戶修改密碼時密碼復雜度檢查機制等功能
    Session 用戶獲取到服務之前或使用服務完成之后需要進行一些附加的操作,如:記錄打開/關閉數據的信息,監(jiān)視目錄等
    -type 表示因為缺失而不能加載的模塊將不記錄到系統(tǒng)日志,對于那些不總是安裝在系統(tǒng)上的模塊有用
control PAM庫該如何處理與該服務相關的PAM模塊的成功或失敗情況
    簡單方式實現:一個關健詞實現
        required :一票否決,表示本模塊必須返回成功才能通過認證,但是如果該模塊返回失敗,失敗結果也不會立即通知用戶,而是要等到同一type中的所有模塊全部執(zhí)行完畢再將失敗結果返回給應用程序。即為必要條件
        requisite :一票否決,該模塊必須返回成功才能通過認證,但是一旦該模塊返回失敗,將不再執(zhí)行同一type內的任何模塊,而是直接將控制權返回給應用程序。是一個必要條件
        sufficient :一票通過,表明本模塊返回成功則通過身份認證的要求,不必再執(zhí)行同一type內的其它模塊,但如果本模塊返回失敗可忽略,即為充分條件
        optional :表明本模塊是可選的,它的成功與否不會對身份認證起關鍵作用,其返回值一般被忽略
        include: 調用其他的配置文件中定義的配置信息
    復雜詳細實現:使用一個或多個“status=action”
        [status1=action1 status2=action …]
            Status:檢查結果的返回狀態(tài)
            Action:采取行為 ok,done,die,bad,ignore,reset
                ok 模塊通過,繼續(xù)檢查
                done 模塊通過,返回最后結果給應用
                bad 結果失敗,繼續(xù)檢查
                die 結果失敗,返回失敗結果給應用
                ignore 結果忽略,不影響最后結果
                reset 忽略已經得到的結果
module-path 用來指明本模塊對應的程序文件的路徑名
    /lib64/security目錄下的模塊可使用相對路徑
    其他位置需要使用絕對路徑
Arguments 用來傳遞給該模塊的參數

為每種應用模塊提供一個專用的配置文件:/etc/pam.d/APP_NAME,格式如下:

type control module-path arguments

注意:

  1. 如/etc/pam.d存在,/etc/pam.conf將失效
  2. 修改PAM配置文件將馬上生效
  3. 編輯pam規(guī)則時,保持至少打開一個root會話,以防止root身份驗證錯誤

認證原理

PAM認證首先要確定那一項服務,然后加載相應的PAM的配置文件(位于/etc/pam.d下),最后調用認證文件(位于/lib/security下)進行安全認證

PAM認證原理.jpg

PAM認證機制

PAM認證過程:

  1. 使用者執(zhí)行/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回傳的結果決定下一個動作(重新輸入密碼或者通過驗證)

示例1:

模塊:pam_shells

功能:檢查有效shell

man pam_shells

示例:不允許使用/bin/csh的用戶本地登錄

  1. vim /etc/pam.d/login

    加上 auth required pam_shells.so
    
  2. vim /etc/shells

    去掉 /bin/csh
    
  3. useradd –s /bin/csh testuser

  4. testuser在終端不可登錄,但可以su-登錄,因為沒有修改/etc/pam.d/su配置文件中的規(guī)則

  5. tail /var/log/secure

示例2:

模塊:pam_securetty.so

功能:只允許root用戶在/etc/securetty列出的安全終端上登陸

示例:允許root在telnet登陸(默認telnet不允許root賬號直接登錄)

  1. vim /etc/pam.d/remote

    #auth required pam_securetty.so #將這一行加上注釋
    
  2. 或者/etc/securetty文件中加入

    pts/0,pts/1…pts/n

示例3:

模塊:pam_nologin.so

功能:如果/etc/nologin文件存在,將導致非root用戶不能登陸;如果用戶shell是/sbin/nologin 時,當該用戶登陸時,會顯示/etc/nologin文件內容,并拒絕登陸

示例:禁止所有非root用戶登錄

  1. touch /etc/nologin
  2. 通過tty終端測試

示例4:

模塊:pam_limits.so

功能:在用戶級別實現對其可使用的資源的限制,例如:可打開的文件數量,可運行的進程數量,可用內存空間

修改限制的實現方式:

  1. ulimit命令,立即生效,但無法保存,常用選項:

    ulimit.jpg
  2. 配置文件:/etc/security/limits.conf, /etc/security/limits.d/*.conf,格式如下:

    <domain> <type> <item> <value>
    
    <domain> 應用于哪些對象
        Username 單個用戶
        @group 組內所有用戶
        * 所有用戶
    <type> 限制的類型
        Soft 軟限制,普通用戶自己可以修改
        Hard 硬限制,由root用戶設定,且通過kernel強制生效
        - 二者同時限定
    <item> 限制的資源
        nofile 所能夠同時打開的最大文件數量,默認為1024
        nproc 所能夠同時運行的進程的最大數量,默認為1024
    <value> 指定具體值
    
    [j@centos7 ~]$ cat /etc/security/limits.conf 
    # /etc/security/limits.conf
    #
    #This file sets the resource limits for the users logged in via PAM.
    #It does not affect resource limits of the system services.
    #
    #Also note that configuration files in /etc/security/limits.d directory,
    #which are read in alphabetical order, override the settings in this
    #file in case the domain is the same or more specific.
    #That means for example that setting a limit for wildcard domain here
    #can be overriden with a wildcard setting in a config file in the
    #subdirectory, but a user specific setting here can be overriden only
    #with a user specific setting in the subdirectory.
    #
    #Each line describes a limit for a user in the form:
    #
    #<domain>        <type>  <item>  <value>
    #
    #Where:
    #<domain> can be:
    #        - a user name
    #        - a group name, with @group syntax
    #        - the wildcard *, for default entry
    #        - the wildcard %, can be also used with %group syntax,
    #                 for maxlogin limit
    #
    #<type> can have the two values:
    #        - "soft" for enforcing the soft limits
    #        - "hard" for enforcing hard limits
    #
    #<item> can be one of the following:
    #        - core - limits the core file size (KB)
    #        - data - max data size (KB)
    #        - fsize - maximum filesize (KB)
    #        - memlock - max locked-in-memory address space (KB)
    #        - nofile - max number of open file descriptors
    #        - rss - max resident set size (KB)
    #        - stack - max stack size (KB)
    #        - cpu - max CPU time (MIN)
    #        - nproc - max number of processes
    #        - as - address space limit (KB)
    #        - maxlogins - max number of logins for this user
    #        - maxsyslogins - max number of logins on the system
    #        - priority - the priority to run user process with
    #        - locks - max number of file locks the user can hold
    #        - sigpending - max number of pending signals
    #        - msgqueue - max memory used by POSIX message queues (bytes)
    #        - nice - max nice priority allowed to raise to values: [-20, 19]
    #        - rtprio - max realtime priority
    #
    #<domain>      <type>  <item>         <value>
    #
    
    #*               soft    core            0
    #*               hard    rss             10000
    #@student        hard    nproc           20
    #@faculty        soft    nproc           20
    #@faculty        hard    nproc           50
    #ftp             hard    nproc           0
    #@student        -       maxlogins       4
    
    # End of file
    

示例:限制用戶最多打開的文件數和運行進程數

  1. vim /etc/pam.d/system-auth

    加上 session required pam_limits.so
    
  2. vim /etc/security/limits.conf

    apache – nofile 10240 apache用戶可打開10240個文件
    student hard nproc 20 不能運行超過20個進程
    
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容