基本作業系統學習筆記

2023-09-05 15:00:34

1、Vmware、OS簡述

1、虛擬機器器定義

虛擬機器器(Virtual Machine)指通過軟體模擬的具有完整硬體系統功能的、執行在一個完全隔離的環境中的完整計算機系統。在實體計算機中能夠完成的工作在虛擬機器器中都能夠實現。在計算機中建立虛擬機器器時,需要將實體機的部分硬碟和記憶體容量作為虛擬機器器的硬碟和記憶體容量。基本上可以像使用實體機一樣對虛擬機器器進行操作。(通過虛擬機器器模擬其他作業系統)(寄生在物理機上)(虛擬機器器其實就是邏輯上模擬的一臺計算機)

  • 執行記憶體:越大,可以同時執行的程序就越多

  • 磁碟:越大,能夠儲存的資料越多

主流的虛擬軟體:VMware(收費) VirtualBox(免費)

為什麼要使用虛擬機器器?
①安全測試
②需要使用到多種作業系統
③解決硬體資源過剩。例:雲服務的虛擬資源技術
④虛擬化技術(分塊,邏輯上分開)
虛擬機器器的特點
分割區:在單一物理伺服器上同時執行多個虛擬機器器
隔離:同一伺服器上的虛擬機器器之間互相隔離
封裝:整個虛擬機器器都儲存在檔案當中,可以通過移動檔案的方式進行虛擬機器器的遷移
相對於硬體獨立:無需修改即可在任何伺服器上執行虛擬機器器

2、VMware的三種聯網方式

一、橋接(Bridge)

閘道器:真實的裝置閘道器

相當於連線著交換機上,與物理機平等關係

兩區域網在鏈路層上進行連線。
需要注意的點:
	1.設定橋接的時候,應保持VM於pc處於同網段
	2.避免IP衝突
二、NAT模式

(源NAT-->源NAT轉換,目的SNAT-->目的NAT轉換)

網路地址轉化
實現內網能存取外網但是外網不能存取內網
三、僅主機模式
只能跟物理機(路由器)通訊,虛擬機器器連線在路由器上。
僅能讓主機與虛機之間實現網路共用

虛擬記憶體:真實記憶體+磁碟空間

3、快照

類似於遊戲存檔,記錄虛擬機器器當前時刻,恢復快照也就相當於讀檔

4、克隆

①連結克隆

類似於快捷方式,如果原虛擬機器器損毀,丟失,移動,連結克隆出來的虛擬機器器也將無法使用
類似於快捷方式,母體奔潰,連結克隆也奔潰,但是操作互不干涉

②完整克隆

類似於複製貼上,如果原虛擬機器器損毀,丟失,移動,完整克隆出來的虛擬機器器不受任何影響,獨立的一個個體
完完全全的克隆,母體奔潰不會影響克隆體

5、主流的作業系統

  1. Windows :使用者基數大,適合個人使用 XP win7 win8 win10 win11
  2. Linux :適合伺服器使用,穩定,開源的作業系統 CentOS Ubuntu redhat kali
  3. Mac OS :適合開發使用,很少受到電腦病毒的襲擊。
  • 概念:
管理計算機硬體與軟體資源的計算機程式。
提供一個讓使用者與系統互動的操作介面。
====>作業系統(operating system,簡稱OS)是管理計算機硬體與軟體資源的計算機程式。作業系統需要處理如管理與設定記憶體、決定系統資源供需的優先次序、控制輸入裝置與輸出裝置、操作網路與管理檔案系統等基本事務。作業系統也提供一個讓使用者與系統互動的操作介面。作業系統也是軟體的一部分,它是硬體基礎上的第一層軟體,是硬體和其它軟體溝通的橋樑。作業系統會控制其他程式執行,管理系統資源,提供最基本的計算功能,如管理及設定記憶體、決定系統資源供需的優先次序等,同時還提供一些基本的服務程式,如:
1、檔案系統(計算機儲存資訊的結構,資訊儲存在檔案中,檔案主要儲存在計算機的內部硬碟裡)
2、裝置驅動程式(提供連線計算機的每個硬體裝置的介面)
3、使用者介面(作業系統為使用者提供一種執行程式和存取檔案系統的方法)
4、系統服務程式(當計算機啟動時,會自啟動許多系統服務程式,執行安裝檔案系統、啟動網路服務、執行預定任務等操作)
一些歷程:

xp-- > win 7 NT 6.1

win7 提升啟動速度
多了一個「庫」功能:可以把位於不同位置的資料夾合併到一起
磁碟碎片整理

win7 --> win10 NT10.0

登入面板:
win10參照現代移動裝置,增加了時間鎖屏介面
登入方式:
win10加入了生物特徵識別的功能WindowsHello
開始選單的進化,附帶平板功能
搜尋選單:
加入Cortana,最明顯的變化就是支援語音搜尋
其他
dos:命令列
MS-DOS:單使用者單任務作業系統 
NT:單使用者多工作業系統

2、Windows基礎命令

1、DOS命令列視窗

1.什麼是命令列?

命令列就是在Windows作業系統中開啟DOS視窗,以字串的形式執行Windows管理程式。

2.什麼是DOS?

DOS(Disk Operation System磁碟作業系統),DOS系統目前已經沒有什麼人使用了,但是dos命令卻依然存在於我們使用的windows系統之中。大部分的DOS命令都已經在Windows裡變成了視覺化的介面,但是有一些高階的DOS命令還是要在DOS環境下來執行。所以學習命令列對於我們熟練操作Windows系統是很有必要的。

3.如何進入命令列視窗(DOS)-->見下文

4.符號約定

5.內部命令與外部命令

內部命令:內部命令已整合在系統中,無需另外命令可執行檔案支援,如DIR、TIME、CLS、CD、RD等命令都屬內部命令。使用 help 命令進行檢視。

外部命令(後期新增的一個程式):外部命令實際上是一個DOS應用程式,通過執行儲存於外部(盤)的程式完成其功能,能夠使使用者的操作更加方便和深入。這些外部命令都是以檔案的形式存在,Windows系統的DOS外部命令儲存在Windows主目錄下的 "Command"目錄中。通俗來講就是安裝的軟體。

2、什麼是shell

shell是一個環境,我們可以執行我們的命令,程式和shell指令碼。shell有不同的風格,就像有不同風格的作業系統。每個的shelI的風格,有它自己的—套識別的命令和功能。Shell是一個環境,我們可以執行我們的命令,程式和shell指令碼。殼有不同的風格,就像有不同風格的作業系統.每個的Sheli的風格,有它自己的-套識別的命令和功能。

Windows當中不區分大小寫;linux當中區分大小寫。

3、Windows的構架

第一層:基礎硬體(核心圈)

第二層:作業系統

第三層:shell環境(執行環境--作業系統的最外一層--作用是:通過shell環境與作業系統進行互動)

第四層:應用程式(程序)

第五層:使用者

①如果在物理機上未更改網路卡vmnat8時虛擬機器器還能有網路的原因是?
1.我們使用者使用的是DHCP模式
2.VMware這個網路卡就會通過DHCP自動的分配到IP地址

②為什麼虛擬機器器的網路卡要和物理機上的vmnet8的網段一樣?
當虛擬機器器的網路模式選擇vmnet8(NAT模式)時,虛擬機器器的網路/流量就會全部通過物理機上的vmnet8這個網路卡進行轉換,就是將物理機上的vmnet8這個網路卡當作虛擬機器器的邊界閘道器,通過邊界閘道器(邊界路由)轉換成公網IP與公網進行聯絡----**NAT技術**。當兩者的網段相同時這兩種就組成了一個內網,就實現了網路卡之間的通訊,兩者互通之後在可以進行IP地址的轉換,邊界的轉換。

4、Windows的基礎命令

1.如何進入命令列視窗(DOS)

1、win+r 鍵入 cmd --弊端:許可權不夠

2、win+q(win7打不開) 搜尋 cmd或者命令提示字元,通過右鍵選擇管理員模式開啟 --缺點:麻煩

3、通過檔案系統開啟 ---使用此方法的原因是:有些指令需要在某個目錄下才可執行(沒有使用管理員身份)//也可以切換路徑--麻煩

  • cmd是應該存放在C槽裡的可執行檔案

  • win+q可以檢索電腦裡面存在的可執行檔案/程式、資料夾等

2.檢視當計算機版本/主機名

ver/hostname/whoami(這個是windows和Linux通用的目錄--可以爆出計算機名、主機名、賬戶名)

3.ipconfig --偵錯計算機網路的常用命令

eg:ipconfig /all --一般用來檢視當前PC的實體地址

描述:ipconfig是偵錯計算機網路的常用命令,通常大家使用它顯示計算機中網路介面卡的IP地址、子網掩碼及預設閘道器。

  • 命令 / ? //這個問號表示可以檢視當前命令下的所有可加引數
4.netstat

Netstat是在核心中存取網路連線狀態及其相關資訊的程式,它能提供TCP連線,TCP和UDP監聽,程序記憶體管理的相關報告。

Netstat是控制檯命令,是一個監控TCP/IP網路的非常有用的工具,它可以顯示路由表、實際的網路連線以及每一個網路介面裝置的狀態資訊。Netstat用於顯示與IP、TCP、UDP和ICMP協定相關的統計資料,一般用於檢驗本機各埠的網路連線情況。

​ 常用命令:netstat -ano

  • PID(程序控制符)英文全稱為Process Identifier。PID就是各程序的身份標識,程式一執行系統就會自動分配給程序一個獨一無二的PID。程序中止後PID被系統回收,可能會被繼續分配給新執行的程式。PID這一列代表了各程序的程序ID,也就是說,PID就是各程序的身份標識。

  • 程序:正在進行的一個過程或者說一個任務。而負責執行任務則是CPU。程序指的是程式的執行過程(是程式執行的一部分)

  • 所謂通訊端(Socket)【其實就是----IP地址:埠號】,就是對網路中不同主機上的應用程序之間進行雙向通訊的端點的抽象。一個通訊端就是網路上程序通訊的一端,提供了應用層程序利用網路協定交換資料的機制。從所處的地位來講,通訊端上聯應用程序,下聯網路協定棧,是應用程式通過網路協定進行通訊的介面,是應用程式與網路協定棧進行互動的介面。

  • 監聽:接收資料的狀態(在win7中顯示為LISTENGING)

5.Windows基礎命令

services.msc:服務

lusrmgr.msc:本地使用者和組

gpedit.msc:本地組策略編輯器

secpol.msc:本地安全策略

  • 在DOS當中不常用,因為在Windows已經有完整的圖形化介面
  • 命令列中輸入net localgroup即可檢視本地使用者組(在命令列當中)
6.regedit--登入檔

登入檔是windows作業系統中的一個核心資料庫,其中存放著各種引數,直接控制著windows的啟動、硬體驅動程式的裝載以及一些windows應用程式的執行,從而在整個系統中起著核心作用。這些作用包括了軟、硬體的相關設定和狀態資訊,比如登入檔中儲存有應用程式和資源管理器外殼的初始條件、偏好設定和解除安裝資料等,聯網計算機的整個系統的設定和各種許可,副檔名與應用程式的關聯,硬體部件的描述、狀態和屬性,效能記錄和其他底層的系統狀態資訊,以及其他資料等。

在檔案系統與系統目錄中詳細講解。

7.ping命令

PING (Packet InterNet Groper,因特網包探索器),是一個用於測試網路連線量的程式 。該命令通過向特定的目標主機傳送 ICMP(Internet Control Message Protocol ,因特網報文控制協定)echo請求報文,測試目標是否可達及瞭解其有關狀態 。TTL是 Time To Live的縮寫,該欄位指定IP包被路由器丟棄之前允許通過的最大網段數量。TTL是IPv4報頭的一個8 bit欄位。最大值255。

eg: ping 192.168.126.2 -t --持續ping測試,用來測試當對裝置進行某一更改時還能不能進行聯通。

8.cd命令

描述:cd命令可以進入指定資料夾

常用的 cd 命令(在能用在當前碟符)有:
1、cd .. 跳轉到上一級目錄
2、cd / 跳轉到根目錄 (注:加上 /d 才能改變碟符)【C:\Program Files> cd /D D:\boot4 (引數/D--切換碟符(跳轉磁碟))】 (在Linux當中所有的檔案都在根目錄下,所有不需要跳轉磁碟)
3、cd + path 跳轉到path目錄
4、cd /? 檢視cd命令的詳細資訊

  • cd 目錄 (必須目錄在當前資料夾下)
  • d: --進入D槽

cd ./xxx //相對路徑 (一個點代表當前路徑;整個表示當前路徑下的某個檔案)

cd D:/xx //絕對路徑

絕對路徑:
路徑的寫法,由根目錄 / 寫起,例如: /usr/share/doc 這個目錄。

相對路徑:
路徑的寫法,不是由 / 寫起,例如由 /usr/share/doc 要到 /usr/share/man 底下時,可以寫成: cd ../man 這就是相對路徑的寫法。
9.dir命令

描述:dir(directory)命令基本上會列出目錄中的檔案及子目錄的名稱,也可以列出其檔案大小,建立時間等相關資訊,並且列出所在的磁碟、可用空間等資訊。dir命令也可以尋找其檔名稱符合特定條件的檔案。

eg:dir /A/s --檢視所有檔案,包括隱藏檔案

10.mkdir或md (make directory)

描述: mkdir命令的功能是建立新的子目錄。

Windows當中已有圖形化介面。

11.rmdir或rd (remove directory)

描述:刪除一個目錄。(不能刪除帶檔案內容的目錄)

語法: rmdir [/s] [/qa] [drive:]path

引數:/S除目錄本身外,還將刪除指定目錄下的所有子目錄和檔案。用於刪除目錄樹。(/Q強制刪除)

Windows當中已有圖形化介面。

12.type命令

描述:命令用來檢視指定目錄下檔案的內容,如果一個檔案內容比較少,那用type來檢視非常方便,如果內容很大,用type閱讀就不是方便了。

引數:type [drive:] [path] filename

13.move命令

描述:將一個或多個檔案從一個目錄移動到另一個目錄。
語法:move [/y | /-y] [] []
引數:
     /y:     不提示確認是否要覆蓋現有目標檔案。
     /-y:    確認是否要覆蓋現有目標檔案。(預設值)
     : 指定要移動的檔案的路徑和名稱。 如果要移動或重新命名目錄,Source應該是當前目錄路徑和名稱。
     :   指定要將檔案移動到的路徑和名稱。 如果要移動或重新命名目錄,Target應該是所需的目錄路徑和名稱。

  • move 既可以移動檔案,也可以重新命名檔案。
14.copy命令

描述:將一份或多份檔案複製到另一個位置。

  • 說明: COPY命令只能複製檔案,不能複製資料夾。

語法:copy [引數] [源路徑] [目標路徑]

可不指定引數;不寫目標路徑則為當前路徑。

15.del命令

描述:刪除一個或多個檔案。

說明:還可以使用萬用字元(* 和?)一次刪除多個檔案。但是,在使用 del 命令時要慎重地使用萬用字元,以避免無意中刪除檔案。

16.tasklist命令

描述:顯示在本地或遠端機器上當前執行的程序列表。

說明:利用 /fi 引數篩選結果,獲取指定程序的相關資訊。

常用用法:
tasklist --顯示本地計算機或遠端計算機上當前正在執行的程序列表。
tasklist /svc --檢視每個程序中主持的服務。(/svc=/s+/v+/c)(重點)
tasklist /fi "pid eq 10528" --顯示pid為10528的程序資訊。
tasklist /fo csv > tasklist.csv

通過映像名稱尋找pid:tasklist /fi "pid" eq 2616 //(課上的例子)

通過pid尋找映像名稱:tasklist /fi "imagename eq cmd.exe" //(課上的例子)

17.taskkill命令

描述:使用該工具按照程序 ID (PID) 或映像名稱終止任務。

說明:配合tasklist使用,先使用tasklist查詢相關程序資訊,在終止對應程序。

​ 常用命令:
​ taskkill /im firefox.exe --殺死火狐的程序
​ taskkill /pid 10520 /t /f --殺死pid為10520的程序
​ taskkill /fi 「imagename eq firef*」 -通過映像名稱搜尋來殺死名稱為firef的程序

18.比較符

eq: equal (相等)

ne: no equal (不相等)

gt: greater than (大於)

lt: less than (小於)

ge: greater equal (大於等於)

le: less equal (小於等於)

19.net user命令

net user 使用者名稱密碼ladd建立使用者

net user guest /active:yes 啟用guest使用者

net user 檢視有哪些使用者/帳戶名檢視帳戶的屬性

net localgroup administrators 使用者名稱ladd 把「使用者"新增到管理員中使其具有管理員許可權,注意:administrator後加s用複數

net start 檢視開啟了哪些服務

net start 服務名開啟服務(如:net start telnet,net start schedule)net stop服務名停止某服務

(此命令在使用者和組當中講解)

3、檔案系統與系統目錄

檔案系統相當於倉庫管理員,可以有規律的擺放檔案。

檔案系統包括有:NTFS、FAT16、FAT32、EXFAT

紀錄檔檔案系統: 
NTFS : windows特有(主流檔案系統)
FAT16 : 只支援2GB以下的檔案(少)
FAT32 : 支援4GB以下的檔案(少)
EXFAT :專門為快閃記憶體裝置設計,Windows、Linux、Mac均可適用
  • 快閃記憶體裝置:移動磁碟、優盤等

  • 檔案系統的載體:磁碟

1、磁碟

硬碟

磁頭和碟片組成機械硬碟(磁頭和碟片是有很多層堆疊在一起)

每一個碟片都有兩個盤面(Side),裝上磁頭,就可以有效儲存資料,稱為有效碟片,順序重上至下,從「0」開始編號,盤面號又叫磁頭號

磁軌(Track):

磁碟在格式化的時候被分成很多個同心圓。同心圓軌跡叫做磁軌。磁軌從外向內自0開始編號。每一個盤面300~1024個磁軌。資訊是以脈衝串的形式記錄在這些軌跡當中。同心圓記錄的資料並不是完整的,而是被分成一段一段的圓弧,每一段圓弧就叫做一個磁區
  • 資訊以脈衝串的形式記錄在磁軌(軌道)上

  • 一個盤面差不多有300到1024個磁軌

柱面(Cylinder):

所有盤面上同一磁軌構成了一個圓柱,通常稱作柱面,磁頭在讀寫資料的時候,首先在同一柱面內從0磁頭開始操作,資料讀寫是按照柱面進行

磁區

柱面與磁軌組成的夾角稱為磁區

作業系統是以磁區的形式將資訊儲存在硬碟上
磁區從「1」開始編號,每個磁區包括512位元組的資料和一些其他資訊。
磁區有兩個主要部分:資料儲存地點識別符號,儲存資料的資料段
  • Windows作業系統當中使用的檔案系統FAT,NTFS,該檔案系統資料儲存單元叫---簇(每個簇4KB)。簇的大小會影響到整個空間的佔用以及讀寫效率。

  • Linux作業系統使用的檔案系統資料儲存單元叫---塊

MBR

MBR:主開機記錄區

主開機記錄區,位於整個磁碟的0磁軌0柱面1磁區,在總共512位元組大小的主引導磁區中,MBR應到程式佔用其中前446位元組,隨後64個位元組DPT(Disk Partition Table 硬碟分割區表),最後兩個位元組"55AA" 是分割區的有效結束標誌。
辨別MBR有效結束標誌是55AA(檢視16進位制)。
MBR所在的範圍:從檔案開頭到55AA結束。

動態磁碟與靜態磁碟的區別

動態磁碟和基本磁碟最本質的區別在於動態磁碟可以將多個物理磁碟組合成一個大的卷集,而基本磁碟只能在一個物理磁碟上建立分割區。基本磁碟受分割區表的限制,最多隻能建立4個磁碟分割區。動態磁碟可以容納4個以上的卷,卷的相關資訊不存在放在分割區表中,而是在卷之間進行復制,因此提高了容錯能力。

2、檔案系統

實現的功能:

1、檔案型別:可以從不同的角度來規定檔案的型別,如原始檔、目標檔案及執行檔案等。

2、檔案長度:檔案長度指檔案的當前長度。長度的單位可以是位元組或塊,也可能是最大允許的長度。

3、檔案的物理位置:該項屬性通常是用於指示檔案在哪一個裝置上及在該裝置的哪個位置的指標。(哪個磁區)

4、檔案的時間:建立時間、最後一次修改、最後一次存取時間。

檔案系統分類

①按用途分類:

1、系統檔案:這是指有系統軟體構成的檔案。大多數的系統檔案只允許使用者去呼叫,但不允許使用者去讀,更不允許修改;有的系統檔案不直接對使用者開放。

2、使用者檔案:指由使用者的原始碼、目標檔案、可執行檔案或資料等所構成的檔案。使用者將這些檔案委託給系統保管。

3、庫檔案:這是由標準子例程及常用的例程等所構成的檔案。這類檔案允許使用者呼叫,但不允許修改。

②按資料形式分類:

1、原始檔:由程式和資料構成的檔案。通常由終端或輸入裝置輸入的源程式和資料所形成的檔案都屬於原始檔。通常是由ASCII碼或漢字所組成的。

2、目標檔案:指把源程式經過相應語言的編譯程式編譯過,但尚未經過連結程式的目的碼所構成的檔案。屬於二進位制檔案。目標檔案所使用的字尾名是".obj"。

3、可執行檔案:這是指把編譯後所產生的目的碼再經過銷接程式髓接後所形成的檔案。

③按儲存控制屬性分類

1、只執行檔案:這類檔案只允許被核準的使用者呼叫執行,既不允許讀,更不允許寫。

2、唯讀檔案:這類檔案只允許檔案主及被核準的使用者去讀,但不允許寫。

3、讀寫檔案:這是指允許檔案主和被核準的使用者去讀或寫的檔案。

④按組織和處理分類(瞭解)

1、普通檔案:由ASCII碼或二進位制碼組成的字元檔案。一般使用者建立的源程式檔案、資料檔案、目的碼檔案及作業系統自身程式碼檔案、庫檔案、實用程式文性等。通常儲存在外儲存裝置上。

2、目錄檔案:由檔案目錄組A的,用來管理和實現檔案系統功能的系統檔案。目錄檔案也是由字元序列構成,因此劉其可進行與背通檔案一樣的檔案操作。

3、特殊檔案:特指系統中的各類IO沒備

常見檔案系統

FAT

FAT(File Allocation Table-檔案分配表)檔案系統用"簇"作為資料單元。

●一個「簇」由一連串的磁區組成,簇所含的磁區數必須是2的整數次冪。簇的最大值是64個磁區,32kb。

●所有簇從2開始進行編號,每個簇都有一個自己的編號。

●使用者檔案和目錄都儲存在簇中。

●檔案系統分配磁碟按照簇進行分配

●FAT檔案系統是Windows作業系統所使用的一種檔案系統。發展過程經歷了FAT12,FAT 16.,FAT32,exFAT(FAT64)四個階段。

FAT32對FAT16的改進

​ 1、更大的分割區和容量

​ 2、更小的簇

​ 3、不易崩潰

exFAT

exFAT (Extended_File A1location Table FileSystem,擴充套件FAT,即擴充套件檔案分配表)

●為了解決FAT32等不支援4G及其更大的檔案而推出。是微為了解決FAT 32等不支援4G及其更大的檔案而推出。是微軟專門為快閃記憶體裝置設計的檔案系統,windows XPSP2、windows Vista SP 1及以上系統都支援,分割區最大容量大到16MB。

●64ZB,檔案體積最大16EB。簇尺寸可以達到

●exFAT別名為FAT64,適用範圍為大於32GB的U盤、SD卡。設計的自的是在FAT3平與NTFS乏間取得一個折中,有FAT32的輕便、不需要耗損太多的效能及記憶體來處理檔案運作,又有NTFS的AA存取控制機制。

●三大主流作業系統(Linux、 Mac、 windows)都支援exFAT格式。

NTFS

特點:

1、支援大分割區

2、可以恢復檔案系統

3、支援對分割區、資料夾和檔案的壓縮

4、採用更小的簇

5、可以為共用資源、資料夾以及檔案設定存取許可許可權

6、可以進行磁碟配額管理

7、變更紀錄檔

3、實現共用資料夾

1、檢視虛擬機器器的IP地址

2、在物理機上測試ping通

3、在虛擬機器器上建立一個資料夾,右鍵選擇屬性-->共用

  • 點選共用(s)...-->點選單項箭頭查詢使用者-->選擇要新增的使用者-->最後點選共用(H)
  • 點選高階共用-->將共用此資料夾(S)打勾-->選擇應用並確定

4、在物理機的此電腦的位址列上輸入\\虛擬機器器的IP地址(如:\\192.168.126.128),即可實現物理機與虛擬機器器檔案共用。

共用與高階共用的區別:當選擇高階共用之後,就可以在物理機輸入IP地址後的最上層資料夾檢視到該高階共用的資料夾;而選擇共用則只有最基礎的Users資料夾。

4、存取控制的原理

檔案目錄存取控制是指使用者和使用者組被賦予一定的許可權,在許可權的規則控制許可下,哪些使用者和使用者組可以存取哪些目錄、子目錄、檔案和其他資源,哪些使用者可以對其中的哪些檔案、目錄、子目錄、裝置等能夠執行何種操作。

許可權物件

1、檔案:讀取,執行,新建,修改,完全控制等等。

2、資料夾:讀取,執行,列出資料夾內容,新建,修改,完全控制等等

3、共事資料夾:讀取,修改,完全控制。

4、印表機,列印,管理檔案,管理印表機。

NTFS安全許可權的基本特性

許可權繼承:對於某一個檔案分配許可權的時候,在預設情況下,此許可權會被完全的傳遞到資料夾中所有的子資料夾的許可權中。如果不希望某一個子資料夾繼承父資料夾許可權,只需要去除繼承核取方塊。

許可權累加:某一個使用者對某一個檔案或資料夾的許可權是該使用者的許可權和所屬組的許可權之和。

拒絕優先:當某一個使用者和組對某一個物件的許可權發生衝突的時候,許可權是拒絕優先。

設定/修改檔案許可權的方法

圖形化介面操作:選擇資料夾-->右鍵屬性-->選擇安全-->進行勾選等操作

命令列操作:以管理員模式開啟cmd-->使用命令cacls(相當於Windows當中的ACL)-->cacls /? --檢視設定檔案許可權用法

5、系統目錄-ProgramData

系統目錄-ProgramData-->作業系統當中應用系統所儲存的資料目錄

  • ProgramData資料夾(是一個隱藏目錄)是Vista引入的一個系統資料夾,從它的名稱可以看出,它儲存了應用程式所需的資料,比如一些自定義的設定,或者快取檔案,都可能會存放在這裡。(這是個隱藏的資料夾)
開啟隱藏目錄過程

開啟計算機-->選擇左上角的組織-->選擇資料夾和搜尋選項-->點選查詢,往下拉找到顯示隱藏的檔案、資料夾和驅動器-->選擇應用、確定即可。

6、系統目錄-Program Files

C: \Program Files資料夾是32位元Windows作業系統安裝應用程式的預設資料夾,進入64位元作業系統時代後,C: \Program Files成為64位元應用程式預設安裝資料夾,而32位元應用程式的預設安裝資料夾則被改為C: \Program Files(x86),這兩個檔案很重要,不可刪除。

X86和X64的區別:
  • X64有向下相容的特性,可以執行X86的應用。

  • X86無法向上相容X64的應用。

7、SAM檔案

  • SAM檔案存放Windows當中使用者資訊

1、SAM檔案是什麼首先說明,SAM這個檔案,是沒有擴充套件名的。

2、安全賬號管理器對賬號的管理是通過安全標識進行的,安全標識在賬號建立時就同時建立,一旦賬號被刪除,安全標識也同時被刪除。

3、安全標識是唯一的,即使是相同的使用者名稱,在每次建立時獲得的安全標識都時完全不同的。因此,—旦某個賬號被刪除,它的安全標識就不再存在了,即使用相同的使用者名稱重建賬號,也會被疵予不同的安全標識,不會保留原來的許可權。

4、SAM檔案是windows的使用者賬戶資料庫,所有使用者的登入名及口令等相關資訊都會儲存在這個檔案中。SAM檔案可以認為類似於unix系統中的passwd檔案,不過沒有unix的passwd檔案那麼直觀,當我們忘記密碼的時候,就可以通過制除(刪除)SAM檔案,快速地進入系統。

找到SAM檔案/相應的程序的過程

開啟windows7的C槽-->C:\Windows\System32\config選擇管理員模式開啟-->可以看到一份被鎖上(無法修改)的大小為256KB的SAM檔案。

在Windows7上右鍵工作列-->選擇工作管理員(K)-->點選程序-->點選顯示所有使用者的程序(S)-->找到winlogon.exe和lsass.exe這兩份檔案。

登入檔當中:計算機->HKEY_LOCAL_MACHINE->SAM->SAM

Windows本地認證的過程
  • 通過winlogon.exe和lsass.exe(SAM檔案)這兩個程序完成。

當我們使用者輸入完使用者名稱和密碼時(就是winlogon.exe這個程序),就會跳轉到lsass.exe這個程序進行驗證,使用者輸入的賬號密碼資訊十是否正確。lsass.exe這個程序就是SAM檔案(換句話說呼叫SAM檔案就是通過lsass.exe這個程序執行)。

  • 正常情況下是無法直接檢視/修改SAM檔案的原因是被lsass.exe這個程序呼叫了。

8、系統檔案-hosts

hosts---本地域名解析檔案

位置:win+r鍵-->輸入drivers-->開啟etc-->hosts (C:\Windows\System32\drivers)

操作規程:開啟之後發現整份檔案都是註釋,相當於什麼都沒有。拉到最下面有一個範例,我們在沒有註釋的地方進行新增127.0.0.1 www.baidu.com(如果是在儲存檔案時提示無法儲存在當前路徑下的話,則右鍵屬性選擇安全,對檔案許可權進行修改)--------在瀏覽器上再次搜尋百度的網址的話則無法連線;現在將剛剛修改過後的刪除,則就可以恢復(這個過程需要重啟瀏覽器,原因是有這個」瀏覽器快取的解析優先順序 > 本地域名解析檔案的解析優先順序 > 網路中的DNS「)

定義

hosts是一個沒有擴充套件名的系統檔案,其基本作用就是將一些常用的網址域名與其對應的IP地址建立一個關聯的「資料庫」。當用戶在瀏覽器中輸入網址時,系統會首先自動從hosts檔案中尋找對應IP地址,如果沒有找到,則會將網址提交DNS域名解析伺服器進行IP地址解析。

作用

1、加快域名解析,構建對映關係,區域網沒有DNS伺服器,通過hosts建立給伺服器建立IP對映。

2、遮蔽垃圾網站,IP對映到本機或、0.0.0.0。

修改hosts方法

位置:C:\Windows\System32\drivers\etc (範例:202.108.22.5 www.baidu.com)
#將本機對www.baidu.com的存取對映到202.108.22.5上

9、登入檔

開啟方法:win+r輸入regedit

定義

登入檔是windows作業系統中的一個核心資料庫,其中存放著各種引數,直接控制著windows的啟動、硬體驅動程式的裝載以及一些windows應用程式的執行,從而在整個系統中起著核心作用。這些作用包括了軟、硬體的相關設定和狀態資訊,比如登入檔中儲存有應用程式和資源管理器外殼的初始條件、偏好設定和解除安裝資料等,聯網計算機的整個系統的設定和各種許可,副檔名與應用程式的關聯,硬體部件的描述、狀態和屬性,效能記錄和其他底層的系統狀態資訊,以及其他資料等。

設定/作用

Start的值設定為0,則驅動由啟動引導器載入,應該與「隨著開機,最先啟動」是同一回事;

Start的值設定為1,則驅動由作業系統的I/0子系統載入,即在系統核心初始化時載入;

Start的值設定為2,則驅動/服務在啟動後自動載入;

Start的值設定為3,則驅動/服務就是按需手動載入;

Start的值設定為4,驅動/服務就是被禁用的狀態。

登入檔五個根鍵及作用:
HKEY_CLASSES_ROOT:用來管理檔案系統
HKEY_CURRENT_USER:僅對當前使用者生效
HKEY_LOCAL_MACHINE:對當前計算機生效
HKEY_USERS:遠端連線
HKEY_CURRENT_CONFIG:儲存系統設定資訊
登入檔-實現指令碼開啟自啟動

暫無

10、指令碼

指令碼:一段指令集

cmd--一次只能執行一條命令

通過指令碼--一次執行多條命令

常見指令碼:.bat(windows建立指令碼字尾) .vbs .php .sh .jsp

指令碼的建立

將寫好的指令碼(.bat)點選右鍵-->選擇WinRAR通過新增到壓縮檔案(A)-->勾選建立自解壓格式壓縮檔案(x)-->點選高階開啟直接壓選項,這裡可以設定解壓的路徑(也可以作為隱藏路徑)-->選擇設定-程式程式-將解壓路徑貼過來再跟上指令碼名稱-->選擇模式-全部隱藏-->點選更新選擇解壓並更新檔案(U)和覆蓋所有檔案(L)-->點選文字和圖示,選擇從檔案載入自解壓檔案圖示(I)-->最後確定即可。

批次處理指令碼

.bat檔案的條件:

①:裡面必須是可執行的指令

②:檔案為可執行檔案

4、Windows使用者和組、域

Windows使用者

1、內建使用者

內建使用者:系統執行必須用到的服務。是預設的、自帶的,且不可刪除。(分類如下)

①Administrator:管理員賬戶(主人)

②Guest:來賓賬戶,許可權非常小,連下載的檔案儲存不了。(客人)

在使用者端上,這兩個賬戶是預設禁用;在伺服器版本上,管理員是預設禁用,guest是預設啟用(可以手動解禁)。

2、系統使用者

計算機服務元件相關的系統賬號:(這個並不是真正賬戶/服務--判斷方法:可否登入)(分類如下)

①system:系統賬戶(許可權非常高)

②local services:本地服務賬戶(許可權等於普通使用者)

③network services:網路服務賬戶(許可權等於普通使用者)

services.msc:開啟的視窗就是服務視窗,每一個服務都需要一個賬戶來管理。

3、建立使用者

法一:圖形化操作

​ 使用lusrmgr.msc命令-->點選使用者,並在空白地方右鍵新建使用者(需設定成強密碼)

法二:命令列操作

​ 以管理員模式開啟CMD(伺服器版本可直接開啟使用)-->如下

c:\windows\system32>net user Lin Aa123789/add		模板:net user 賬戶名密碼/add		//新增賬戶
命令成功完成。
c:\windows\system32>net user Lin / del				模板:net user賬戶名/del		//刪除賬戶
命令成功完成。

為什麼會出現組這個概念:相同許可權的使用者都拉進個組裡面,簡化許可權的賦予。實現多個不同型別的組實現分權,符合計算機的安全策略。

Windows系統為了給不同的使用者賦予不同的許可權,所以就內建了許多本地使用者組,這些使用者組本身都已經被賦予一些許可權(permissions),它們具有管理本地計算機或存取本地資源的許可權。只要使用者賬戶加入到這些本地組內,這回使用者賬戶也將具備該組所擁有的許可權。

預設情況下,系統為使用者分了7個組,並給每個組賦予不同的操作許可權,管理員組(Administrators)、高許可權使用者組(Power Users)、普通使用者組(Users)、備份操作組(Backup Operators)、檔案複製組(Replicator)、來賓使用者組(Guests),身份驗證使用者組(Authenticated users)。其中備份操作組和檔案複製組為維護系統而設定,平時不會被使用。

開啟組進行管理的圖形化介面:輸入命令lusrmgr.msc

1、基本使用者組

(內建普通組)

①Administrators
屬於該administrators本地組內的使用者,都具備系統管理員的許可權,它們擁有對這臺計算機最大的控制許可權【理論上最高許可權是system這個賬戶,但是理論的,實際不可登入;則實際最高階別的賬戶就是Administrator】,可以執行整臺計算機的管理任務。內建的系統管理員賬號Administrator就是本地組的成員,而且無法將它從該組刪除。如果這臺計算機已加入域,則域的Domain Admins會自動地加入到該計算機的Administrators組內。也就是說,域上的系統管理員在這臺計算機上也具備著系統管理員的許可權。

②Backup Operators
在該組內的成員,不論它們是否有權存取這臺計算機中的資料夾或檔案,都可以通過「開始」-「所有程式」-「附件」-「系統工具」-「備份」的途徑,備份與還原這些資料夾與檔案。

③Guests
該組是提供沒有使用者帳戶,但是需要存取本地計算機內資源的使用者使用,該組的成員無法永久地改變其桌面的工作環境。該組最常見的預設成員為使用者帳號Guest。

④Network Configuration Operators
該組內的使用者可以在使用者端執行一般的網路設定任務,例如更改IP地址,但是不可以安裝/刪除驅動程式與服務,也不可以執行與網路伺服器設定有關的任務,例如DNS伺服器、DHCP伺服器的設定。

⑤Power Users
該組內的使用者具備比Users組更多的權利,但是比Administrators組擁有的權利更少一些,例如,可以:建立、刪除、更改本地使用者帳戶;建立、刪除、管理本地計算機內的共用資料夾與共用印表機;自定義系統設定,例如更改計算機時間、關閉計算機等。但是不可以更改Administrators與Backup Operators、無法奪取檔案的所有權、無法備份與還原檔案、無法安裝刪除與刪除裝置驅動程式、無法管理安全與稽核紀錄檔。

⑥Remote Desktop Users
該組的成員可以通過遠端計算機登入,例如,利用終端伺服器從遠端計算機登入。

⑦Users
該組員只擁有一些基本的權利,例如執行應用程式,但是他們不能修改作業系統的設定、不能更改其它使用者的資料、不能關閉伺服器級的計算機。所有新增的本地使用者帳戶者自動屬於該組。如果這臺計算機已經加入域,則域的Domain Users會自動地被加入到該計算機的Users組中。

2、內建特殊組

①Everyone
任何一個使用者都屬於這個組。注意,如果Guest帳號被啟用時,則給Everyone這個組指派許可權時必須小心,因為當一個沒有帳戶的使用者連線計算機時,他被允許自動利用Guest帳戶連線,但是因為Guest也是屬於Everyone組,所以他將具備Everyone所擁有的許可權。

②Authenticated Users
任何一個利用有效的使用者帳戶連線的使用者都屬於這個組。建議在設定許可權時,儘量針對Authenticated Users組進行設定,而不要針對Everyone進行設定。

③Interactive
任何在本地登入的使用者都屬於這個組。

④Network
任何通過網路連線此計算機的使用者都屬於這個組。

⑤Creator Owner
資料夾、檔案或列印檔案等資源的建立者,就是該資源的Creator Owner(建立所有者)。不過,如果建立者是屬於Administrators組內的成員,則其Creator Owner為Administrators組。

⑥Anonymous Logon
任何未利用有效的Windows Server 2003帳戶連線的使用者,都屬於這個組。注意,在windows 2003內,Everone 組內並不包含「Anonymous Logon」組。

3、備註

使用者名稱 LOCAL SERVICE 、 NETWORK SERVICE 、SYSTEM是系統使用者,是系統自帶的而不是病毒或入侵,都是正常的使用者。登入檔中的 BUILTIN 是 built in 的意思,表示內建帳戶,屬正常。

4、組的作用

組的作用是簡化許可權的賦予。

賦許可權的方式:
		使用者-->組-->賦許可權
		使用者-->賦楓限

內網的環境/基礎

1、工作組(work gorup)

在工作組模式的網路中,各伺服器都是獨立的,而且各伺服器中的帳戶和資源也是各自進行管理的。所以,管理員需要為每臺伺服器建立帳戶,在管理時也需要分別登入各伺服器完成管理工作。授權使用者存取不同的伺服器時,也需要分別登入。

2、域(Domain)

在域模式的網路中,伺服器集中進行管理域中的帳戶和資源也是集中管理的。所以,管理員登入到伺服器後就可以管理整個域並可以存取所有共用資源在域模式的網路中,需要一個對帳戶和資源進行統一管理的機制,這個機制就是活動目錄(Active Directory)。域中所有的帳戶和共用資源都需要在活動目錄中進行登記(所以可以在活動目錄當中看共用資源),使用者可以利用活動目錄查詢和使用這些資源。基於域模式的網路可大大減輕管理的複雜度和工作量,通常用於結構較複雜的網路。

3、域與工作組的關係

在工作組上你一切的設定在本機上進行包括各種策略,使用者登入也是登入在本機的,密碼是放在本機的資料庫來驗證的。而如果你的計算機加入域的話,各種策略是域控制器統一設定,使用者名稱和密碼也是放到域控制器去驗證,也就是說你的賬號密碼可以在同一域的任何一臺計算機登入。登陸到域中的時候,身份驗證是採用Kerberos協定在域控制器上進行的,登陸到此計算機則是通過SAM來進行NTLM驗證的。一臺電腦要麼屬於工作組要麼屬於域,兩者對立存在。

4、域控制器

域控制器(Domain Controller,簡寫為DC)

是一臺安裝並執行Active Directory的伺服器,它管理使用者和域互動之間的所有安全相關方面,集中安全性和管理。一個域可以有一個或多個域控制器,各域控制器間地位平等,管理員可以在任一臺域控制器上更新域中的資訊,更新的資訊會自動傳遞到網路中的其他域控制器中。(老大-不止一個)

域控的部署---->實驗當中有(完整)

5、活動目錄

活動目錄AD(Active Directory)

域內所有的計算機共用一個集中式的目錄資料庫(又稱為活動目錄資料庫),它包含著整個域內的物件(使用者賬戶、計算機賬戶、印表機、共用檔案等)和安全資訊等等,而活動目錄負責目錄資料庫的新增,修改,更新和刪除。所以我們要在Windows Server 2003上實現域環境,其實就是要安裝活動目錄。活動目錄為我們實現了目錄服務,提供對企業網路環境的集中式管理。(管理)

6、其他概念(考)

域能實現檔案的共用,集中統一,便於管理。

域是windows網路中獨立執行的基本單位,域之間相互存取則需要建立信任關係,域有安全邊界的作用。

域既是windows網路作業系統的邏輯組織單元,也是Internet的邏輯組織單元,在window作業系統中,域是安全邊界。

域是共用使用者賬號,計算機賬號和安全策略的計算機集合。

7、域/域樹/域林/林根域

(1)域是一種管理單元,也是一個管理邊界在同一個域內共用某些功能和引數;一個域可以有多臺域控制器如domain1.com/A.domain1.com/domain2.com分別代表三個獨立的域。

(2)域樹是指基於在DNS名稱空間,如果一個域是另一個域的子域,那麼這兩個域可以組成一個域樹,例如domain1.com/A.domain1.com組成一個域樹,domain2.com/A.domain2.com組成—個域樹。

(3)域林是指一個或多個不連續DNS名的域(樹)的集合;例如上圖中的domain1.com/domain2.com/domain3.com組成一個域林。

(4)域林中的第一個被建立的域,稱之為林根域。

8、DNS與域的關係

DNS伺服器對域來說不可或缺。域中的計算機使用DNS域名,DNS需費為域中的計算機提供域名解服務。

域中的計算機需要利用DNS提供的SRV記錄來定位域控制器。

9、DNS對AD域的作用

名稱解析:1.DNS將計算機名稱轉換為IP地址2.計算機使用DNS在網路上相互定位

Windows 2000/2003/2008域的名稱:Windows 2000/2003/2008使用DNS命名標準。DNS域和活動自錄的域使用共同的名稱層析結構。

定位活動目錄的物理元件:DNS使用域控制器提供的服務。域中計算機使用DNS來定位域控制器和全域性編錄。

10、AD域與工作組的區別

管理模式:工作組實現的是分散的管理模式,每一臺計算機都是獨自自主的;域實現的是主/從管理模式,通過一臺域控制器集中管理域內使用者帳導和許可權。

資源存取:在「域」模式下,資源的存取有較嚴格的管理,至少有一臺伺服器負責每一臺聯入網路的電腦和使用者的驗證工作。

管理模式:域控制器中包含了由這個域的賬戶、密碼、屬於這個域的計算機等資訊構成的資料庫。工作組只是進行本地電腦的資訊與安全的認證。

11、域的信任關係

由於域控制器的作用,域內的使用者是不能夠跨段進行存取的,如果一定要進行跨段存取,則需要在兩個域之間建立信任關係。域與域之間具有一定的信任關係,域信任關係使得一個域中的使用者可由另一域中的域控制器進行驗證,才能使一個域中的使用者存取另一個域中的資源。

域的信任關係---->信任關係域---->被信任關係域

信任關係域的作用:允許一個域內的使用者能夠存取。

12、組策略

意義:方便管理AD中使用者和計算機的工作環境

1.使用者桌面環境

2.計算機啟動/關機與使用者登入/登出時所執行的指令碼檔案

3.軟體分發

4.安全設定

組策略的作用:組策略不適用於早期的Windows作業系統,如Windows 9x/NT,那時使用的是「系統策略」。組策略是系統策略的更高階擴充套件,它是由Windows 9x/NT的「系統策略」發展而來的,具有更多的管理模板、更靈活的設定物件及更多的功能。

13、域賬號登入成員機的過程

使用域賬號進行登入---->成員機檢查本地沒有這個賬號,如果沒有則成員機向DNS伺服器解析DC的IP---->向DC彙報有人想要進行登入,將賬號密碼傳送給DC---->DC在AD裡面找有沒有這個賬號,有就返回可以登入的指示Access Key,這時候成員機接到Access Key就會讓它登入並且在C:\user裡面為a賬號建立家目錄和組態檔---->登陸成功後成員機會問DC還有什麼要求,DC查詢AD將組策略發給成員機---->成員機按照組策略來載入一些特定要求,例如:強制成員機有特定桌面桌布,不能更改等。

14、域控設定

伺服器:

 1,安裝AD域服務
 2.設定靜態IP地址,並將DNS指向域控
 3.新增域內使用者

使用者端:

 1,設定靜態IP地址,並將DNS指向域控
 2.把使用者加入域

5、Windows埠服務

1、」埠「是英文port的意譯,可以認為是裝置與外界通訊交流的出口。

2、埠可分為虛擬埠和物理埠。

  • 其中虛擬埠指計算機內部或交換機路由器內的埠,不可見。物理埠又稱為介面,是可見埠。

3、如果把IP地址比作一間房子,埠就是出入這間房子的門。真正的房子只有幾個門,但是一個IP地址的埠可以有65536(即:2^16)個。埠是通過埠號來標記的,埠號只有整數,範圍是從0到65535 (2^16-1)。每一個IP地址上都有65536個埠。

埠分類

按埠號可分為3大類

(1)公認埠(Well Known Ports):從0到1023,它們緊密繫結(binding)於一些服務。通常這些埠的通訊明確表明了某種服務的協定。例如:80埠實際上總是HTTP通訊。

(2)註冊埠(動態埠)(Registered Ports):從1024到49151。它們鬆散地繫結於一些服務。也就是說有許多服務繫結於這些埠,這些埠同樣用於許多其它目的。例如:許多系統處理動態埠從1024左右開始。

(3)動態和/或私有埠(Dynamic and/or Private Ports) (一般不會去關注,上面的埠夠用了):從49152到65535。理論上,不應為服務分配這些埠。實際上,機器通常從1024起分配動態埠。但也有例外:SUN的RPC埠從32768開始。

按照協定型別分類

埠被分為TCP埠和UDP埠兩類,雖然他們都用正整數標識,但這並不會引起歧義,比如TCP的80埠和UDP的80埠,因為資料包在標明埠的同時,還將標明埠的型別。

埠詳解

埠其實就是隊,作業系統為各個程序分配了不同的隊,封包按照目的埠被推入相應的隊中,等待被程序取用,在極特殊的情況下,這個隊也是有可能溢位的,不過作業系統允許各程序指定和調整自己的隊的大小。

運輸層為相互通訊的應用程序提供了邏輯通訊。

常見埠服務

1、TCP80埠-HTTP

HTTP協定簡介

HTTP協定的TCP埠預設為80埠

超文字傳輸協定(英文:Hyper Text Transfer Protocol,縮寫:HTTP)是一種用於分散式、共同作業式和超媒體資訊系統的應用層協定。HTTP是全球資訊網的資料通訊的基礎。

HTTP是基於TCP協定之上的。在TCP/IP協定參考模型的各層對應的協定如下文講解,其中HTTP是應用層的協定。

HTTP的發展是由蒂姆·伯納斯-李於1989年在歐洲核子研究組織(CERN)所發起。HTTP的標準制定由全球資訊網協會(World Wide Web Consortium,W3C)和網際網路工程任務組(Internet Engineering Task Force,IETF)進行協調,最終釋出了一系列的RFC,其中最著名的是1999年6月公佈的RFC 2616,定義了HTTP協定中現今廣泛使用的一個版本——HTTP 1.1。

TCP/IP協定參考模型/協定
TCP/IP各層對應的協定:
1.FTP (File Transfer Protocol):檔案傳輸協定
2.HTTP Hyper Text Transfer Protocol):超文字傳輸協定
3.SMTP (Simple Mail Transter Protocol):簡單郵件傳輸協定
4.POP3 (Post Office Ptotocol) :郵局協定
5.DNS (Domain Name System) :域名系統
6.TCP ( Transmission Control Potocol):傳輸控制協定
7.UDP (User Data Potocol) :使用者資料協定
8.IP (Internet Protocol):網路協定絡層
9.ARP (Address Resolution Protocol):地址解析協定
10.ICMP ( InternetControl Message Protocol):因特網控制訊息協定
11.HDLC (High Data Link Control):高階資料鏈路控制
12.SLIP(序列線路IP),PPP:點到點協定
13.放大或再生弱的訊號,在兩個電纜段之間複製每一個位元
1-5為應用層;6-7為傳輸層;8-11為網際網路層;12為資料鏈路層;13為物理層
TCP/IP協定參考模型:
①TCP/IP 4層模型:
應用層
傳輸層
網際網路層
網路介面層

②TCP/IP 5層模型:
應用層
傳輸層
網際網路層
資料鏈路層
物理層

③OSI 7層模型
應用層
表示層
對談層
傳輸層
網路層
資料鏈路層
物理層
URL

URL:HTTP使用統一資源識別符號( Uniform Resource Identifier, URI)來傳輸資料和建立連線。URL是一種特殊型別的URI,包含了用於查詢某個資源的足夠的資訊URL,全稱是Uniform Resource Locator,中文叫統一資源定位符,是網際網路上用來標識某一處資源的地址。

定位:URL-->是特殊型別的URI-->相當於:全球定位系統
記錄:URI-->可以認為只是一個資料庫的索引
①例子:  https://www.huya.com/
https://----代表:資源使用的協定
www.huya.com/----代表:域名  (其中域名與IP地址一一對應---寫IP地址也行)

②例:  http://www.example.org/index.html#date
http://www.example.org/index.html----URL
//www.example.org/index.html----URN
http://www.example.org/index.html#date----URI
HTTP工作原理

不夠安全(無法確認對方的身份)--->只能說連線是可靠的,不能說對方是可靠的。

HTTP請求過程中,使用者端與伺服器之間沒有任何身份確認的過程,資料全部明文傳輸,相當於「裸奔"在網際網路上,所以很容易遭到駭客的攻擊。

一次HTTP操作稱為一個事務,其工作整個過程如下:
1、地址解析
     如用使用者端瀏覽器請求這個頁面:http://localhost.com:8080/index.htm
     從中分解出協定名、主機名、埠、物件路徑等部分,對於我們的這個地址,解析得到的結果如下:
     協定名:http
     主機名:localhost.com
     埠:8080
     物件路徑:/index.htm
     在這一步,需要域名系統DNS解析域名localhost.com,得主機的IP地址。
2、封裝HTTP請求封包
     把以上部分結合本機自己的資訊,封裝成一個HTTP請求封包。
3、封裝成TCP包,建立TCP連線(TCP的三次握手)
     在HTTP工作開始之前,客戶機(Web瀏覽器)首先要通過網路與伺服器建立連線,該連線是通過TCP來完成的,該協定與IP協定共同構建Internet,即著名的TCP/IP協定族,因此Internet又被稱作是TCP/IP網路。HTTP是比TCP更高層次的應用層協定,根據規則,只有低層協定建立之後才能,才能進行更層協定的連線,因此,首先要建立TCP連線,一般TCP連線的埠號是80。這裡是8080埠。
4、客戶機傳送請求命令
     建立連線後,客戶機傳送一個請求給伺服器,請求方式的格式為:統一資源識別符號(URI)、協定版本號,後邊是MIME資訊包括請求修飾符、客戶機資訊和可內容。
5、伺服器響應
     伺服器接到請求後,給予相應的響應資訊,其格式為一個狀態行,包括資訊的協定版本號、一個成功或錯誤的程式碼,後邊是MIME資訊包括伺服器資訊、實體資訊和可能的內容。實體訊息是伺服器向瀏覽器傳送頭資訊後,它會傳送一個空白行來表示頭資訊的傳送到此為結束,接著,它就以Content-Type應答頭資訊所描述的格式傳送使用者所請求的實際資料。
6、伺服器關閉TCP連線
	 一般情況下,一旦Web伺服器向瀏覽器傳送了請求資料,它就要關閉TCP連線,然後如果瀏覽器或者伺服器在其頭資訊加入了這行程式碼Connection:keep-alive。TCP連線在傳送後將仍然保持開啟狀態,於是,瀏覽器可以繼續通過相同的連線傳送請求。保持連線節省了為每個請求建立新連線所需的時間,還節約了網路頻寬。

2、TCP443埠-HTTPS

HTTPS協定簡介

HTTPS協定(Hyper Text Transfer Protocol over Secure Socket Layer,安全通訊端層上的超文字傳輸協定) :可以理解為HTTP+SSL/TLS,即 HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL,用於安全的HTTP資料傳輸。

SSL:(Secure Socket Layer,安全通訊端層),位於可靠的面向連線的網路層協定和應用層協定之間的一種協定層。SSL通過互相認證、使用數位簽章確保完整性、使用加密確保私密性,以實現使用者端和伺服器之間的安全通訊。該協定由兩層組成:SSL記錄協定和SSL握手協定。

TLS:(Transport Layer Security,傳輸層安全協定),用於兩個應用程式之間提供保密性和資料完整性。該協定由兩層組成:TLS記錄協定和TLS握手協定。

HTTP:HTTP ---> TCP ---> IP
HTTPS :SSL or TLS ---> TCP ---> IP
HTTP通訊的問題及解決辦法

問題:

①通訊雙方使用明文,內容可能被竊聽:由於HTTP本身不具備加密的功能,所以也無法做到對通訊整體進行加密。

②不驗證通訊方的身份,因此有可能遭遇偽裝:HTTP協定的實現本身非常簡單,不論是誰傳送過來的請求都會返回響應,因此不確認通訊方,會存在各種隱患。比如目標的Web伺服器有可能是已偽裝的Web伺服器。

③無法證明報文的完整性,所以可能遭篡改。

解決辦法:

HTTPS協定保證安全基本依賴於TLS/SSL協定,TLS/SSL的功能實現主要依賴於三類基本演演算法:雜湊函數 、對稱加密和非對稱加密。

流程:其利用非對稱加密實現身份認證和金鑰協商,對稱加密演演算法採用協商的金鑰對資料加密,基於雜湊函數驗證資訊的完整性。

①解決內容可能被竊聽的問題——加密

②解決報文可能遭篡改問題——數位簽章

③解決通訊方身份可能被偽裝的問題—數位憑證

數位憑證和CA
數位憑證與CA的關係

數位憑證(Digital Certificate)是用來證明公鑰(非對稱金鑰演演算法中用於加密的金鑰)所有者身份的。

1、數位憑證是CA對公鑰簽名:數位憑證則是由證書認證機構(CA)對證書申請者真實身份驗證之後,用CA的根證書對申請人的一些基本資訊以及申請人的公鑰進行簽名(相當於加蓋發證書機構的公章)後形成的一個數位檔案。

2、數位憑證公開的:CA完成簽發證書後,會將證書釋出在CA的證書庫(目錄伺服器)中,任何人都可以查詢和下載,因此數位憑證和公鑰一樣是公開的。實際上,數位憑證就是經過CA認證過的公鑰。

3、如何認證公鑰可靠:我們人人都可以自己生成一個公鑰,但是這個公鑰是否能代表是你的,這個認證的過程需要一個權威機構執行,這個機構就是證書授權中心。證書授權中心(Certificate Authority)負責證書頒發。CA 是行業內信得過的組織機構,它具有權威性,由它頒發的證書大家都相信是可靠的。

一般我們自己也生成HTTPS證書,但是自己生成的HTTPS證書卻是不能用的。因為瀏覽器只會承認受信任CA所簽發出來的證書,其他個人自籤的HTTPS證書瀏覽器是不會承認的,一律會顯示「此網站不安全」的安全提示。所以不要嘗試自己去生成HTTPS證書,需要HTTPS證書我們就去找受信任的CA機構進行申請。

CA認證流程(SSL雙向認證步驟)

1、伺服器端申請證書:HTTPS通訊雙方的伺服器端向CA機構申請證書,CA機構是可信的第三方機構,它可以是一個公認的權威的企業,也可以是企業自身。企業內部系統一般都使用企業自身的認證系統。CA機構下發根證書、伺服器端證書及私鑰給申請者;

2、HTTPS通訊雙方的使用者端向CA機構申請證書,CA機構下發根證書、使用者端證書及私鑰個申請者;

3、使用者端向伺服器端發起請求,伺服器端下發伺服器端證書給使用者端。使用者端接收到證書後,通過私鑰解密證書,並利用伺服器端證書中的公鑰認證證書資訊比較證書裡的訊息,例如域名和公鑰與伺服器剛剛傳送的相關訊息是否一致,如果一致,則使用者端認為這個伺服器的合法身份;

4、使用者端傳送使用者端證書給伺服器端,伺服器端接收到證書後,通過私鑰解密證書,獲得使用者端的證書公鑰,並用該公鑰認證證書資訊,確認使用者端是否合法;

5、使用者端通過隨機祕鑰加密資訊,並行送加密後的資訊給伺服器端。伺服器端和使用者端協商好加密方案後,使用者端會產生一個隨機的祕鑰,使用者端通過協商好的加密方案,加密該隨機祕鑰,並行送該隨機祕鑰到伺服器端。伺服器端接收這個祕鑰後,雙方通訊的所有內容都都通過該隨機祕鑰加密;

圖片解讀:(空)

【prepare.1:生成公私鑰S.pub,S.pri。S.pri自己儲存,S.pub傳送給CA】

【prepare.2:CA生成公私鑰C.pub.C.pri使用C.pri對伺服器發的S.pub簽名生成CA證書】

【prepare.3:CA將生成的CA證書交給伺服器】

【prepare.4:瀏覽器(使用者端)內建CA根證書CA公鑰C.pub】

1.發起連結(TCP三次握手)

2.將CA證書返回給使用者端,證書包含S.pub,頒發機構,有效期等(sayHello---helloDone)

3.使用者端,通過瀏覽器內建根證書的C.pub驗證CA證書的合法性

4.生成陸機對稱金鑰

5.將使用者端生成的對稱金鑰,通過S.pub加密發給伺服器

6.雙方通過使用者端生成的隨機金鑰進行http通訊

注:伺服器罐並沒有驗證使用者端的合法性。因為不必要只有類似銀行U盾之類才有必要驗證

加密演演算法
對稱加密

有流式、分組兩種,加密和解密都是使用的同一個金鑰。例如:DES、AES-GCM、ChaCha20-Poly1305等。

這種方式加密和解密同用一個金鑰。加密和解密都會用到金鑰。沒有金鑰就無法對密碼解密,反過來說,任何人只要持有金鑰就能解密了。以對稱加密方式加密時必須將金鑰也發給對方。

這種方式的缺點:可究竟怎樣才能安全地轉交?在網際網路上轉發金鑰時,如果通訊被監聽那麼金鑰就可會落人攻擊者之手,同時也就失去了加密的意義。另外還得設法安全地保管接收到的金鑰。

非對稱加密

加密使用的金鑰和解密使用的金鑰是不相同的,分別稱為:公鑰、私鑰,公鑰的演演算法都是公開的,私鑰是保密的。非對稱加密演演算法效能較低,但是安全性超強,由於其加密特性,非對稱加密演演算法能加密的資料長度也是有限的。例如:RSA、DSA、ECDSA、DH、ECDHE。 (公鑰加密,私鑰解密)(SSH協定採用這個方式)

非對稱加密使用一對金鑰:一把叫做私鑰,另一把叫做公鑰。顧名思義,私鑰不能讓其他任何人知道,而公鑰則可以隨意釋出,任何人都可以獲得。使用非對稱加密方式,傳送密文的一方使用對方的公鑰進行加密處理,對方收到被加密的資訊後,再使用自己的私鑰進行解密。利用這種方式,不需要傳送用來解密的私鑰,也不必擔心金鑰被攻擊者竊聽而盜走。非對稱加密的特點是資訊傳輸一對多,伺服器只需要維持一個私鑰就能夠和多個使用者端進行加密通訊。

這種方式有以下缺點:①公鑰是公開的,所以針對私鑰加密的資訊,駭客截獲後可以使用公鑰進行解密,獲取其中的內容。②公鑰並不包含伺服器的資訊,使用非對稱加密演演算法無法確保伺服器身份的合法性,存在中間人攻擊的風險,伺服器傳送給使用者端的公鑰可能在傳送過程中被中間人截獲並篡改。③使用非對稱加密在資料加密解密過程需要消耗一定時間,降低了資料傳輸效率。

雜湊演演算法(雜湊函數)

將任意長度的資訊轉換為較短的固定長度的值,通常其長度要比資訊小得多,且早期認為演演算法不可逆。例如:MD5、SHA-1、SHA-2等。Hash演演算法的碰撞稱為撞庫。

Hash值又稱為指紋或者摘要,具有以下特點:①正向快速:給定明文和Hash演演算法,在有限時間和有限資源內能計算得到Hash值。②逆向困難:給定Hash值,在有限時間內很難逆推出明文。③輸入敏感:原始輸入資訊發生任何變化,新的Hash值都應該出現很大變化。④衝突避免:很難找到兩段內容不同的明文,使得它們的Hash值一致。

對稱加密+非對稱加密

(HTTPS採用這種方式)

用對稱金鑰的好處是解密的效率比較快,使用非對稱金鑰的好處是可以使得傳輸的內容不能被破解,因為就算你攔截到了資料,但是沒有對應的私鑰,也是不能破解內容的。就比如說你搶到了一個保險櫃,但是沒有保險櫃的鑰匙也不能開啟保險櫃。那我們就將對稱加密與非對稱加密結合起來,充分利用兩者各自的優勢,在交換金鑰環節使用非對稱加密方式,之後的建立通訊交換報文階段則使用對稱加密方式。具體做法是:傳送密文的一方使用對方的公鑰進行加密處理「對稱的金鑰」,然後對方用自己的私鑰解密拿到「對稱的金鑰」,這樣可以確保交換的金鑰是安全的前提下,使用對稱加密方式進行通訊。所以,HTTPS採用對稱加密和非對稱加密兩者並用的混合加密機制。

HTTPS工作原理

1、使用者端發起HTTPS請求

2、伺服器端設定

3、傳送證書

4、使用者端解析證書

5、傳送加密資訊

6、伺服器端解密資訊

7、傳輸加密後的資訊

8、使用者端解密資訊

HTTPS工作流程(重點)

1、瀏覽器發起一個HTTPS(例如https://www.baidu.com/)的請求。

2、伺服器端把事先設定好的公鑰證書返回給使用者端。

3、瀏覽器驗證公鑰證書:比如是否在有效期內,證書的用途是不是匹配使用者端請求的站點,如果驗證通過則繼續,不通過則顯示警告資訊。

4、瀏覽器使用偽亂數生成器生成加密所使用的對稱金鑰,然後用證書的公鑰加密這個對稱金鑰,發給伺服器。

5、伺服器使用自己的私鑰解密這個訊息,得到對稱金鑰。至此,Client和Server雙方都持有了相同的對稱金鑰。

6、伺服器使用對稱金鑰對瀏覽器第一次請求URL對應的響應進行加密,傳送給瀏覽器。

7、此後瀏覽器和伺服器都使用這個對稱金鑰進行通訊。

HTTP和HTTPS的區別

連線/埠號:HTTP和HTTPS使用的是完全不停的連線方式,埠也不一樣,前者是80,後者是443。

協定:HTTP是超文字傳輸協定,資訊明文傳輸;HTTPS是具有安全性的SSL/TLS加密傳輸協定。

HTTPS-CA:HTTPS需要申請CA證書。

安全:HTTP的連線很簡單,是無狀態的;HTTPS協定是由SSL+HTTP協定構建,可進行加密傳輸、身份認證的網路協定,比HTTP協定安全。

https通訊的優點

1)使用者端產生的金鑰只有使用者端和伺服器端能得到。

2)加密的資料只有使用者端和伺服器端才能得到明文。

3)使用者端到伺服器端的通訊是安全的。

3、UDP53埠-DNS

簡述

DNS簡介:DNS叫做域名系統(Domain Name System),這是網際網路的一項服務,DNS就是為了方便使用者記憶,存取伺服器,不用記憶冗餘、複雜的IP地址。說白了,存取域名就是存取IP地址。

域名,從右往左數,右邊是左邊的父域名,越往左的範圍越小。

域名等級圖略。

頂級域名:.com

DNS有兩個檢索方式:迭代查詢、遞迴查詢。

解析過程

1、使用者端在瀏覽器輸入網址後,對於這個域名,首先檢視瀏覽器的快取,若沒有記錄,檢視原生的hosts檔案,去本地DNS伺服器;這個過程屬於遞迴查詢。原生的hosts檔案路徑:file:///C:/Windows/System32/drivers/etc/hosts

2、本地DNS伺服器拿到這個域名後,先去找13臺根伺服器,然後就存在兩種方式:迭代查詢、遞迴查詢。

DNS遞迴解析流程

1)、使用者端向本機設定的本地名稱伺服器(在此僅以首選DNS伺服器為例進行介紹,所設定其它備用DNS伺服器的解析流程完全一樣)發出DNS域名查詢請求。

2)、本地名稱伺服器收到請求後,先查詢原生的快取,如果有該域名的記錄項,則本地名稱伺服器就直接把查詢的結果返回給使用者端;如果本地快取中沒有該域名的記錄,則本地名稱伺服器再以DNS使用者端的角色傳送與前面一樣的DNS域名查詢請求發給根名稱伺服器

3)、根名稱伺服器收到DNS請求後,把所查詢得到的所請求的DNS域名中頂級域名所對應的頂級名稱伺服器地址返回給本地名稱伺服器。

4)、本地名稱伺服器根據根名稱伺服器所返回的頂級名稱伺服器地址,向對應的頂級名稱伺服器傳送與前面一樣的DNS域名查詢請求。

5)、對應的頂級名稱伺服器在收到DNS查詢請求後,也是先查詢自己的快取,如果有所請求的DNS域名的記錄項,則相接把對應的記錄項返回給本地名稱伺服器,然後再由本地名稱伺服器返回給DNS使用者端,否則向本地名稱伺服器返回所請求的DNS域名中的二級域名所對應的二級名稱伺服器地址。然後本地名稱伺服器繼續按照前面介紹的方法一次次地向三級、四級名稱伺服器查詢,直到最終的對應域名所在區域的權威名稱伺服器返回到最終的記錄給本地名稱伺服器。然後再由本地名稱伺服器返回給DNS客戶,同時本地名稱伺服器會快取本次查詢得到的記錄項。

遞迴查詢和迭代查詢的區別

①DNS使用者端和本地名稱伺服器是遞迴,而本地名稱伺服器和其他名稱伺服器之間是迭代。

②DNS遞迴名稱解析:在DNS遞迴名稱解析中,當所設定的本地名稱伺服器解析不了時,後面的查詢工作是由本地名稱伺服器替代DNS使用者端進行的(以本地名稱伺服器為中心),只需要本地名稱伺服器向DNS使用者端返回最終的查詢結果即可。

③DNS迭代名稱解析:(或者叫迭代查詢)的所有查詢工作全部是DNS使用者端自己進行(以DNS使用者端自己為中心)。在條件之一滿足時就會採用迭代名稱解析方式:

  • 在查詢本地名稱伺服器時,如果使用者端的請求報文中沒有申請使用遞迴查詢,即在DNS請求報頭部的RD欄位沒有置1。相當於說」你都沒有主動要求我為你進行遞迴查詢,我當然不會為你工作了」。
  • 使用者端在DNS請求報文中申請使用的是遞迴查詢(也就是RD欄位置1了),但在所設定的本地名稱伺服器上是禁用遞迴查詢(DNS伺服器一般預設支援遞迴查詢的),即在應答DNS報文頭部的RA欄位置0。

遞迴與迭代圖

DNS的兩個問題
DNS汙染

網域伺服器快取汙染(DNS cache pollution)(快取出錯-不是人為),又稱域名伺服器快取投毒(DNS cache poisoning),是指一些刻意製造或無意中製造出來的域名伺服器封包,把域名指往不正確的IP地址。一般來說,在網際網路上都有可信賴的網域伺服器,但為減低網路上的流量壓力,一般的域名伺服器都會把從上游的域名伺服器獲得的解析記錄暫存起來,待下次有其他機器要求解析域名時,可以立即提供服務。一旦有關網域的局域域名伺服器的快取受到汙染,就會把網域內的計算機導引往錯誤的伺服器或伺服器的網址。

DNS劫持

域名劫持(DNS劫持)(人為)是網際網路攻擊的一種方式,通過攻擊域名解析伺服器(DNS),或偽造域名解析伺服器(DNS)的方法,把目標網站域名解析到錯誤的IP地址從而實現使用者無法存取目標網站的目的或者蓄意或惡意要求使用者存取指定IP地址(網站)的目的。

4、UDP67埠,UDP68埠-DHCP

DHCP (Dynamic Host Configuration Protocol,動態主機設定協定)通常被應用在大型的區域網路環境中,主要作用是集中的管理、分配IP地址,使網路環境中的主機動態的獲得P地址、Gateway地址、DNS伺服器地址等資訊,並能夠提升地址的使用率。

DHCP用的端號是UDP67和UDP68,這兩個埠是正常的DHCP伺服器埠,可以理解為一個傳送,一專個接收。使用者端屬向68埠(bootps)廣播請求設定,伺服器向67埠(bootpc)廣播迴應請求。

DHCP互動過程

1、發現階段:DHCP客戶機尋找DHCP伺服器的階段。

2、提供階段:DHCP伺服器提供IP地址的階段。

3、請求選擇階段:DHCP客戶機廣播DHCP請求資訊,選擇某臺DHCP所提供的IP地址。

4、確認階段:DHCP伺服器確認所提供的IP地址的階段。

5、*重新登陸

6、*更新租約

5、TCP3389埠-RDP

RDP,Remote Desktop Protocol,遠端桌面協定,是一個多通道( mutil-channel)的協定,讓使用者(使用者端或稱「本地電腦")連上提供微軟終端機服務的電腦(伺服器端或稱「遠端電腦")。大部分的Windows、Linux、FreeBSD、Mac OS X都有相應的使用者端。伺服器端聽取送到TCP3389埠的資料。

重點!!遠端埠3389----是高危埠

GUI

圖形化使用者介面(Graphical User Interface,簡稱 GUI,又稱圖形使用者介面)是指採用圖形方式顯示的計算機操作使用者介面。(桌面)

修改RDP預設埠

方法一:直接開啟遠端桌面服務(選用預設埠時)

方法二:登入檔當中埠號修改+關閉防火牆策略實現遠端桌面服務

方法三:登入檔當中埠號修改+新增防火牆策略實現遠端桌面服務

(詳解見:實驗部分)

6、域環境策略設定、遠端登入、使用者實驗

1、域環境策略設定

1、域環境搭建

第一步:域控的搭建(將伺服器升級為域控時,管理員自動升級為域管理員)。

​ ①伺服器IP地址的設定(靜態設定IP),並使DNS指向自己:IP:192.168.10.10,子網掩碼:255.255.255.0,閘道器:192.168.10.254,首選DNS:192.168.10.10。

​ ②新增角色:開啟」服務管理器「-->選擇」角色「-->選擇」新增角色「-->選擇伺服器角色為「Active Directory域服務」-->隨後按照新增角色的嚮導進行操作。

​ ③按照嚮導升級為域控:安裝好域服務後點選''Active Directory域服務「-->點選」執行Active Directory 域發安裝嚮導(dcprono.exe)「-->不用選擇高階模式,直接點選安裝-->選擇」在林中新建域「-->目錄林根域名設為」mao.com「-->一直選擇下一步-->設定密碼為xzm@021968-->繼續下一步並選擇完成後重啟(重啟後發現當前計算機已經成功成為域伺服器)。

​ ④新增組織單位和賬戶:點選」開始「-->點選」管理工具「-->點選」Active Directory 使用者和計算機「-->右鍵mao.com,選擇新建組織單位,取名為mao-->「此檢視中沒有可顯示的專案。」中右鍵新建-建立兩個使用者(dada、xiao)(設定好密碼;並選擇使用者不能更改密碼、密碼永不過期),一個加入組;一個不加入組-->在剛才的檢視當中右擊建立一個組,名為123-->將使用者dada拉進123這個組當中-->可以選擇檢視隸屬單位(右鍵屬性)。

2、加入域

第二步:域使用者(windows 7)加入域。

​ ①Windows 7設定靜態IP並修改原生的DNS使之指向域控:IP:192.168.10.20,子網掩碼:255.255.255.0,閘道器:192.168.10.254,首選DNS伺服器:192.168.10.10。

​ ②加入域:右鍵計算機選擇「管理」-->點選」更改設定「-->點選」更改「-->選擇隸屬於」mao.com「-->輸入賬戶名和密碼:dada、xzm@021968(這裡的計算機使用者是在域中新建的使用者(dada、xiao))。

​ ③設定使用者互動式登入:開啟」本地安全策略「-->選擇「安全設定」-->選擇」本地策略「-->選擇」安全選項「-->找到」互動式登入:不顯示最後的使用者名稱「,選擇啟用。

​ ④設定完成後點選」隨後關閉應用點選重啟「-->關閉相關程式視窗(程式自動進入重啟狀態)-->重啟完成後選擇切換使用者登入(賬戶名和密碼為dada、xzm@021968)-->此時Windows 7的dada這個使用者已經成功加入域當中(其實xiao也加入了域當中)。

3、建立共用資料夾

第三步:建立共用資料夾。在伺服器上開啟共用資料夾,通過網路路徑進行組策略的設定,效果更好。

​ 在伺服器上建立一個資料夾,「名為11」-->將一張圖片名為「1.jpg」的圖片放入該資料夾下-->右鍵該資料夾選擇」屬性「-->①選擇「共用」-->新增使用者(這裡需要查詢),選擇名稱為Domain Users-->點選確認-->②選擇」高階共用「-->勾選」共用此資料夾「-->在許可權當中新增物件名稱為Domain Users-->點選確認-->最後在使用者端上的此電腦當中使用網路地址搜尋【\\192.168.10.10】,也就可以看見共用資料夾11當中的一張圖片。

4、組策略設定

第四步:對使用者登入到域環境上所需要進行的基本操作。(使用者無法修改)

​ 在」開始「當中搜尋」組策略管理「-->點選」組策略管理「-->點選」林:mao.com「-->點選」域「-->點選」mao.com「-->點選」mao「-->在mao中右鍵選擇在整個域中建立GPO-->在新建GPO當中命名為:111-->有右擊建立好的GPO111,並右鍵選擇編輯-->點選 」使用者設定「-->點選」策略「-->點選」管理模板「-->①點選」桌面「當中進行第一個策略設定-->點選」從桌面刪除回收站「-->點選」已啟用「並應用、確定-->②點選"Active Desktop"-->點選」桌面牆紙「-->點選已啟用並將牆紙名稱設為「\\192.168.10.10\11\1.jpg」-->選擇「應用」並確定。

5、使用者端策略測試

第五步:使用者端測試。

在使用者端上測試(將整個Windows 7使用者端關閉,再重新開機,如果桌面出現黑色的話可以選擇重啟使用者端,或者更新下組策略,或者重新載入桌面程序)-->可以發現兩個使用者的組策略均生效。

2、遠端登入

(物理機遠端上虛擬機器器192.168.126.128)

方法一:直接開啟遠端桌面服務。

​ ①實現兩者的通訊(ping通測試)

​ ②在虛擬機器器上開啟遠端操作:右鍵「計算機」,選擇「屬性」-->選擇「遠端設定」-->選擇「遠端」-->選擇「允許執行任意版本遠端桌面的計算機連線(較不安全)」-->點選「應用」並確定。

​ ③連線:在物理機上按「win+R」輸入「mstsc」-->輸入計算機:192.168.126.128:3389(預設的遠端埠為3389,如果沒有對埠進行改動的話可以預設不帶埠號)-->輸入虛擬機器器的登入密碼056435(登入密碼一定要設定,否則登入不上)-->點選"是"-->物理機上遠端登入虛擬機器器成功。

方法二:登入檔修改+防火牆策略實現遠端桌面服務。

​ ①實現兩者的通訊(ping通測試)

​ ②win+R,輸入regedit開啟登入檔-->查詢路徑:【HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TerminalServer\WinStations\RDP-Tcp】-->下拉找到PortNumber右鍵選擇「修改」-->選擇「修改十進位制「數值為這個【1024到49151】區間內的。原來是3389這裡改為9999,並確定。

​ ③關閉防火牆:點選」控制面板「(然後關閉Windows7上的防火牆策略)-->選擇」系統和安全「-->選擇」Windows防火牆「-->選擇」更改通知設定「-->關閉」Windows防火牆「(家庭或工作、公網網路)-->這時,重啟Windows7虛擬機器器,讓防火牆策略生效。

​ ④連線:在物理機上按「win+R」輸入「mstsc」-->輸入計算機:192.168.126.128:9999-->輸入虛擬機器器的登入密碼056435(登入密碼一定要設定,否則登入不上)-->點選"是"-->物理機上遠端登入虛擬機器器成功。

3、使用者實驗

缺陷:該實驗操作必須是要使用管理員許可權才可以操作。

目的:學會越權

Windows當中檢視使用者的四種方法

①DOS介面

win+r 輸入CMD(管理員許可權也行)--->輸入net user檢視使用者

②GUI介面

開啟開始選單欄--->點選使用者圖示,可以看到使用者的GUI介面--->點選「管理其他賬戶」。

(如果裡面有」標準使用者「,那麼就是自己建立的使用者,在windows當中標準使用者就是普通的user組成員。)
(自己建立的使用者自動會加入本地管理員組,就是個管理員,就可以檢視其他使用者。)

缺點:容易被人隱藏,而導致失效。

③本地使用者和組

輸入lusrmgr.msc開啟本地使用者和組--->點選使用者即可通過GUI介面視覺化的查詢

缺點:如果在其中的某個步驟被人遮蔽了,那麼這個方法就會失效。

④登入檔----這是最徹底的方式

輸入regedit開啟登入檔--->點選這個HKEY_LOCAL_MACHINE--->點選SAM檔案下的SAM檔案--->然後右鍵將Administrators這個組賦予許可權並應用--->查詢路徑為:「計算機->HKEY_LOCAL_MACHINE->SAM->SAM->Domains->Account->Users->Names」。其中Users放的是各賬戶所對應的密碼(身份令牌);Names存放的是各賬戶名。(需要檢視Name所對應的型別值,因為有可能並不是一一對應的)

SAM檔案在Windows當中屬於身份認證的檔案,檔案路徑為C:\Windows\System32\config

開啟互動式登入

過程:搜尋」本地安全策略「或者輸入secpol.msc進入本地安全策略--->點選本地策略--->安全選項--->找到」互動式登入:不顯示最後的使用者名稱「,並將其啟用。

用處:增加Windows的安全性。此後所有登入該電腦時就不單單只是輸入密碼了,還需要輸入賬戶和密碼兩者資訊。

實驗一:隱藏使用者

做隱藏使用者的目的:騙過系統(DOS介面)

命令:net user h$ 123 /add (在DOS介面輸入該命令),其中加$符只能騙過CMD,但在其他地方(如:登入檔、本地使用者和組、GUI介面)還都可以查得到。

缺點:只能隱藏DOS介面查詢,其餘介面均能被查得到。沒什麼用,而且建立的賬戶許可權很低。

實驗二:假死使用者

首先現在登入檔當中找到需要假死的使用者,右鍵匯出賬戶和身份令牌放在桌面上--->通過管理員許可權的DOS介面刪除該賬戶和身份令牌。(此時該賬戶在本機的所有資訊均刪除,僅一處儲存至桌面)--->現在在雙擊在桌面的賬戶資訊和身份令牌,系統則會自動的將裡面對應的內容新增的登入檔所對應的地方上--->此時現在就只有登入檔一處可查該賬戶資訊,其餘地方不可查--->切換賬戶登入即可。

使用互動式模式登入,輸入賬號/密碼為h\(/123,頁面顯示」正在準備桌面「。說明系統認可了`h\)`這個使用者,我們假死替身的使用者被系統認可了,還給我們建立了相應的系統程序空間讓我們進入了計算機。但是在進入系統之後許可權非常低,無法用管理員模式開啟CMD。

目的:賬戶的資訊僅在登入檔可查,在DOS介面、本地使用者和組、GUI介面查不到。

缺點:但建立的賬戶許可權很低。且稍微懂點作業系統的人都會查得到。

實驗三:影子使用者/克隆管理員使用者

先建立賬戶名為jj,密碼為123的賬戶--->在登入檔當中將這兩個身份資訊匯出到桌面,並且再匯出管理員的身份令牌--->將管理員的身份令牌當中的」F「值複製進jj的身份令牌「F「值上--->再DOS當中輸入net user jj active:yes將管理員賬戶解禁,這裡相當於將管理員身份活躍起來(由於我們將管理員的」F」值替換進jj的SID當中,所以此時jj就是管理員身份),記得在本地使用者和組當中重新整理一下--->然後再將賬戶為jj的兩個身份資訊雙擊匯入到登入檔當中--->最後切換jj這個使用者匯入即可。

重點:盜取別人的身份令牌(SID),SID是系統用來識別賬戶(許可權)。

思路:盜取別人的身份令牌來用,使普通使用者成為管理員的過程。賬號克隆就是複製管理員的登入檔資訊到需要的賬戶上。

  • 快速找到影子使用者的辦法:從登入檔當中查詢。如果登入檔中SAM檔案當中沒有,則系統是不認可這個賬戶的。

  • 偷盜別人身份,並不是真正的共存。克隆使用者時兩個賬戶可以同時查詢;影子使用者只能說管理員和使用者存在一個,不能共存。

7、Windows應急響應

一、概述

近年來,隨著網際網路的發展網路安全攻擊事件也是大幅度增多,如何在第一時間發現攻擊事件,並實施應急處置,能夠有效的將損失降到最低。在實施應急響應的過程中,需要從多方面進行聯動工作,具體的流程和依據可以參考《GB∕T 38645-2020 資訊保安技術 網路安全事件應急演練指南》,本篇主要以Windows7下應急響應的基礎技術手段進行介紹。

當企業發生駭客入侵、系統崩潰或其他影響業務正常執行的安全事件時,急需第一時間進行處理,使企業的網路資訊系統在最短時間內恢復正常工作,①進一步查詢入侵來源(人為、非人為),②還原入侵事故過程(通過紀錄檔來還原)(紀錄檔相當於系統監控攝像頭,但需要一定的能力才能看懂),③同時給出解決方案(解決掉)與防範措施(安全加固),為企業挽回或減少經濟損失。

  • 通過排查事件是否為應急響應事件,如果是的話則說明可能出現安全問題。

常見應急響應事件分類:

web入侵(web滲透):網頁掛馬、主頁篡改、Webshell (通過瀏覽器登入(入口網站--對外開發的網站),入侵到內網)

系統入侵(內網滲透;當你入侵進內網環境時可以做些什麼):病毒木馬、勒索軟體、遠控後門 (在內網內部搞破壞 )

網路攻擊(可以通過大量肉雞進行攻擊):DDOS攻擊、DNS劫持、ARP欺騙 (不做技術要求,通過瘋狂發包、瘋狂發業務來來將你的記憶體快取打滿,導致系統宕機。 )

應急響應流程:檢查系統賬號安全---->檢查異常埠、程序---->檢查啟動項、計劃任務、服務---->檢查系統相關資訊---->自動化查殺---->紀錄檔分析(各種系統都通用這個流程)

二、技術分析

1、準備工作

在正式實施應急響應之前,需要先進行以下工作:

第一、資訊收集,先對安全事件進行詳細的瞭解,包括系統、服務以及業務型別。

第二、思路梳理,通過以上資訊收集初步梳理自己的分析思路。

第三、工具準備,提前準備好需要用到的工具指令碼等資料。

第四、資料備份,所有涉及到分析以及證據的材料都需要提前進行備份,這樣也方便之後還有分析人員或者防止資料被篡改或者覆蓋。

第五、時間校準,檢視系統時間和北京時間是否同步準確,如果不準確那麼系統紀錄檔等資訊的事件可能會存在誤差,所以必須提前校準時間。

2、賬號分析

檢視系統所有的賬戶,是否存在惡意新增賬戶,進行遠端控制等問題,具體方式如下:

1)檢視伺服器是否由弱口令組成【弱口令檢測工具——John the Ripper】,遠端管理埠是否對公網開放【檢查遠端主機埠是否開啟】。據實際情況諮詢相關伺服器管理員。

2)cmd命令列輸入net user檢視使用者賬戶,該方法有一個弊端就是無法檢視系統建立的隱藏賬戶。

3)計算機管理->系統工具->本地使用者和組->使用者(或者lusrmgr.msc),可以檢視系統現有賬戶,其中賬戶後面帶$的則為隱藏賬戶。

4)控制面板->使用者賬戶和家庭安全->使用者賬戶->管理其他賬戶,也可以檢視所有系統賬戶。

5)Win+R輸入regedit.exe進入登入檔編輯器,在下面登入檔HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names中也可以檢視系統現有賬戶(或者D盾查殺)。

6) 在cmd命令列中利用net user administrator可以檢視administrator該賬戶的詳細資訊。

7)在cmd命令列中利用query user可以檢視目前登入的賬戶。

3、最近開啟過的檔案分析

1)鍵盤輸入win+R開啟執行視窗輸入recent,直接開啟C:\Administrtor\Recent(win10),可以檢視最近開啟過的所有檔案。

2)設定最新使用的專案檢視最近開啟的檔案。開始選單右鍵->屬性->開始選單(自定義)->勾選最近使用的專案。

3)鍵盤輸入win+e,點選組織->資料夾和搜尋選項->將導航視窗全選上。

4)回收站檢視最近刪除檔案。回收站中可能會存在一些攻擊者刪除的最近開啟編輯後的檔案資料等痕跡,可以選擇還原所以專案,也是需要注意的。

4、紀錄檔分析

紀錄檔分析包括作業系統的紀錄檔記錄以及web應用的紀錄檔記錄,一般來說作業系統的紀錄檔主要記錄針對該系統的操作行為事件,但是web應用紀錄檔則會記錄web程式存取該應用程式的時候的操作行為和事件,一般針對紀錄檔分析時候也是需要從作業系統和web應用紀錄檔兩塊結合分析。

1)作業系統紀錄檔

1)執行鍵入eventvwr.msc,開啟事件檢視器。匯出應用程式紀錄檔、安全紀錄檔、系統紀錄檔,利用Log Parser進行分析。

前提:開啟稽核策略,若日後系統出現故障、安全事故則可以檢視系統的紀錄檔檔案,排除故障,追查入侵者的資訊等。

作業系統紀錄檔存放著計算機關於系統、應用程式的告警資訊以及安全紀錄檔等資訊,一般存放C:\Windows\System32\winevt\Logs,可以通過事件檢視器進行檢視。

系統紀錄檔中存放了Windows作業系統產生的資訊、警告或錯誤。通過檢視這些資訊、警告或錯誤,使用者不但可以瞭解到某項功能設定或執行成功的資訊,還可瞭解到系統的某些功能執行失敗,或變得不穩定的原因。開啟事件檢視器->Windows紀錄檔->系統。

應用程式紀錄檔中存放應用程式產生的資訊、警告或錯誤。通過檢視這些資訊、警告或錯誤,使用者可以瞭解到哪些應用程式成功執行,產生了哪些錯誤或者潛在錯誤。程式開發人員可以利用這些資源來改善應用程式。開啟事件檢視器->Windows紀錄檔->應用程式。

安全紀錄檔(重點)中存放了稽核事件是否成功的資訊。通過檢視這些資訊,使用者可以瞭解到這些安全稽核結果為成功還是失敗。同時安全紀錄檔會存放攻擊者遠端登陸後或者通過提權等方法拿到許可權後的一些操作行為,更有助於定位攻擊者對作業系統的攻擊行為。開啟事件檢視器(eventvwr.msc)->Windows紀錄檔->安全【匯出windows紀錄檔-安全,利用Log Parser進行分析】。(一般在作業系統紀錄檔分析過程中更關注安全紀錄檔的分析)

Windows事件紀錄檔通過不同的EVENT ID代表了不同的意義,針對常用的**安全事件**的事件ID還是需要熟練掌握。 其中:
4624:代表成功的登入;
4625:代表失敗的嘗試;
4672:代表授予特殊許可權;
4720:代表新增使用者;
4726:代表刪除使用者;
4634:代表成功的登出;
4672:代表超級使用者登入。
因此想要檢視賬戶登入事件,篩選紀錄檔中事件ID填入4624則可以篩選登入成功事件,4625則可以篩選登入失敗事件。

當有人使用mstsc遠端登入某個主機時,使用的帳戶是管理員帳戶的話,成功的情況下會有事件ID為4776、4648、4624、4672的事件產生。

安全紀錄檔中除了會記錄改事件的成功失敗以外還會記錄該事件的IP地址和埠,因此如果發現某個遠端登陸時,通過檢視詳細資訊便可以分析出遠端登陸的IP地址和他機器的埠。

2)Web應用紀錄檔

1)找到中介軟體的web紀錄檔,打包到本地方便進行分析。

推薦工具:Windows下,推薦使用EmEditor進行紀錄檔分析,支援大文字,搜尋效率還不錯。Linux下,使用Shell命令組合檢視分析。

5、程序、網路連線分析

一般檢查程序和網路連線是同步進行的,相互結合著進行分析是否有異常程式進行遠端連線。

1)網路連線

windows中的網路連線可以通過netstat命令進行定位,檢視正則監聽以及連線的網路連線。netstat結合findstr可以檢視不同埠的網路連線資訊。如:c:\Windows\system32>netstat -ano l findstr 138

2)程序檢查

①在msinfo32中檢視現有程序(開始->執行->輸入msinfo32->軟體環境->正在允許任務)。比如程序路徑、程序ID、檔案建立日期、啟動時間等。

②開啟windows工作管理員,可以點選啟動工作管理員檢視系統程序。

③cmd命令列輸入tasklist檢視程序。tasklist 結合findstr可以檢視不同pid對應的程式。c:\Windows\system32>tasklist | findstr 269

④開啟D盾_web查殺工具,程序檢視,關注沒有簽名資訊的程序。

⑤通過微軟官方提供的Process Explorer等工具進行排查。

⑥檢視可疑的程序及子程序。可以通過觀察以下內容:沒有簽名驗證資訊的程序、沒有描述資訊的程序、程序的屬主、程序的路徑是否合法、CPU或記憶體資源佔用長時間過高的程序。

3)檢查埠連線

是否有遠端連線、可疑連線。

①netstat -ano檢視目前的網路連線,定位可疑的ESTABLISHED(已建立連線狀態)

②根據netstat定位出的pid,再通過tasklist命令進行程序定位tasklist /fi"PID eq 12852"

4)小技巧(重點)

a、檢視埠對應的PID:netstat -ano | findstr 「port」

b、檢視PID對應的程序:tasklist /fi 「PID eq pid」

c、檢視程序對應的程式位置:工作管理員-->選擇對應程序-->右鍵開啟檔案位置執行鍵入wmic,輸入命令process

d、tasklist /svc程序-->PID-->服務

e、檢視Windows服務所對應的埠:執行鍵入drivers-->進入etc檔案-->開啟services檔案

6、計劃任務分析

windows的計劃任務是方便運維人員在不同時間段對系統進行一些操作的功能,但是在惡意攻擊中被駭客用來做為惡意程式的啟動等手段,也是windows應急響應中必須分析的功能。

windows的計劃任務一般存放在C:\Windows\System32\Tasks\或者C:\Windows\SysWOW64\Tasks\以及C:\Windows\tasks\等目錄下。一般利用圖形化介面可以開啟,執行->taskschd.msc,開啟任務計劃程式。

1)win+q搜尋任務計劃程式或右鍵此電腦-->管理,檢視計劃任務屬性,便可以發現木馬檔案的路徑。

2)cmd中輸入命令at檢查計算機與網路上的其他計算機之間的對談或計劃任務,如有則確認是否為正常連線。

7、自啟動分析

自啟動功能表示每次系統開機啟動後程式也跟著啟動,也是很多惡意程式最喜歡的功能,如果被加到自啟動項的程式便會出現在該專案下。

①執行->msconfig開啟系統設定可以檢視;

②執行->msinfo32開啟系統資訊,在軟體環境下的啟動程式也可以檢視。

③執行鍵入services.msc,注意服務狀態和啟動型別,檢查是否有異常服務。

④登入伺服器,工作管理員-->啟動

⑤執行鍵入msconfig-->啟動

⑥執行鍵入regedit開啟登入檔,檢視開機啟動項是否正常,特別注意如下三個登入檔項:

​ HKEY_CURRENT_USERISoftwarelMicrosoftWindows\CurrentVersion\Run

​ HKEY_LOCAL_MACHINE\SOFTWARE\MicrosoftWindows\CurrentVersion\Run

​ HKEY_LOCAL_MACHINE\SOFTWARE\MicrosoftWindows\CurrentVersionRunOnce

⑦利用安全軟體檢視啟動項、開機時間管理等

⑧組策略,執行gpedit.msc

8、自動化查殺

①病毒查殺

下載安全軟體,更新最新病毒庫,進行全盤掃描。

②webshell查殺

選擇具體站點路徑進行webshell查殺,建議使用兩款webshell查殺工具同時查殺,可相互補充規則庫的不足。

9、host檔案分析

host檔案是windows下用來構建對映關係的檔案,區域網沒有DNS伺服器,通過hosts建立給伺服器建立IP對映,通過分析可以檢視是否存在本地DNS篡改,該檔案在C:\Windows\System32\drivers\etc目錄下,開啟後可以檢視詳細對應關係。

10、webshell查殺分析

通過上述一系列的分析完成之後,如果在資料檔案備份均以完成,且客戶可分析允許的情況下,可以對系統進行病毒的掃描,以及web服務下的webshell掃描,掃描可以用的D盾等一系列webshell查殺工具。

三、工具使用

1、病毒分析

PCHunter(已經收費): http://www.xuetr.com/

火絨劍: https://www.huorong.cn/

Process Explorer: https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer

processhacker: https://processhacker.sourceforge.io/downloads.php

autoruns: https://docs.microsoft.com/zh-cn/sysinternals/downloads/autoruns

2、病毒查殺

卡巴斯基: http://devbuilds.kaspersky-labs.com/devbuilds/kvrt/latest/full/kvrt.exe(推薦理由:綠色版、最新病毒庫)

大蜘蛛: https://free.drweb.ru/download+cureit+free(推薦理由:掃描快、一次下載只能用1周,更新病毒庫)

火絨安全軟體:https://www.huorong.cn

360防毒:http://sd.360.cn/download_center.html

3、病毒動態

CVERC-國家計算機病毒應急處理中心:https://www.cverc.org.cn/

微步線上X情報社群:https://x.threatbook.cn/

火絨安全論壇:https://bbs.huorong.cn/

愛毒霸社群:http://bbs.duba.net

騰訊電腦管家:http://bbs.guanjia.qq.com/

4、線上病毒掃描網站

virscan:http://www.virscan.org

騰訊哈勃分析系統:https://habo.qq.com

jotti惡意軟體掃描系統:https://virusscan.jotti.org

針對計算機病毒、手機病毒、可疑檔案等進行檢測分析:http://www.scanvir.com

5、webshell查殺

D盾_Web查殺:http://www.d99net.net

河馬webshell查殺(有可能查不到):http://www.shellpub.com

深信服Webshell網站後面檢測工具:http://edr.sangfor.com.cn/backdoor_detection.html

Safe3:http://www.uusec.com/webshell.zip

6、後門查殺

1、檔案md5校驗

2、工具查殺

7、紀錄檔分析工具

Log Parser Lizard

對於GUI環境的Log Parser Lizard,其特點是比較易於使用,甚至不需要記憶繁瑣的命令,只需要做好設定,寫好基本的SQL語句,就可以直觀的得到結果。下載地址:http://www.lizard-labs.com/log_parser_lizard.aspx。依賴包:Microsoft .NET Framework 4.5,下載地址:https://www.microsoft.com/zh-cn/download/details.aspx?id=30653

Event Log Explorer

Event Log Explorer是一款非常好用的Windows紀錄檔分析工具。可用於檢視、監視和分析跟事件記錄,包括安全,系統,應用程式和其他微軟Windows的記錄被記載的事件,其強大的過濾功能可以快速的過濾出有價值的資訊。下載地址:https://event-log-explorer.en.softonic.com/

8、勒索自救指南

勒索病毒搜尋引擎

在勒索病毒搜尋引擎輸入病毒名、勒索郵箱、被加密後檔案的字尾名,或直接被上傳被加密的檔案、勒索提示資訊,即可快速查詢到病毒詳情和解密工具。

【360】勒索病毒搜尋引擎,支援檢索超過800中常見勒索病毒 http://lesuobingdu.360.cn

【騰訊】勒索病毒搜尋引擎,支援檢索超過300中常見勒索病毒 https://guanjia.qq.com/pr/ls/

【啟明】VenusEye勒索病毒搜尋引擎,超300中勒索病毒家族 https://lesuo.venuseye.com.cn/

【奇安信】勒索病毒搜尋引擎 https://lesuobingdu.qianxin.com/

勒索軟體解密工具集

很多安全公司都提供了免費的勒索病毒解密工具下載,收集和整理相關下載地址,可以幫助我們瞭解和獲取最新的勒索病毒解密工具。

【Github專案】勒索病毒解密工具收集彙總 https://github.com/jiansiting/Decryption-Tools

【卡巴斯基】免費勒索解密器 https://noransom.kaspersky.com/

【火絨】安全工具下載 https://bbs.huorong.cn/forum-55-1.html

【騰訊哈勃】勒索軟體專殺工具 https://habo.qq.com/tool/index

應急響應實操案例

四、入侵排查方法(精簡版)

1、檢查系統賬號安全

①檢視伺服器是否由弱口令,遠端管理埠是否對公網開放。

​ #檢查方法:據實際情況諮詢相關伺服器管理員。

②檢視伺服器是否存在可疑賬號、新增賬號。

​ #檢查方法:開啟本地使用者和組(lusrmgr.msc),檢視是否有新增/可疑的賬號。

③檢視伺服器是否存在隱藏賬戶、克隆/影子賬號。

​ #檢查方法:a、開啟登入檔,檢視管理員對應鍵值 b、使用工具,D盾查殺

④結合紀錄檔,檢視管理員登入時間、使用者名稱是否存在異常。

​ #檢查方法:a、開啟事件檢視器(eventvwr.msc) b、匯出Windows紀錄檔-安全,利用Log Parser進行分析。

2、檢查異常埠、程序

①檢查埠連線情況,是否有遠端連線、可疑連線。

​ #檢查方法:

a、netstat -ano檢視目前的網路連線,定位可疑的ESTABLISHED(已建立連線)

b、根據netstat定位出的pid,再通過tasklist命令進行程序定位tasklist /fi"PID eq 12852"

②程序

​ #檢查方法:

a、開始-->執行-->鍵入msinfo32,依次點選「軟體環境-->正在執行任務"就可以檢視到程序的詳細資訊,比如程序路徑、程序ID、檔案建立日期、啟動時間等。

b、開啟D盾_web查殺工具,程序檢視,關注沒有簽名資訊的程序。

c、通過微軟官方提供的 Process Explorer等工具進行排查。

d、檢視可疑的程序及子程序。可以通過觀察以下內容:沒有簽名驗證資訊的程序、沒有描述資訊的程序、程序的屬主、程序的路徑是否合法、CPU或記憶體資源佔用長時間過高的程序。

③小技巧:

a、檢視埠對應的PID:netstat -ano | findstr 「port」

b、檢視PID對應的程序:tasklist /fi 「PID eq pid」

c、檢視程序對應的程式位置:工作管理員-->選擇對應程序-->右鍵開啟檔案位置執行鍵入wmic,輸入命令process

d、tasklist /svc程序-->PID-->服務

e、檢視Windows服務所對應的埠:執行鍵入drivers-->進入etc檔案-->開啟services檔案

3、檢查啟動項、計劃任務、服務

①檢查伺服器是否有異常的啟動項。

​ #檢查方法:

a、登入伺服器,工作管理員-->啟動

b、執行鍵入msconfig-->啟動

c、執行鍵入regedit開啟登入檔,檢視開機啟動項是否正常,特別注意如下三個登入檔項:

​ HKEY_CURRENT_USERISoftwarelMicrosoftWindows\CurrentVersion\Run

​ HKEY_LOCAL_MACHINE\SOFTWARE\MicrosoftWindows\CurrentVersion\Run

​ HKEY_LOCAL_MACHINE\SOFTWARE\MicrosoftWindows\CurrentVersionRunOnce

d、利用安全軟體檢視啟動項、開機時間管理等

e、組策略,執行gpedit.msc

②檢查計劃任務

​ #檢查方法:

a、win+q搜尋任務計劃程式或右鍵此電腦-->管理,檢視計劃任務屬性,便可以發現木馬檔案的路徑。

b、cmd中輸入命令at檢查計算機與網路上的其他計算機之間的對談或計劃任務,如有則確認是否為正常連線。

③服務自啟動

​ #檢查方法:

執行鍵入services.msc,注意服務狀態和啟動型別,檢查是否有異常服務。

4、自動化查殺

①病毒查殺

​ #檢查方法:下載安全軟體,更新最新病毒庫,進行全盤掃描。

②webshell查殺

​ #檢查方法:選擇具體站點路徑進行webshell查殺,建議使用兩款webshell查殺工具同時查殺,可相互補充規則庫的不足。

5、紀錄檔分析

①系統紀錄檔

​ #分析方法:

a、前提:開啟稽核策略,若日後系統出現故障、安全事故則可以檢視系統的紀錄檔檔案,排除故障,追查入侵者的資訊等。

b、執行鍵入eventvwr.msc,開啟事件檢視器。

c、匯出應用程式紀錄檔、安全紀錄檔、系統紀錄檔,利用Log Parser進行分析。

②WEB存取紀錄檔

​ #分析方法:

a、找到中介軟體的web紀錄檔,打包到本地方便進行分析。

b、推薦工具:Windows下,推薦使用EmEditor進行紀錄檔分析,支援大文字,搜尋效率還不錯。Linux下,使用Shell命令組合檢視分析。

事件紀錄檔分析

對於Windows事件紀錄檔分析,不同的EVENT ID代表不同的意義,摘錄一些常見的安全事件的說明:

事件ID 說明
4624 登入成功
4625 登入失敗
4634 登出成功
4647 使用者啟動的登出
4672 使用超級使用者(如管理員)進行登入
4720 建立使用者

每個成功登入的事件都會標記一個登入型別,不同登入型別代表不同的方式:

登入型別 描述 說明
2 c (Interactive) 使用者在本地進行登入。
3 網路(Network) 最常見的情況就是連線到共用資料夾或共用印表機時。
4 批次處理(Batch) 通常表明某計劃任務啟動。
5 服務(Service) 每種服務都被設定在某個特定的使用者賬號下執行。
7 解鎖(Unlock) 屏保解鎖。
8 網路明文(NetworkCleartext) 登入的密碼在網路上是通過明文傳輸的,如FTP。
9 新憑證(NewCredentials) 使用帶/Netonly引數的RUNAS命令執行一個程式。
10 遠端互動(RemoteInteractive) 通過終端服務、遠端桌面或遠端協助存取計算機。
11 快取互動(Cachedlnteractive) 以一個域使用者登入而

8、Windows安全加固

1、賬戶

賬戶-預設賬戶安全

①禁用Guest賬戶(禁用預設賬戶)。

②禁用或刪除其他賬戶(建議先禁用賬戶—段時間,待確認沒有問題後刪除)。

③設定不同的使用者和使用者組。例如,管理員使用者、資料庫使用者、審計使用者、來賓使用者等。

說明:

1.管理員使用者:能夠維護正常應用程序的管理員,不是超級管理員

2.資料庫使用者(安全管理員):身份認證

3.審計使用者(審計管理員):檢視紀錄檔

4.伺服器裡面不能存在一個多餘的賬戶,存在有可能會被認為是一個非法賬戶。

5.程序/服務,身份認證,紀錄檔---->達到三權分立的狀態。分權控制有利於將許可權分散管理,從而降低賬戶風險。

賬戶-定期檢查本地使用者和組

定期刪除或鎖定與裝置執行、維護等與工作無關的帳戶。

操作步驟:開啟控制面板-->管理工具-->計算機管理,在系統工具-->本地使用者和組中,刪除或鎖定與裝置執行、維護等與工作無關的帳戶。

賬戶-不顯示最後的使用者名稱

不顯示最後的使用者名稱也就是設定登入登出後,不顯示使用者名稱稱(進行互動式登入),可以減少賬戶被爆破的風險。

操作步驟:開啟控制面板-->管理工具-->本地安全策略,在本地策略-->安全選項中,雙擊互動式登入:不顯示最後的使用者名稱,選擇已啟用並單擊確定。

2、口令

口令-密碼複雜度

密碼複雜度要求必須滿足以下策略:

①最短密碼長度要求8個字元。

②啟用本機組策略中密碼必須符合複雜性要求的策略。即密碼至少包含以下四種類別的字元中的三種:

​ 1、英語大寫字母A,B,C,...Z

​ 2、英語小寫字母a, b, c,... z

​ 3、西方阿拉伯數位0,1,2,...9

​ 4、非字母數位字元,如標點符號,@,#,$,%,&,*等

操作步驟:開啟控制面板-->管理工具-->本地安全策略,在帳戶策略-->密碼策略中,確認密碼必須符合複雜性要求策略已啟用。

口令-密碼最長留存期

①對於採用靜態口令認證技術的裝置,帳戶口令的留存期不應長於90天。1、密碼最短使用期限為1天,密碼最長使用期限為90天。

②強制密碼歷史修改成記住五個密碼。(強制密碼歷史就是不能與上次設定的密碼相同)

操作步驟:開啟控制面板-->管理工具-->本地安全策略,在帳戶策略-->密碼策略中,設定密碼最長使用期限不大於90天。

口令-賬戶鎖定策略

對於採用靜態口令認證技術的裝置,應設定當使用者連續認證失敗次數超過5次後,鎖定該使用者使用的帳戶。

①賬戶鎖定時間:15分鐘

②賬戶鎖定閾值:5次無效登入

③重置賬戶鎖定計數器:15分鐘(這個選項一般設定的與賬戶鎖定時間一致)

操作步驟:開啟控制面板-->管理工具-->本地安全策略,在帳戶策略-->帳戶鎖定策略中,設定帳戶鎖定閾值不大於5次。

3、授權

在本地安全設定中,只允許授權帳號從網路存取(包括網路共用等,但不包括終端服務)此計算機。

操作步驟:開啟控制面板-->管理工具-->本地安全策略,在本地策略-->使用者許可權分配中,設定從網路存取此計算機許可權給指定授權使用者。(比如在使用者許可權分配-->從網路存取此計算機中,將Everyone刪除;必須是特定的組才可以從網路存取此計算機)---黑白名單

說明:必須具體到某個人能否存取(設定白名單)

4、紀錄檔設定

紀錄檔設定-稽核

開啟控制面板-->管理工具-->本地安全策略,在本地策略-->稽核策略中,其中稽核九條目必須全部稽核。意思就是說執行這個操作無論成功還是失敗全都記錄下來。

稽核登入

裝置應設定紀錄檔功能,對使用者登入進行記錄。記錄內容包括使用者登入使用的帳戶、登入是否成功、登入時間、以及遠端登入時、及使用者使用的IP地址。

操作步驟:開啟控制面板-->管理工具-->本地安全策略,在本地策略-->稽核策略中,設定稽核登入事件。

稽核策略

啟用本地安全策略中對Windows系統的稽核策略更改,成功和失敗操作都需要稽核。

稽核物件存取

啟用本地安全策略中對Windows系統的稽核物件存取,成功和失敗操作都需要稽核。

稽核過程追蹤

啟用本地安全策略中對Windows系統的稽核程序追蹤,僅失敗操作需要稽核。

紀錄檔設定-紀錄檔檔案大小

設定應用紀錄檔檔案大小至少為200M(不少於200M),可根據磁碟空間設定紀錄檔檔案大小,記錄的紀錄檔越多越好。並設定當達到最大的紀錄檔尺寸時,按需要輪詢記錄紀錄檔或者紀錄檔滿時其存檔,不覆蓋事件(A)。

操作步驟:開啟控制面板-->管理工具-->事件檢視器,設定應用紀錄檔、系統紀錄檔、安全紀錄檔屬性中的紀錄檔挑大小,以及設定當達到最大的紀錄檔尺寸時的相應策略。

5、IP協定安全

SYN Flood (SYN洪泛)

SYN Flood (SYN洪泛)SYN洪泛是一種阻斷服務攻擊。起因於攻擊者傳送—系列的SYN請求到目標系統,佔據伺服器資源。

攻擊者傳送許多封包,但不向伺服器傳送「ACK」。因此,連線斷開,吞下伺服器資源。由於阻止服務攻擊,合法使用者嘗試連線到伺服器但被拒絕(導致正常使用者不能正常進入連線)。

SYN洪泛需要掌握TCP三次握手

IP協定安全-啟用SYN攻擊保護

啟用SYN攻擊保護。

①指定觸發SYN洪水攻擊保護所必須超過的TCP連線請求數閾值為5。(不能同一個地址連續發包5次)

②指定處於SYN_RCVD狀態(傳送狀態)的TCP連線數的閾值為500。

③指定處於至少已傳送一次重傳的SYN_RCVD狀態(重傳狀態)中的TCP連線數的閾值為400。

Windows Server 2008:(登入檔當中的操作)
HKEY_LOCAL_MACHINE\SYSTEMCurrentControlSet\Services\SynAttackProtect	推薦值:2
HKEY_LOCAL_MACHINE\SYSTEMICurrentControlSet\ServiceslTcpMaxPortsExhausted	推薦值:5
HKEY_LOCAL_MACHINE\SYSTEMCurrentControlSetlServiceslTcpMaxHalfOpen	推薦值:500
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSetlServicesTcpMaxHalfOpenRetried	推薦值:400

洪泛攻擊的命令

hping3 -S -a 1.1.1.1 -s 445 --flood 192.168.126.128 -p 445
解讀:通過445埠偽造出1.1.1.1(虛擬IP)的IP,去給192.168.126.128(真實IP)的445這個埠發TCP的封包,從而達到需要攻擊的目標資源佔滿。

洪泛攻擊是爭對埠的,只要將防火牆開啟(445埠預設關閉,445埠是一個共用資料夾的埠),洪泛攻擊效果就不明顯了。

6、服務安全

服務安全-禁用TCP/IP上的NetBlOS

禁用TCP/IP上的NetBlOS協定(NetBIOS網路上的基礎輸入輸出裝置),可以關閉監聽的UDP 137( netbios-ns)、UDP 138( netbios-dgm)以及TCP139( netbios-ssn)埠。還有個135埠。以上埠都為高危埠,都可能導致網路上主機發現/主機名發現/地址發現。

操作步驟:

①在計算機管理-->服務和應用程式-->服務中禁用TCP/IP NetBIOS Helper 服務。

②在網路連線屬性中,雙擊 Internet協定版本4(TCP/I Pv4),單擊高階,找到WINS下面的NetBIOS設定,將其禁用。

服務安全-禁用不必要的服務

服務名稱 建議
DHCP Client 如果不使用動態IP地址,就禁用該服務
Background lntelligent Transfer Service 如果不啟用自動更新,就禁用該服務
Computer Browser 禁用
Diagnostic Policy Service 手動
Helper 禁用。該服務用於轉換IPv6 to lPv4
Print Spooler 如果不需要列印,就禁用該服務
Remote Registry 禁用。Remote Registry主要用於遠端管理登入檔
Server 如果不使用檔案共用,就禁用該服務。禁用本服務將關閉預設共用,如ipc\(、admin\)和c$等
TCP/IP NetBIOS Helper 禁用
windows Remote Management (WS-Management) 禁用
Windows Font Cache Service 禁用
WinHTTP web Proxy Auto-Discovery Service 禁用
Windows Error Reporting service 禁用

7、安全選項

安全選項-啟用安全選項

開啟控制面板>管理工具>本地安全策略,在本地策略>安全選項中,進行如下設定:

安全選項 設定記憶體
互動式登入:試圖登入的使用者的訊息標題 注意
互動或登入:試圖登入的使用者的訊息文字 內部系統只能因業務需要而使用。經由管理層授權。管理層將隨時監測此係統的使用。
Microsoft網路伺服器:對通訊進行數位簽章(如果使用者端允許) 啟用
Microsoft網路伺服器:對通訊進行數位簽章(始終) 啟用
Microsoft網路使用者端:對通訊進行數位簽章(如果伺服器允許 啟用
Mlicrosoft網路使用者端:對通訊進行數位簽章(始終) 啟用
網路安全:基於NTLM SSP的(包括安全RPC)伺服器的最小對談安全 要求NTLMv2對談安全要求128位元加密
網路安全:基於NTLM SSP的(包括安全RPC)使用者端的最小對談安全 要求NTLMv2對談安全要求128位元加密
網路安全:LAN管理器身份著證級別 僅傳送NTLMv2響應\拒絕LM & NTLM
網路存取:不允許SAM帳戶的匿名列舉 啟用(蹴認已啟用)
網路存取:不免許SAM帳戶和共用的匿名列舉 啟用

安全選項-禁用未登入前關機

伺服器預設是禁止在未登入系統前關機的。如果啟用此設定,伺服器安全性將會大大降低,給遠端連線的駭客造成可乘之機,強烈建議禁用未登入前關機功能。

操作步驟:開啟控制面板-->管理工具-->本地安全策略,在本地策略-->安全選項中,禁用關機:允許系統在未登入前關機策略。

8、其他安全設定

防病毒管理

Windows系統需要安裝防病毒軟體。

操作步驟:安裝企業級防病毒軟體,並開啟病毒庫更新及實時防禦功能。

限制遠端登入空閒斷開時間

對於遠端登入的帳戶,設定不活動超過時間15分鐘自動斷開連線。

操作步驟:開啟控制面板-->管理工具-->本地安全策略,在本地策略-->安全選項中,設定Microsoft網路伺服器:暫停對談前所需的空閒時間數量屬性為15分鐘。

作業系統修補程式

及時更新作業系統修補程式

9、Linux中的基礎命令

1、Linux系統命令列提示符介紹

[root@Lin ~]# 
①root——使用者名稱 (預設是登入自己建立的普通使用者)
②Lin——主機名/計算機名   初始為:localhost
③~——所在位置(絕對路徑為/home/lin)     ~:家目錄      /:根目錄(根目錄是所有檔案開始的地方)
④#——許可權   #:root許可權	 $:普通許可權

=======================================================

例子(見表格詳解):
[root@kangyz ~]#		// 這是超級使用者root對應的命令列
[kang@kangyz ~]$		// 這是普通使用者kang對應的命令列
編號 提示符資訊 組成說明
# 是使用超級使用者root登入後的命令列結尾提示符。
$ 是使用普通使用者登入後的命令列結尾提示符。
root 代表當前登入的使用者,可用whoami進行查詢。root使用者具有管理系統的所有許可權。
kang 代表當前登入的使用者,可用whoami進行查詢。許可權較小,只能進行基本的系統資訊檢視等操作,無法更改系統設定和管理服務。
@ 主要用於分割登入使用者與系統主機名稱資訊。
kangyz 主機名稱,可使用hostname命令查詢。
~ 所在的位置是視窗當前使用者所在的路徑資訊,可用pwd查詢。一般顯示「~」表示在當前使用者家目錄中。

2、使用者切換

[root@localhost ~]# pwd
/root
[root@localhost ~]# su xzm
[xzm@localhost root]$ pwd
/root
[xzm@localhost root]$ su
Password: 
[root@localhost ~]# 
//xzm中的root目錄 =(相當於) root中的~目錄(家目錄),對於root來說自己的家目錄是/root。所以說切換目錄時是不會改變當前路徑。
①
[xzm@localhost root]$ cd /home/
[xzm@localhost home]$ ls
xzm
[xzm@localhost root]$ cd /home/xzm/
[xzm@localhost ~]$ ls
Desktop  Documents  Downloads  Music  Pictures  Public  Templates  Videos
//這裡的~表示xzm自己的家目錄。
②
[root@localhost /]# ls /home/
xzm
[root@localhost /]# cd /root/
[root@localhost ~]# ls
anaconda-ks.cfg  Documents  initial-setup-ks.cfg  Pictures  Templates
Desktop          Downloads  Music                 Public    Videos
//預設情況下,所有使用者的家目錄都在一個叫/home的檔案下的使用者名稱裡【cd xzm資料夾裡】;但是root使用者直接在/root下(與/home是平等級的),該使用者所在等級比其他使用者高一級。
[root@localhost ~]# less /etc/passwd        //拉到最下面可以檢視本地建立的使用者資訊

3、修改網路卡設定(靜態網路卡設定)

路徑:
[root@localhost /]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# vim ifcfg-ens33



網路卡設定成靜態(模板):
TYPE="Ethernet"       //網路模式-乙太網(引號可以刪掉(要麼都加,要麼都不加),因為加不加引號都是以字串形式識別)--不能刪除
PROXY_METHOD="none"      //代理傳送(給外網)--可以刪除
BROWSER_ONLY="no"      //僅瀏覽器模式--可以刪除
BOOTPROTO="dhcp"      //網路卡模式--怎麼獲取IP地址--修改成靜態(static)
DEFROUTE="yes"      //預設路由(如果是靜態的話會自動設定IP,使用以下兩個可以刪除)
IPV4_FAILURE_FATAL="no"      //--可以刪除//直接略過
IPV6INIT="yes"      //--可以刪除
IPV6_AUTOCONF="yes"      //直接略過
IPV6_DEFROUTE="yes"      //直接略過
IPV6_FAILURE_FATAL="no"      //直接略過      //直接略過
IPV6_ADDR_GEN_MODE="stable-privacy"      //直接略過
NAME="ens33"      //網路卡名稱(名稱可以改,但裝置名稱也必須同步修改,否則系統識別不了)
UUID="e378bcc1-234a-4ac9-9b95-32a9330eb8b9"      //網路卡id--可以刪除
DEVICE="ens33"      //裝置名稱(與網路卡名稱相同)--不能刪除
ONBOOT="yes"      //是否開機自啟動--不能刪除

最終設定結果:
TYPE=Ethernet
BOOTPROTO=static
IPADDR=192.168.126.131
NETMASK=255.255.255.0
GATEWAY=192.168.126.2
DNS1=218.85.157.99
DNS2=114.114.114.114
DEFROUTE=yes
NAME=ens33
DEVICE=ens33
ONBOOT=yes
在退出設定情況下,需要進行系統網路卡重新啟動,需要等重啟之後網路卡資訊才會生效;假如未進行網路卡重啟也能ping通是因為原先的DHCP在起作用。

//重啟網路命令:
[root@localhost network-scripts]# systemctl restart network
該命令生效時會有一段時間。(沒有報錯就說明命令正確)
//重啟網路卡命令:
[root@localhost network-scripts]# ifdown ifcfg-ens33 		//關閉網路卡
Device 'ens33' successfully disconnected.
[root@localhost network-scripts]# ifup ifcfg-ens33 		//開啟網路卡
Connection successfully activated (D-Bus active path:/org/freedesktop/NetworkManager/ActiveConnection/8)
//以上重啟網路命令和重啟網路卡命令只要完成一個就可以實現修改網路卡組態檔生效。

3、遠端登入

較大的映象檔案一般都可以直接遠端登入,不需要進行其他設定。

CentOS7的SSH服務預設開啟:
[root@localhost network-scripts]# systemctl start sshd //開始ssh服務
[root@localhost network-scripts]# systemctl status sshd //檢視服務狀態
[root@localhost network-scripts]# systemctl stop sshd //關閉服務
[root@localhost network-scripts]# systemctl restart sshd //重啟ssh服務

主機登入到另一臺主機,通過第三方工具(CRT/putty)實現。

[root@localhost ~]# cat /etc/ssh/sshd_config     //遠端登入ssh服務的組態檔

遠端模組不生效的情況下(有可能映象檔案太小,該模組未設定上):
修改模組一:
#Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
修改模組二:
PasswordAuthentication yes
//假如說遠端登入CentOS不超過的話則進入遠端登入ssh服務的組態檔,將1-4條的井號(註釋符)刪掉;將模組二修改成固定格式(如第7行所示)

4、開機自啟動root使用者

[root@localhost /]# vim /etc/gdm/custom.conf 		//進入開機自啟動的組態檔
==========
修改後的設定資訊如下:
# GDM configuration storage

[daemon]
AutomaticLoginEnable=True		//開啟開機自啟動/登入
AutomaticLogin=root		//自登入root使用者
[security]

[xdmcp]

[chooser]

[debug]
# Uncomment the line below to turn on debugging
#Enable=true
=========
設定完成之後需要reboot重啟系統才能生效。 

//在組態檔中如果有中括號括起來的話,則括起來的部分不生效,只是說明讓系統檢測到是什麼模組,根本不起作用。

5、修改主機名

方法一:臨時修改

hostname xxx	  	//臨時修改主機名,重新啟動作業系統則失效(需要重新啟動Open Terminal介面)

方法二:永久修改主機名

[root@localhost /]# vim /etc/hostname 		//永久修改主機名(需要重新啟動作業系統才生效)

6、快捷鍵

作用在系統上

ctrl + c		//強制終止程序
ctrl + d		//退出/退出使用者(一般使用者退出使用者)
ctrl+shift+c/v 		//inux複製貼上

作用在vi/vim上

vim有三種模式
①命令模式--使用快捷鍵--vim剛進入就是命令模式
nyy:複製n行,直接yy,複製當前行
p:貼上
ndd:刪除n行,直接dd,刪除當前行
u:回到上一步(撤回)

②插入模式--編輯模式
i:從當前遊標插入
o:新建一行插入
a:從下一個字元
/:檢索
n:檢索下一個
q:退出
複製貼上時最好在插入模式,可以確保內容不會缺失。

③底行模式(提示行)---命令模式輸入英文「:」進入底行模式
wq:儲存且退出 ,等同於x
q:不儲存且退出(會詢問)
q!:不儲存強制退出
檢索功能:命令模式按「/」,輸入檢索字串,回車,按「n」鎖定下一個

7、檔案的增刪改查

【增】(引數在前在後不影響)
建立檔案(①touch、②echo、③cat)(新建立的檔案基本上都是644許可權)
touch+檔名
	-c 不建立
	-f 等於沒加引數
echo:回顯--【echo 5.6161】//echo 寫入檔案不存在時會預設建立該檔案並寫入
>:重定向(覆蓋)
>>:追加(不會覆蓋,預設換行)
【echo+寫入內容+>/>>+檔名】 

建立目錄(①mkdir)(新建立的目錄基本上都是655許可權)
mkdir+目錄名稱【mkdir 1/2】
	-p  遞迴建立【mkdir -p 3/4(在3前面沒有其他目錄時會建立一個目錄3,裡面還有一個目錄4)】
	-v 顯示建立過程【mkdir -pv 5/6】



【刪】(引數在前在後不影響)
刪除檔案/目錄(①rm②rmdir)
rm+檔名		//(不加引數直接刪除會有提示)
	-f:強制刪除,不提示【rm 2.txt -f(檔案)】
	-r:刪目錄(有提示)【rm -r 3(目錄)】
【rm -rf 目錄/檔案】	//(如果在要刪除的目錄/檔案下,則無法刪除)
!!!【rm -rf /*】--------死亡命令(刪除根目錄下的所有檔案-系統直接沒------禁用禁用禁用!!!)
rmdir+空目錄(只能刪除空目錄)


【改】(引數在前在後不影響)
mv+原路徑+目標路徑【mv 4.txt 1/2(將4.txt移動到路徑1中的2目錄下)】--移動
mv+原始檔名+重新命名後的檔名(正常重新命名)【mv 1.txt 2.txt】
mv+原路徑/檔案+目標路徑/重新命名的名字(假如檔案在其他路徑下,則預設會移動到當前路徑下再重新命名)--不寫重新命名的名字的話會保留原名字,一寫名字的話則會重新命名。【[root@localhost Desktop]# mv 1/2/4.txt 2.txt】
cp+原路徑+目標路徑(與mv差不多)		(帶引數-p可以將該檔案/目錄的許可權一起拷貝過去)
cp時必須得是一個確定的目錄/檔案


【查】
檢視檔案/目錄(①man、②ls、③ll、④cat、⑤help、⑥type、⑦du、⑧less、⑨more)
man :檢視命令
ls:檢視當前目錄內容
ll=ls -l:顯示當前目錄具體資訊
cat: 檢視檔案內容
help:檢視內部/內建命令
type:判斷內外部命令字(如果會先結果中有shell則是內部命令;如果回顯一個目錄的話則是外部安裝的)
du:檢視目錄大小
more:分頁檢視(會回顯到對談)
less :分頁檢視

Linux dd 命令 | 菜鳥教學 (runoob.com)

8、打包、壓縮

打包
①tar
檢視目錄大小(ls無法檢視目錄大小;ll可以)[root@Lin ~]# du –sh .
對目錄進行打包[root@Lin ~]# tar –cf [打包後的路徑(檔名)/需要進行打包的檔名] [打包前的目錄]
對打包檔案進行壓縮(gzip和bzip2皆可):[root@Lin ~]# gzip /TAR/1.tar
同時進行打包和壓縮:[root@x ~]# tar –zcf TAR/2.tar.gz test
解壓縮:[root@x ~]# tar –zxf TAR/2.tar.gz –C /
tar選項引數含義:
	-c	打包
	-x	解包
	-C	+檔案存放路徑
	-z	使用gzip
	-j	使用bzip2


壓縮
①gzip
壓縮:[root@x ~]# gzip [檔名]
解壓縮:[root@x ~]# gunzip [壓縮檔名]
②bzip2
相對於gzip,bzip2是一個壓縮效率更高的命令,壓縮後檔案佔據的空間更小,所以需要的壓縮時間要比gzip更久,bzip2的使用方式與gzip基本相同。(可以通過觀察字尾來判斷該檔案是以什麼方式進行壓縮的,再以相反方式解壓縮)
壓縮:[root@Lin ~]# bzip2 [檔名]
解壓縮:[root@Lin ~]# bunzip2 [壓縮檔名]

9、Linux目錄樹

/ --- 作業系統的起始路徑根路徑
/bin --- 普通使用者和管理員都可以執行的命令字
/sbin --- 只有管理員才能執行的命令關機重啟
/boot --- 引導主引導目錄獨立的分割區啟動選單核心
/dev --- device裝置裝置檔案存放目錄
/etc --- 組態檔存放目錄
/home --- 普通使用者的家目錄
/root --- 管理員的家目錄
/media --- 光碟機的掛載目錄
/mnt ---- 臨時裝置掛載目錄
/proc --- 裡面的資料都在記憶體中,程序的所在目錄
/tmp --- 臨時檔案存放目錄
/usr --- 軟體的安裝目錄
/var --- 常變檔案存放目錄紀錄檔檔案郵件檔案

10、檢視Linux基礎資訊

free		//檢視記憶體空間
free -h		//帶單位的檢視記憶體空間(比較人類化檢視)
fdisk -l		//檢視磁碟

//檢視記憶體程序檔案
cat /proc/meminfo 		
cat /proc /meminfoMemTota1 :總記憶體
MemFree :空閒記憶體
Buffers :給檔案的緩衝大小
cached :高速緩衝記憶體(快取),使用的大小,容量小,速度比主記憶體高很多,接近CPU速度
Vma17ocTota1:虛擬記憶體大小
Vma7locused:已經被使用的虛擬記憶體大小

//檢視CPU資訊
cat /proc/cpuinfo
processor :系統中邏輯處理器核心的編號,單核處理器,就可以認為CPU編號
vendor_id: CPU製造商
cpu family : CPU產品系類代號
mode7:屬於該系列中的乃一代
mode7 name : CPU名字編號,標識主頻
cache size : CPU快取大小

11、連結檔案

連結:是一個檔案共用的方式 。
①硬連結:ln 原始檔(絕對路徑) 連結檔案 (相當於對檔案再開啟一個開啟方式。特點:如果將硬連結所指向的檔案刪除的話,那麼硬連結也消失)
②軟連結:ln -s 原始檔(絕對路徑) 連結檔案(相當於指標的概念)


建立軟連線:
[root@localhost ~]# echo 123456 > 1.txt		//在root使用者的家目錄上寫一個1.txt檔案
[root@localhost ~]# cat 1.txt 
123456
[root@localhost ~]# cd Desktop/
[root@localhost Desktop]# ln -s /root/1.txt 11.txt		//在桌面上建立一個軟連線新的目錄叫11.txt
[root@localhost Desktop]# ll
total 0
lrwxrwxrwx. 1 root root 11 Oct 27 14:30 11.txt -> /root/1.txt//發現11.txt已經變成淺藍色(說明為一個連結檔案)
[root@localhost Desktop]# cat 11.txt 
123456

Linux當中讀取檔案是依據元資訊;檔名是給使用者看的。

12、其他命令

reboot:重啟
tab:補齊命令或者目錄或者檔名
切換使用者:su+使用者名稱(單單su,預設切換root)
cd /home:進入 ‘/home’ 目錄
cd ..:返回上一級目錄
ls -a:顯示隱藏檔案
pwd:顯示工作路徑
vi/vim file:開啟並瀏覽檔案
grep:用於查詢檔案裡符合條件的字串。
q:退出
sudo:賦予一次root命令的許可權。(暫時將該命令用root身份執行)

systemctl stop firewalld.service 	//關閉防火牆
systemctl disable firewalld.service 	//關閉自啟動
systemctl restart network		//重啟網路服務
systemctl restart [servers]		//重啟服務

10、Linux使用者和組

Windows當中guest使用者為內建使用者,使用者組當中是否複雜。且不同的組都有不同的(獨有的)許可權。Linux當中使用者十分純粹。

一、基本概念

1、基本介紹

Linux作為一種多使用者的作業系統(伺服器系統),允許多個使用者同時登陸到系統上,並響應每個使用者的請求。任何需要使用作業系統的使用者,都需要一個系統賬號,賬號分為:管理員賬號與普通使用者賬號。在Linux中,作業系統根據UID來判斷用!根據UID來判斷使用者!而不是使用者名稱!只要id為0就是管理員,哪怕有多個id為0的賬號;系統在新建賬號時,會根據賬號型別,自動分配遞增賬號的UID與GID(使用者身份編號,組編號),也可自行分配。通常情況下,應當保證UID與GID唯一且不重複。

2、Linux的單使用者任務和多使用者任務

在Linux下,當你登入後,你也可以同時開啟很多的服務任務和程序,而各自服務都會跑的很好卻對其他任務沒有任何影響,這種登入一個使用者登入系統執行多個服務任務和程序的情況,就稱為單使用者多工。

多使用者任務——有時可能是很多使用者同時用同一個系統,如公司幾十個運維人員,每臺機器都可以和被若干個運維人員登入部署或解決相關故障問題,但並不是所有的運維人員都要做同一件事,所以就有了多工、多使用者的情況。

注:多使用者、多工並不是大家同時擠到一起,在一臺機器的鍵盤和顯示器前來操作機器,多使用者可能是通過SSH使用者端工具等遠端工具等遠端登入伺服器來進行,比如對伺服器的運程控制,只要具有相關使用者的許可權,任何人都是可以上去操作存取伺服器。

3、Linux系統使用者分類

使用者在系統中是分角色的,由於角色的不同,許可權和所完成的任務也不同。在Linux系統中每個使用者的 ID 細分為 2 種,分別是使用者ID(User ID,簡稱 UID)和組 ID(Group ID,簡稱 GID),這與檔案有擁有者和擁有群組兩種屬性相對應。值得注意的是使用者的角色是通過UID和GID識別的。特別是UID,在運維工作中,一個UID是唯一標識一個系統使用者的賬號。

在Windows當中使用者資訊存放在SAM檔案/目錄當中;在Linux當中使用者資訊都存放在/etc/passwd。
//[root@x~]# cat /etc/passwd
①、root使用者

root使用者是UID和GID都等於0的使用者,是Linux系統中的「上帝」,擁有最大的許可權。如果深入瞭解Linux系統,會發現root使用者真的擁有很多特權,比如:無視Linux對許可權的設定而強行讀、寫、執行檔案,切換其他使用者登入不需要密碼,可以強行切換到已經所用的使用者,只有root可以直接為普通使用者修改密碼等等。

②、系統使用者

系統使用者通常用於執行服務,但是此使用者無家目錄,也不能用於登入系統。例如,在yum安裝apache、nginx等服務後,就會自動建立apache和nginx的使用者和同名使用者組。在Cent OS 6系統中,系統使用者的UID範圍是1-499,在Cent OS 7系統中,系統使用者的ID是1-999。偽使用者/系統使用者不是一個真是的使用者,只是一個服務。

③、普通使用者

普通使用者只能由root使用者建立,該使用者擁有家目錄,並且可以登入,該使用者的許可權由root分配。普通使用者擁有指定的shell環境。在Cent OS 7系統中,普通使用者的ID是1000-60000。

4、使用者和使用者組介紹

使用者——每一個使用者都有一個唯一的使用者名稱和使用者口令,在登入系統後,只有正確輸入了使用者名稱和密碼,才能登入系統和相應的目錄。

使用者組——簡單的說,linux系統中的使用者組(group)就是具有相同特性的使用者(user)集合;有時我們需要讓多個使用者具有相同的許可權,比如檢視、修改某一個檔案或目錄,如果不用使用者組,這種需求在授權時就很難實現。如果使用使用者組就方便多了,只需要把授權的使用者都加入到同一個使用者組裡,然後通過修改該檔案或目錄的對應的使用者組的許可權,讓使用者組具有符合需求的操作許可權,這樣使用者組下的所有使用者對該檔案或目錄就會具有相同的許可權,這就是使用者組的用途。將使用者分組是linux系統中對使用者進行管理及控制存取許可權的一種手段,通過定義使用者組,在很大程度上簡化了運維管理工作。

使用者和使用者組的對應關係有:一對一、一對多、多對一和多對多。

一對一:即一個使用者可以存在一個組中,也可以是組中的唯一成員。比如,root

一對多:即一個使用者可以存在多個組中,這個使用者就具有這些組。

多對一:即多個使用者可以存在一個組中,這些使用者這些組的共同許可權。

多對多:即多使用者可以存在於多個組中。並且幾個使用者可以歸屬相同的組;其實多對多的關係是前面三條的擴充套件。

二、使用者及使用者組組態檔介紹

在Linux中,萬物皆檔案,所以使用者與組也以組態檔的形式儲存在系統中,以下為使用者和組的主要組態檔詳解:

  • /etc/passwd:使用者及其屬性資訊(名稱、 UID、主組ID等)
  • /etc/group:組及其屬性資訊
  • /etc/shadow:使用者密碼及其相關屬性
  • /etc/gshadow:組密碼及其相關屬性(其實使用者組也沒有密碼)

1、使用者的組態檔/etc/passwd

/etc/passwd檔案中每行定義(都是)一個使用者賬號,有多少行就表示多少個賬號,在一行中可以清晰的看出,各內容之間又通過冒號「:」劃分了7個欄位/部分(冒號分隔),這7個欄位分別定義了賬號的不同屬性,/etc/passwd檔案實際內容如下:

[root@localhost ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash		【root使用者,在 /etc/passwd檔案的第一行】
xzm:x:1000:1000:XZM:/home/xzm:/bin/bash		【普通使用者】
①欄位1【root】:帳號名,這是使用者登陸時使用的賬戶名稱,在系統中是唯一的,不能重名
②欄位2【x】:密碼預留位置x(已重置);早期的unix系統中,該欄位是存放賬戶和密碼的,由於安全原因,後來把這個密碼欄位內容移		到/etc/shadow中了。這裡可以看到一個字母x,表示該使用者的密碼是/etc/shadow檔案中保護的。
③欄位3【UID】:UID;範圍是0-65535
④欄位4【GID】:GID;範圍是0-65535;當新增使用者時,預設情況下會同時建立一個與使用者同名且UID和GID相同的組。
⑤欄位5【root】:使用者說明(備註):這個欄位是對這個賬戶的說明
⑥欄位6【/root】:宿主目錄(家目錄);使用者登陸後首先進入的目錄(使用者登入系統後的預設目錄),一般與"/home/使用者名稱"這樣的目錄
⑦欄位7【/bin/bash】:登入Shell;當前使用者登陸後所使用的shell執行環境(使用者登入後使用的命令直譯器),在centos/rhel系統中,預設的shell是bash;如果不希望使用者登陸系統,可以通過usermod或者手動修改passwd設定,將該欄位設定為/sbin/nologin即可。大多數內建系統賬戶都是 /sbin/nologin,這表示禁止登陸系統。這是出於安全考慮的。——awd攻防必須的操作!

【使用者名稱:密碼:UID(使用者ID):GID(組ID):描述性資訊:主目錄:預設Shell】

passwd中有關UID的限制說明:0:當用戶的UID為0時,表示這個賬戶為超級使用者;如果要增加一個系統管理員賬戶的話,只需將該賬戶的UID改為0即可(不建議操作)。

看一下/etc/passwd的許可權:
[root@localhost ~]# ll /etc/passwd
-rw-r--r--. 1 root root 2301 Sep 28 19:56 /etc/passwd
因為每個使用者登入時都需要取得UID和GID來判斷許可權問題,所以/etc/passwd的許可權為644,這樣一來就會帶來安全問題,即所有的使用者都可以都/etc/passwd檔案,即使檔案內的密碼是加密的,但還是存在一定的被攻擊破解的安全隱患。因此,就有了/etc/shadow檔案。

2、使用者的影子口令檔案/etc/shadow

/etc/shadow 檔案,用於儲存 Linux 系統中使用者的密碼資訊,又稱為「影子檔案」。在檔案中每行定義(都是)一個使用者密碼,有多少行就表示多少個賬號所對應的密碼,在一行中可以清晰的看出,各內容之間又通過冒號「:」劃分了9個欄位/部分(冒號分隔),這9個欄位分別定義了密碼的不同屬性,/etc/shadow檔案實際內容如下:

[root@localhost ~]# cat /etc/shadow
root:$6$gzV7F7XygZZLiLMs$q3xIpzL6.tLwg.PkqiIynm2gtkED2pu7oRLlUvfk516Pt/nVgnmISbMW0HOeHoQbjx1bcpD/xpKaL1xwT6dnx.::0:99999:7:::
①欄位1:帳號名稱/使用者名稱:同/etc/passwd檔案的使用者名稱有相同的含義。
②欄位2:加密密碼(通常使用sha512/md5加密):真正加密的密碼。所有偽使用者的密碼都是"!!"或"*",代表沒有密碼是不能登入的。$6$:sha加密,$1$:md5加密。
③欄位3:最近更改密碼的時間/最後一次修改時間:Linux計算日期的時間是以1970年1月1日作為1不斷累加得到的時間。
④欄位4:禁止修改密碼的天數/最小修改時間間隔:該欄位規定了從第 3 欄位(最後一次修改密碼的日期)起,多長時間之內不能修改密碼。如果是0,則密碼可以隨時修改;如果是10,則代表密碼修改後10天之內不能再次修改密碼。
⑤欄位5:使用者必須更改口令的天數/密碼有效期:密碼的最長有效天數,該欄位的預設值為99999天,也就是273年,可認為是永久生效。
⑥欄位6:警告更改密碼的期限/密碼需要變更前的警告天數:與第 5 欄位相比較,當賬戶密碼有效期快到時,系統會發出警告資訊給此賬戶,提醒使用者 「再過 n 天你的密碼就要過期了,請儘快重新設定你的密碼!」。該欄位的預設值是 7。
⑦欄位7:不活動時間/密碼過期後的寬限天數:在密碼過期後,使用者如果還是沒有修改密碼,則在此欄位規定的寬限天數內,使用者還是可以登入系統的;如果過了寬限天數,系統將不再讓此賬戶登陸,也不會提示賬戶過期,是完全禁用。比如,此欄位規定的寬限天數是 10,則代表密碼過期10天后失效;如果是 0,則代表密碼過期後立即失效;如果是 -1,則代表密碼永遠不會失效。
⑧欄位8:賬號失效時間:預設值為空;從1970/1/1日起,到使用者被禁用的天數(賬戶密碼失效時啟用)
⑨欄位9:保留欄位(未使用):這個欄位目前沒有使用,等待新功能的加入。

【使用者名稱:加密密碼:最後一次修改時間:最小修改時間間隔:密碼有效期:密碼需要變更前的警告天數:密碼過期後的寬限時間:賬號失效時間:保留欄位】

3、使用者組組態檔/etc/group

/etc/group檔案是使用者組的組態檔,內容包括使用者與使用者組,並且能顯示使用者歸屬哪個使用者組,因為一個使用者可以歸屬一個或多個不同的使用者組;同一使用者組的使用者之間具有相似的特性。如果某個使用者下有對系統管理有最重要的內容,最好讓使用者擁有獨立的使用者組,或者是把使用者下的檔案的許可權設定為完全私有。另外root使用者組一般不要輕易把普通使用者併入。

[root@localhost ~]# cat /etc/group
root:x:0:
xzm:x:1000:xzm
①欄位1:組賬戶名稱(組名)
②欄位2:密碼預留位置x(組密碼位):通常不需要設定該密碼,由於安全原因,該密碼被記在/etc/gshadow中,因此顯示為'x'。這類似/etc/shadow。
③欄位3:組賬戶GID號,使用者組ID
④欄位4:本組的成員使用者列表(使用者):加入這個組的所有使用者賬號

【組名:機密密碼:GID:使用者】

4、使用者組的影子檔案/etc/gshadow

組使用者資訊儲存在 /etc/group 檔案中,而將組使用者的密碼資訊儲存在 /etc/gshadow 檔案中。

[root@localhost ~]# cat /etc/gshadow
root:::

【組名:加密密碼:組管理員:組附加使用者列表】

三、對使用者/組進行增刪改

以下命令對Linux的使用者和使用者組進行管理。

1、useradd新增使用者

useradd命令一般用於新增使用者,該命令常見操作如下:
命令:useradd [選項] [使用者名稱]
選項:
-M 表示不建立家目錄
-s [shell]:表示手工指定使用者的shell環境,預設是/bin/bash
-u [UID]:表示手工指定使用者的UID
-d [家目錄]:手工指定使用者的家目錄
-c [使用者說明]:手工指定的使用者說明(使用者備註資訊)
-g [組名]:表示手工指定使用者的初始組/指定使用者的gid(需要指定存在的gid)
-G [組名]:表示指定使用者的附屬組(需要指定存在的gid)
-p 指定使用者的密碼(只有設定為密碼才能算是建立了真正可登入的使用者)(必須以密文的方式指定)
範例:
[root@localhost ~]# useradd gi
gi:x:1001:1001::/home/gi:/bin/bash——(系統預設建立同名家目錄/home/gi)
useradd test4 -u 2000 -M //手工指定UID為2000,並且不建立家目錄
useradd test6 -d /home/xxx //手工指定家目錄位置

[root@localhost ~]# useradd -u 550 -g lamp1 -G root -d /home/lamp1 -c "test user" -s /bin/bash lamp1
#在建立使用者lamp1的同時,指定了UID(550)、初始組(lamp1,已存在的)、附加組(root)、家目錄(/home/lamp1/)、使用者說明(test user)和使用者登入Shell(/bin/bash)
/etc/passwd:lamp1:x:550:502:test user:/home/lamp1:/bin/bash

[root@localhost ~]# grep "lamp1" /etc/passwd /etc/shadow /etc/group		#同時檢視三個檔案

2、userdel刪除使用者

userdel命令可以刪除使用者,後面直接跟使用者名稱可以直接刪除該使用者。但是,我們一般在刪除使用者時都會新增-r引數,表示連同該使用者的家目錄一起刪除。

命令:userdel [引數] [使用者名稱]
引數:-r	//刪除使用者的同時刪除使用者家目錄(僅root使用者可用)
注意:在刪除使用者的同時如果不刪除使用者的家目錄,那麼家目錄就會變成沒有屬主和屬組的目錄,也就是垃圾檔案。

3、usermod修改使用者

這裡一定要分清useradd命令和usermod命令的區別(兩者命令相似),前者用於新增使用者,當然,新增使用者時可以對使用者資訊進行客製化;後者針對與已存在的使用者,使用該命令可以修改它們的資訊。相比useradd命令,usermod命令還多出了幾個選項,即 -L 和 -U,作用分別與 passwd 命令的 -l 和-u 相同。

usermod命令常用於修改使用者的資訊,常用引數如下:
命令:usermod [選項] [使用者名稱]
選項:
-u [UID]:修改使用者的UID號
-c [使用者說明]:修改使用者的說明資訊
-d [家目錄]:表示重新指定使用者的家目錄
-g [組名]:表示重新指定使用者的(主)組
-G [組名]:表示給使用者新增附屬組
-L(Lock):表示鎖定使用者(臨時鎖定使用者),被鎖定使用者的密碼前出現「!」表示無法登入(與passwd相似)
-U(Unlock):表示解除對使用者的鎖定

#如果在鎖定使用者後使用passwd命令修改該鎖定使用者的口令,則該使用者會被自動解鎖。
#usermod命令給使用者增加附屬組如下所示:注意,在下述操作中,必須首先存在一個GID為1001的組。
[ root@localhost ~]#id pzz
uid=1000(pzz) gid=1000(pzz) groups=1000(pzz)
[ root@localhost ~]#usermod pzz -G 1001
[ root@localhost ~]# id pzz
uid=1000(pzz) gid=1000(pzz) groups=1000(pzz) , 1001 (linux)
[ root@localhost~]#

4、groupadd新增使用者組

命令:[root@localhost ~]# groupadd [選項] [組名]
選項:
-g [GID]:指定組 ID
-r:建立系統群組

範例:建立新群組
[root@localhost ~]# groupadd group1
#新增group1組
[root@localhost ~]# grep "group1" /etc/group
/etc/group:group1:x:502:
/etc/gshadow:group1:!::

5、groupmod修改使用者組

命令:[root@localhost ~]# groupmod [選項] [組名]
選項:
-g GID:修改組 ID
-n 新組名:修改組名

例子:
[root@localhost ~]# groupmod -n testgrp group1
#把組名group1修改為testgrp
[root@localhost ~]# grep "testgrp" /etc/group
testgrp:x:502:
#注意GID還是502,但是組名已經改變

6、groupdel刪除使用者組

命令:[root@localhost ~]# groupdel [組名]
例子:
[root@localhost ~]#grep "group1" /etc/group /etc/gshadow
/etc/group:group1:x:505:
/etc/gshadow:group1:!::
[root@localhost ~]#groupdel group1
[root@localhost ~]#grep "group1" /etc/group /etc/gshadow
[root@localhost ~]#
//使用 groupdel 命令刪除群組,其實就是刪除 /etc/gourp 檔案和 /etc/gshadow 檔案中有關目標群組的資料資訊。
//不能使用 groupdel 命令隨意刪除群組。此命令僅適用於刪除那些 "不是任何使用者初始組" 的群組。

四、其他命令

1、passwd

命令:passwd [選項] [使用者名稱]
選項:(僅root使用者可用)
	-S:查詢使用者密碼的密碼狀態。僅root使用者可用
	-l:暫時鎖定使用者(被鎖定的使用者不能使用密碼登入--密碼前加「!!」),但對root使用者無效,照樣可以登入。僅root使用者可用
	-u:解鎖使用者。僅root使用者可用
注意:
#普通使用者只能使用passwd命令修改自己的密碼,而不能修改其他使用者的密碼。普通使用者修改自己的密碼需要先輸入自己的舊密碼,只有舊密碼輸入正確才能輸入新密碼。不僅如此還不能輸入弱密碼(root使用者直接無視)。
#在查詢使用者密碼狀態時,如果沒有設定密碼則查詢時會有整個( Password locked . ),代表密碼屬於鎖定狀態。在Linux當中如果使用者沒有密碼則就屬於鎖定狀態。
#ctrl + d		//退出使用者
#passwd----不帶引數預設修改root賬戶的密碼,而且不需要輸入原密碼。
#passwd命令主要由於修改密碼。

2、gpasswd

為了避免系統管理員(root)太忙碌,無法及時管理群組,我們可以使用 gpasswd 命令給群組設定一個群組管理員,代替 root 完成將使用者加入或移出群組的操作。

命令:gpasswd [引數] [組名]
引數:
-a:新增使用者到組
-d:從組刪除使用者
-A:指定管理員
-M:指定組成員和-A的用途差不多
-r:刪除密碼
-R:限制使用者登入組,只有組中的成員才可以用newgrp加入該組

3、chage

chage命令專門針對/etc/shadow檔案的命令/操作。

除了 passwd -S 命令可以檢視使用者的密碼資訊外,還可以利用 chage 命令,它可以顯示更加詳細的使用者密碼資訊,並且和passwd命令一樣,提供了修改使用者密碼資訊的功能。

命令:chage [選項] [使用者名稱]
選項:
-l:列出使用者的詳細密碼狀態
-d 日期:修改/etc/shadow檔案中指定使用者密碼資訊(shadow[3]欄位),也就是最後一次修改密碼的日期,格式為YYYY-MM-DD;
-m 天數:修改密碼最短保留的天數,也就是/etc/shadow (shadow[4]欄位)
-M 天數:修改密碼的有效期,也就是/etc/shadow (shadow[5]欄位)
-W 天數:修改密碼到期前的警告天數,也就是/etc/shadow (shadow[6]欄位)
-I 天數:修改密碼過期後的寬限天數,也就是/etc/shadow (shadow[7]欄位)
-E 日期:修改賬號失效日期,格式為YYYY-MM-DD,也就是/etc/shadow (shadow[8]欄位)

//chage [使用者名稱] -d 1000 -M 89 -W 9 -m 2 //修改密碼最後一次更改日期為1000,有效期為89天,密碼最小使用天數為2天,過期前9天進行提醒
//chage命令除了修改密碼資訊的功能外,還可以強制使用者在第一次登入後,必須先修改密碼,並利用新密碼重新登陸系統,此使用者才能正常使用。【命令:[root@localhost ~]#chage -d 0 lamp //使用者登陸後就必須修改密碼(root強制使用者修改密碼)(lamp為新使用者)】

4、初始組與附屬組(使用者組)

使用者和組存在多對多的關係,且使用者必須擁有>=1的組。【使用者和組存在多對多的關係,但是不能存在使用者不加入組的使用者。】
組(作用):實現/優化許可權的賦予。
//初始組(主組):一個使用者可以不存在附屬組,但必須有初始組
//附屬組:>=0
groupadd [組名]	//建立空組
groupdel [組名]	//刪除組
usermod [組名] -G GID 		//將使用者新增到附屬組(必須跟上完整的id,不能有遺漏)
gpasswd -a [使用者] [組名] 		//把使用者新增到附屬組
gpasswd -d [使用者] [組名] 		//把使用者從附屬組中刪除
//當一個使用者只有一個組的話,那麼這個組就是這個使用者的初始組。
//附屬組可以刪除,即使組內有使用者。
//使用者主組不能刪除,一般刪除使用者會同時刪除使用者主組。
主組:
也叫初始組,是使用者登入系統時的組,規則如下:
建立新使用者時,若未明確指定該使用者所屬的主組,會預設建立一個與使用者名稱相同的組,作為該使用者的主組
使用者建立檔案時,檔案的所屬許可權組就是當前使用者的主組
使用useradd命令時用-g引數可以指定主組,則不會預設建立同名的主組
使用者有且只能所屬一個主組
使用者的主組不能被刪除
使用者不能直接被移出主組,但可以更換主組
使用者被刪除時它的主組若沒有其他所屬使用者,則會自動刪除該主組

附加組/附屬組:
登入後可切換的其他組,規則如下:
使用useradd命令時用-G引數可以指定附加組
使用者可以所屬零個或多個附加組
使用者的附加組和主組可相同
附加組可以直接被刪除而無需關心是否所屬於使用者
附加組可以新增和移除任意個所屬使用者
使用者被刪除時所屬附屬組不會受影響

5、id

Linux id命令用於顯示使用者的ID,以及所屬群組的ID。id會顯示使用者以及所屬群組的實際與有效ID。若兩個ID相同,則僅顯示實際ID。若僅指定使用者名稱稱,則顯示目前使用者的ID。

id [引數] [使用者名稱]
引數:(不帶引數也行)
-g或--group  顯示使用者所屬群組的ID。
-G或--groups  顯示使用者所屬附加群組的ID。
-n或--name  顯示使用者,所屬群組或附加群組的名稱。
-r或--real  顯示實際ID。
-u或--user  顯示使用者ID。
-help  顯示幫助。
-version  顯示版本資訊。
範例:
[root@localhost ~]# usermod -G root lamp
#把使用者lamp加入root組
[root@localhost ~]# id lamp
uid=501(lamp) gid=501(lamp) groups=501(lamp),0(root)
#大家發現root組中加入了lamp使用者的附加組資訊

6、su

Linux su(英文全拼:switch user)命令用於變更為其他使用者的身份,除 root 外,需要鍵入該使用者的密碼。使用許可權:所有使用者。

su [選項] [使用者名稱]
選項:
- 只使用‘-’代表連使用者的環境變數一起切換
-c 僅執行一次命令,而不切換使用者身份
//切換不同使用者,會載入不同使用者的shell

su 和 su - 的區別

-選項表示在切換使用者身份的同時,連當前使用的環境變數也切換成指定使用者的。我們知道,環境變數是用來定義作業系統環境的,因此如果系統環境沒有隨使用者身份切換,很多命令無法正確執行。即有 - 選項,切換使用者身份更徹底;反之,只切換了一部分,這會導致某些命令執行出現問題或錯誤(例如無法使用 service 命令)。

7、whoami與who am i

whoami 命令和 who am i 命令是不同的 2 個命令,前者用來列印當前執行操作的使用者名稱,後者則用來列印登陸當前Linux系統的使用者名稱。

範例:
[Cyuyan@localhost ~]$ whoami
Cyuyan
[Cyuyan@localhost ~]$ who am i
Cyuyan    pts/0    2017-10-09 15:30 (:0.0)
在此基礎上,使用 su 命令切換到 root 使用者下,再執行一遍上面的命令:
[Cyuyan@localhost ~] su - root
[root@localhost ~]$ whoami
root
[root@localhost ~]$ who am i
Cyuyan    pts/0    2017-10-09 15:30 (:0.0)
//執行 whoami 命令,等同於執行 id -un 命令;執行 who am i 命令,等同於執行 who -m 命令。

所謂實際使用者,指的是登陸 Linux 系統時所使用的使用者,因此在整個登陸對談過程中,實際使用者是不會發生變化的;而有效使用者,指的是當前執行操作的使用者,也就是說真正決定許可權高低的使用者,這個是能夠利用 su 或者 sudo 命令進行任意切換的。一般情況下,實際使用者和有效使用者是相同的,如果出現使用者身份切換的情況,它們會出現差異。

11、Linux檔案與目錄許可權

所謂許可權管理,其實就是指對不同的使用者,設定不同的檔案存取許可權,包括對檔案的讀、寫、刪除等,在 Linux 系統中,每個使用者都具有不同的許可權,拿非 root 使用者來說,它們只能在自己的主目錄下才具有寫許可權,而在主目錄之外,只具有存取和讀許可權。

一、Linux 檔案基本屬性

Linux 系統是一種典型的多使用者系統,不同的使用者處於不同的地位,擁有不同的許可權。為了保護系統的安全性,Linux 系統對不同的使用者存取同一檔案(包括目錄檔案)的許可權做了不同的規定。

1、檔案介紹

隨便檢視一個檔案,命令如下(空格分隔):

[root@localhost ~]# ll
drwxr-xr-x. 2 root root    6 Sep 28 20:28 Desktop
-rw-r--r--. 1 root root 2076 Sep 28 20:05 initial-setup-ks.cfg
①第一部分:第一個欄位【d】
範例中,Desktop檔案的第一個字元用d表示。d在Linux中代表該檔案是一個目錄檔案。
當第一個欄位為d則是目錄
當第一個欄位為-則是檔案
當第一個欄位為l則表示為連結檔案(link file)
當第一個欄位為b則表示為裝置檔案裡面的可供儲存的介面裝置(可隨機存取裝置)
當第一個欄位為c則表示為裝置檔案裡面的串列埠裝置,例如鍵盤、滑鼠(一次性讀取裝置)
當第一個欄位為s則表示為通訊端
--------------------------------------------------------------------------------------------------------
①第一部分:第二個欄位到.為止【rwxr-xr-x.】
這九個字元以三個為一組,且均為rwx的三個引數的組合。其中,r代表可讀(read)、w代表可寫(write)、x代表可執行(execute)。要注意的是,這三個許可權的位置不會改變,如果沒有許可權,就會出現減號-代替。

每個檔案的屬性都由左邊前十個字元來確定:
1、第0位確定檔案型別;2、第1-3位確定屬主(該檔案的所有者)擁有該檔案的許可權;3、第4-6位確定屬組(所有者的同組使用者)擁有該檔案的許可權;4、第7-9位確定其他使用者擁有該檔案的許可權。	其中,第1、4、7位表示讀許可權,如果用r字元表示,則有讀許可權,如果用 - 字元表示,則沒有讀許可權;第 2、5、8 位表示寫許可權,如果用 w 字元表示,則有寫許可權,如果用 - 字元表示沒有寫許可權;第 3、6、9 位表示可執行許可權,如果用 x 字元表示,則有執行許可權,如果用 - 字元表示,則沒有執行許可權。

Linux的許可權不是很細緻,只有RWX三種:
r(Read,讀取):對檔案而言,具有讀取檔案內容的許可權;對目錄來說,具有瀏覽目錄的許可權。
w(Write,寫入):對檔案而言,具有新增、修改、刪除檔案內容的許可權;對目錄來說,具有新建、刪除、修改、移動目錄內檔案的許可權。
x(Execute,執行):對檔案而言,具有執行檔案的許可權;對目錄了來說該使用者具有進入目錄的許可權。
注意:
1、目錄的唯讀存取不允許使用cd進入目錄,必須要有執行的許可權才能進入。
2、只有執行許可權只能進入目錄,不能看到目錄下的內容,要想看到目錄下的檔名和目錄名,需要可讀許可權。
3、一個檔案能不能被刪除,主要看該檔案所在的目錄對使用者是否具有寫許可權,如果目錄對使用者沒有寫許可權,則該目錄下的所有檔案都不能被刪除,檔案所有者除外。
4、目錄的w位不設定,即使你擁有目錄中某檔案的w許可權也不能寫該檔案。
5、對目錄的操作都算執行。

數位設定法
模式  數位 
rwx   7 
rw-   6 
r-x   5 
r--   4 
-wx   3 
-w-   2 
--x   1 
---   0
優點:簡單粗暴
缺點:力度不夠

文字設定法
u :屬主
g :屬組
o :其他使用者
a :所有使用者
優點:力度較小
缺點:麻煩

算數運運算元:+、-、=
②第二部分:連線數【2】
③第三部分:屬主【root】
④第四部分:屬組【root】
⑤第五部分:檔案大小【6】
⑥-⑧第六到八部分:日期(月/日/點)【Sep 28 20:28】
⑨第九部分:檔名【Desktop】

2、Linux檔案屬主和屬組

對於檔案來說,它都有一個特定的所有者,也就是對該檔案具有所有權的使用者。同時,在Linux系統中,使用者是按組分類的,一個使用者屬於一個或多個組。檔案所有者以外的使用者又可以分為檔案所屬組的同組使用者和其他使用者。因此,Linux系統按檔案所有者、檔案所有者同組使用者和其他使用者來規定了不同的檔案存取許可權。

[root@www /]# ls -l
total 64
drwxr-xr-x 2 root  root  4096 Feb 15 14:46 cron
drwxr-xr-x 3 mysql mysql 4096 Apr 21  2014 mysql
……

在以上範例中,mysql檔案是一個目錄檔案,屬主和屬組都為mysql,屬主有可讀、可寫、可執行的許可權;與屬主同組的其他使用者有可讀和可執行的許可權;其他使用者也有可讀和可執行的許可權。對於root使用者來說,一般情況下,檔案的許可權對其不起作用。

二、更改檔案屬性

在 Linux 中我們通常使用以下兩個命令來修改檔案或目錄的所屬使用者與許可權:

  • chown (change owner) : 修改所屬使用者與組。
  • chmod (change mode) : 修改使用者的許可權。

1、chmod命令

1、chmod命令使用數位修改檔案許可權

拿rwxrw-r-x來說,所有者、所屬組和其他人分別對應的許可權值為:
所有者 = rwx = 4+2+1 = 7
所屬組 = rw- = 4+2 = 6
其他人 = r-x = 4+1 = 5
所以,此許可權對應的許可權值就是765。
使用數位修改檔案許可權的chmod命令基本格式為:
命令:【[root@localhost ~]# chmod [-R] [許可權值] [檔名/目錄名]】
引數:-R(注意是大寫)選項表示連同子目錄中的所有檔案,也都修改設定的許可權。(可不加)
範例:
[root@localhost ~]# ls -al .bashrc
-rw-r--r--. 1 root root 176 Sep 22 2004 .bashrc
[root@localhost ~]# chmod 777 .bashrc
[root@localhost ~]# ls -al .bashrc
-rwxrwxrwx. 1 root root 176 Sep 22 2004 .bashrc

2、chmod命令使用字母修改檔案許可權

既然檔案的基本許可權就是3種使用者身份(所有者、所屬組和其他人)搭配3種許可權(rwx),chmod 命令中用 u、g、o 別代表3種身份,還用a表示全部的身份(all 的縮寫)。另外,chmod命令仍使用r、w、x分別表示讀、寫、執行許可權。

範例:
設定.bashrc 檔案的許可權為 rwxr-xr-x,則可執行如下命令:
[root@localhost ~]# chmod u=rwx,go=rx .bashrc
[root@localhost ~]# ls -al .bashrc
-rwxr-xr-x. 1 root root 176 Sep 22 2004 .bashrc

2、chown命令

chown 命令,可以認為是 "change owner" 的縮寫,主要用於修改檔案(或目錄)的所有者/屬主,除此之外,這個命令也可以修改檔案(或目錄)的所屬組。

Linux 系統中,使用者等級許可權的劃分是非常清楚的,root使用者擁有最高許可權,可以修改任何檔案的許可權,而普通使用者只能修改自己檔案的許可權(所有者是自己的檔案)。

需要修改所有者/屬主:

當只需要修改所有者/屬主時,可使用如下chown命令的基本格式:
命令:[root@localhost ~]# chown [-R] [所有者] [檔案或目錄]
引數:-R(注意大寫)選項表示連同子目錄中的所有檔案,都更改所有者。(可不加)

範例:
其實,修改檔案的所有者,更多時候是為了得到更高的許可權,舉一個範例:
[root@localhost ~]# touch file
#由root使用者建立file檔案
[root@localhost ~]# ll file
-rw-r--r--. 1 root root 0 Apr 17 05:12 file
#檔案的所有者是root,普通使用者user對這個檔案擁有唯讀許可權
[root@localhost ~]# chown user file
#修改檔案的所有者
[root@localhost ~]# ll file
-rw-r--r--. 1 user root 0 Apr 17 05:12 file
#所有者變成了user使用者,這時user使用者對這個檔案就擁有了讀、寫許可權
//可以看到,通過修改 file檔案的所有者,user使用者從其他人身份(只對此檔案有讀取許可權)轉變成了所有者身份,對此檔案擁有讀和寫許可權。

同時更改所有者和所屬組:

如果需要同時更改所有者和所屬組,chown命令的基本格式為:
命令:[root@localhost ~]# chown [-R] [所有者:所屬組] [檔案或目錄]
引數:-R(注意大寫)選項表示連同子目錄中的所有檔案,都更改所有者。(可不加)
範例:
[root@localhost ~]# chown user:group file
[root@localhost ~]# ll file
-rw-r--r--. 1 user group 0 Apr 17 05:12 file

注意:
1、在chown命令中,所有者和所屬組中間也可以使用點(.),但會產生一個問題,如果使用者在設定賬號時加入了小數點(例如zhangsan.temp),就會造成系統誤判。因此,建議大家使用冒號連線所有者和所屬組。
2、當然,chown命令也支援單純的修改檔案或目錄的所屬組,例如chown:group install.log就表示修改install.log檔案的所屬組,但修改所屬組通常使用chgrp命令,因此並不推薦大家使用chown命令。
3、另外需要注意的一點是,使用 chown 命令修改檔案或目錄的所有者(或所屬者)時,要保證使用者使用者(或使用者組)存在,否則該命令無法正確執行,會提示 "invalid user" 或者 "invaild group"。

3、chgrp命令

chgrp命令用於修改檔案(或目錄)的所屬組。可以將chgrp理解為是"change group"的縮寫。
chgrp命令的基本格式為:
命令:[root@localhost ~]# chgrp [-R] 所屬組 檔名(目錄名)
引數:-R(注意是大寫)選項長作用於更改目錄的所屬組,表示更改連同子目錄中所有檔案的所屬組資訊。
範例:當以 root身份登入 Linux系統時,主目錄中會存在一個名為install.log的檔案,我們可以使用如下方法修改此檔案的所屬組:
[root@localhost ~]# groupadd group1
#新建用於測試的群組 group1
[root@localhost ~]# chgrp group1 install.log
#修改install.log檔案的所屬組為group1
[root@localhost ~]# ll install.log
-rw-r--r--. 1 root group1 78495 Nov 17 05:54 install.log
#修改生效
[root@localhost ~]# chgrp testgroup install.log
chgrp: invaild group name 'testgroup'
可以看到,在具有 group1 群組的前提下,我們成功修改了 install.log 檔案的所屬組,但我們再次試圖將所屬組修改為 testgroup 時,命令執行失敗,就是因為系統的 /etc/group 檔案中,沒有 testgroup 群組。
//因此使用chgrp命令需要注意的一點是,要被改變的群組名必須是真實存在的,否則命令無法正確執行,會提示"invaild group name"。

4、chattr命令

管理 Linux 系統中的檔案和目錄,除了可以設定普通許可權和特殊許可權外,還可以利用檔案和目錄具有的一些隱藏屬性。

可以實現對root使用者的限制。

chattr命令,專門用來修改檔案或目錄的隱藏屬性,只有root使用者可以使用。該命令的基本格式為:
命令:[root@localhost ~]# chattr [+-=] [引數] [檔案/目錄名]
引數:
i:如果對檔案設定i屬性,那麼不允許對檔案進行刪除、改名,也不能新增和修改資料;如果對目錄設定i屬性,那麼只能修改目錄下檔案中的資料,但不允許建立和刪除檔案。(防止系統中某個關鍵檔案被篡改)
a:如果對檔案設定a屬性,那麼只能在檔案中増加資料,但是不能刪除和修改資料;如果對目錄設定a屬性,那麼只允許在目錄中建立和修改檔案,但是不允許刪除檔案。(適用於各種紀錄檔檔案)
u:設定此屬性的檔案或目錄,在刪除時,其內容會被儲存,以保證後期能夠恢復,常用來防止意外刪除檔案或目錄。
s:和u相反,刪除檔案或目錄時,會被徹底刪除(直接從硬碟上刪除,然後用0填充所佔用的區域),不可恢復。(保密性刪除檔案或目錄)
S:即時更新檔案或目錄。
b:不更新檔案或目錄的最後存取時間。
c:將檔案或目錄壓縮後存放。
d:將檔案或目錄排除在傾倒操作之外。
+:表示給檔案或目錄新增屬性;-:表示移除檔案或目錄擁有的某些屬性;=:表示給檔案或目錄設定一些屬性。
範例:
【例1】給檔案賦予i屬性。
[root@localhost ~]# touch ftest	#建立測試檔案
[root@localhost ~]# chattr +i ftest
[root@localhost ~]# rm -rf ftest
rm:cannot remove 'ftest':Operation not permitted	#無法刪除"ftesr",操作不允許	#被賦予i屬性後,root不能刪除
[root@localhost ~]# echo 111>>ftest
bash:ftest:Permission denied	#許可權不夠,不能修改檔案中的資料
//可以看到,設定有i屬性的檔案,即便是root使用者,也無法刪除和修改資料。

【例2】為目錄賦予i屬性。
[root@localhost ~]# mkdir dtest	#建立測試目錄
[root@localhost dtest]# touch dtest/abc	#再建立一個測試檔案abc
[root@localhost ~]# chattr +i dtest	#給目錄賦予i屬性
[root@localhost ~]# cd dtest
[root@localhost dtest]# touch bed
touch: cannot touch 'bed':Permission denied	#無法建立"bcd",許可權不夠,dtest目錄不能新建檔案
[root@localhost dtest]# echo 11>>abc
[root@localhost dtest]# cat abc
11	#可以修改檔案內容
[root@localhost dtest]# rm -rf abc
rm: cannot remove 'abc': Permission denied	#無法刪除"abc",許可權不夠
//一旦給目錄設定i屬性,即使是root使用者,也無法在目錄內部新建或刪除檔案,但可以修改檔案內容。
//給設定有i屬性的檔案刪除此屬性也很簡單,只需將 chattr 命令中 + 改為 - 即可。

注意:通常情況下,不要使用 chattr 命令修改 /、/dev/、/tmp/、/var/ 等目錄的隱藏屬性,很容易導致系統無法啟動。另外,chatrr 命令常與lsattr命令合用,前者修改檔案或目錄的隱藏屬性,後者用於檢視是否修改成功。

5、lsattr命令

使用 chattr 命令組態檔或目錄的隱藏屬性後,可以使用 lsattr 命令檢視。

lsattr 命令,用於顯示檔案或目錄的隱藏屬性,其基本格式如下:
命令:[root@localhost ~]# lsattr [引數] [檔案/目錄名]
引數:
-a:後面不帶檔案或目錄名,表示顯示所有檔案和目錄(包括隱藏檔案和目錄)。
-d:如果目標是目錄,只會列出目錄本身的隱藏屬性,而不會列出所含檔案或子目錄的隱藏屬性資訊。
-R:和 -d 恰好相反,作用於目錄時,會連同子目錄的隱藏資訊資料也一併顯示出來。
範例:
【例1】
[root@localhost ~]#lsattr -a
-----------e- ./.
------------- ./..
-----------e- ./.gconfd
-----------e- ./.bashrc
...
【例2】
[root@localhost ~]#lsattr -d /back/log
-----a------e- /back/log
#檢視/back/log目錄,發現其擁有a和e屬性
【例3】
[root@localhost ~]# touch attrtest
-----------e- attrtest
[root@localhost ~]# chattr +aij attrtest
[root@localhost ~]# lsattr attrtest
----ia---j-e- attrtest
//不使用任何選項,lsattr僅用於顯示檔案的隱藏資訊,不適用於目錄。

三、其他

1、許可權掩碼

[root@localhost ~]# cat /etc/profile	【/etc/profile檔案】
作用域:全域性(針對所有使用者),每個使用者登入時都需要載入這個檔案。
//在整個/etc/profile檔案當中有一個叫umask 022(針對所有使用者)的東西,整個umask決定了檔案建立最初的檔案許可權。

[root@localhost ~]# cat /etc/bashrc 	【/etc/bashrc檔案】
作用域:針對當前使用者

//對於目錄來說,滿許可權是777,然後用0777-0022=0655(目錄許可權)(777前面的0可以忽略)
//對於檔案來說,滿許可權是666,然後用0666-0022=0644(檔案許可權)(666前面的0可以忽略)

環境變數檔案:/etc/profile檔案和/etc/bashrc檔案。

2、特殊許可權

Linux中的特殊許可權一共包含了一下三種:

SUID(屬主特殊許可權)

SGID(屬組特殊許可權)

SBIT(粘滯位)

①SBIT(粘滯位)

粘滯位許可權都是針對其他⽤戶(other)設定。

粘滯位許可權只能針對目錄設定,對於檔案無效。(?)

作用:允許各使用者在目錄中任意寫入、刪除資料,但是禁止隨意刪除其他使用者的資料。

粘滯鍵後門詳述。(略)粘滯鍵與粘滯位是兩個不同的概念。

	粘滯位(Stickybit),又稱粘著位,是Unix檔案系統許可權的一個旗標。最常見的用法在目錄上設定粘滯位,也只能針對⽬錄設定,對於⽂件⽆效。則設定了粘滯位後,只有目錄內檔案的所有者或者root才可以刪除或移動該檔案。如果不為目錄設定粘滯位,任何具有該目錄寫和執行許可權的使用者都可以刪除和移動其中的檔案。實際應用中,粘滯位一般用於/tmp目錄,以防止普通使用者刪除或移動其他使用者的檔案。
  在Linux系統中⽐較典型的例⼦就是「/tmp」、 「/var/tmp」⽬錄。這兩個⽬錄作為Linux系統的臨時⽂件夾,許可權為「rwxrwxrwx」,即允許任意⽤戶、任意程式在該⽬錄中進⾏建立、刪除、移動⽂件或⼦⽬錄等操作。然⽽試想⼀下,若任意⼀個普通⽤戶都能夠刪除系統服務運⾏中使⽤的臨時⽂件,將造成很大的後果。
	粘滯位許可權便是針對此種情況設定,當⽬錄被設定了粘滯位許可權以後,即便⽤戶對該⽬錄有寫⼊許可權,也不能刪除該⽬錄中其他⽤戶的⽂件資料,⽽是隻有該⽂件的所有者和root⽤戶才有權將其刪除。設定了粘滯位之後,正好可以保持⼀種動態的平衡:**允許各使用者在目錄中任意寫入、刪除資料,但是禁止隨意刪除其他使用者的資料。**
命令:chmod o+t/o-t [檔名]		//用於新增/刪除粘滯位許可權
//需要注意的是,粘滯位許可權只能針對⽬錄設定,對於⽂件⽆效。
//設定了粘滯位許可權的⽬錄,使⽤ls命令檢視其屬性時,其他⽤戶許可權處的「x」將變為「t」。
//如果當前位置有普通許可權,則特殊許可權位置為小寫t;如果當前位置沒有許可權(普通許可權),則特殊許可權位置為大寫T。(用於區分該檔案有沒有可執行許可權)
範例:
例如,檢視/tmp、/var/tmp⽬錄本⾝的許可權,確認存在「t」標記。(以下兩目錄本身就已經設定了o+t許可權)
[root@localhost~]# ll -d /tmp
d rwxrwxrwt. 20 root root 4096 Jun 27 09:25/tmp
[ root@localhost ~]# ll -d /var/tmp
drwxrwxrwt. 2 root root 4096 Jun 26 12:08/var/tmp
粘滯位許可權都是針對其他⽤戶(other)設定,使⽤chmod命令設定⽬錄許可權時,「o+t」、 「o-t」許可權模式可分別⽤於新增、移除粘滯位許可權。
例如,為/test⽬錄設定粘滯位許可權。
[root@localhost ~]# ll -d ./test
d rwxr-xr-x. 2 root root 4096 Jun 27 09:35 ./test
[ rootalocalhost ~]# chmod o+t ./test
[root@localhost~]#ll -d ./test
drwxr-xr-t 2 root root 4096 Jun 27 09:35./test
[ hxy@localhost ~]$rm /root/test/file
rm: cannot remove `/root/test/file ' : Permission denied  #此時普通⽤戶hxy便⽆法刪除/root/test/file1⽂件了。
//粘滯位許可權在生產環境中也被廣泛應用,當需要為使用者提供一個開放目錄而又不希望造成管理混亂時,通過為目錄設定粘滯位許可權便可以解決問題。
②SUID(屬主特殊許可權)

u+s/u-s針對可執行檔案,誰執行,誰就具有該檔案的擁有者許可權。

範例:
[root@localhost ~]# ll  -d  /etc/shadow
----------. 1 root root 2752 Jul 14 19:44 /etc/shadow #檢視使用者密碼存放的檔案我們可以看到是沒有任何許可權的
//但是當我使用者在更新或者密碼的時候,是需要更新shadow的內容但是又沒有許可權寫入,所以這時候SUID便有它的用處了。
[root@localhost ~]# which  passwd		//which命令用於查詢檔案
/usr/bin/passwd
[root@localhost ~]# chmod u+s file
[root@localhost ~]# ll -d /usr/bin/passwd 
-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /usr/bin/passwd	#此時能夠看到屬主的為許可權為rws
[oldxie@localhost ~]$ ll  -d  /usr/bin/passwd  	#切換到普通使用者的身份檢視passwd這個指令的屬性屬主位也有SUID的許可權
-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /usr/bin/passwd

[root@localhost ~]# chmod u-s file	#刪除suid
[root@localhost ~]# ll /usr/bin/passwd 
-rwxr-xr-x. 1 root root 27832 Jun 10  2014 /usr/bin/passwd
[root@localhost ~]# su - xxx	#當我們將SUID的許可權取消後切換使用者執行paswd更改密碼是沒有許可權的。
Last login: Thu Jul 15 17:20:44 CST 2021 on pts/0
i come to  profile.d
i come  to  /etc/profile
i come to /etc/bashrc
[xxx@localhost ~]$ ll  /usr/bin/passwd ; ll  /etc/shadow
-rwxr-xr-x. 1 root root 27832 Jun 10  2014 /usr/bin/passwd	#重點
----------. 1 root root 2970 Jul 15 17:21 /etc/shadow		#重點
//此時你再去passwd更該密碼它會一直提示passwd is not match (密碼不匹配) 不能夠修改密碼
重新加入suid:  chmod u+s  /usr/bin/passwd
或者  chmod   4755 /usr/bin/passwd  
就能夠更改密碼。
③SGID(屬組特殊許可權)

sgid (g+s/g-s)針對目錄,在該目錄建立的檔案,屬組預設繼承父目錄屬組。

設定二進位制可執行檔案命令在執行的過程中會以命令的屬組身份執行該命令。

設定在目錄上,這時候在該目錄下新建的檔案/目錄自動繼承父級目錄的屬組。

[root@localhost ~]# groupadd  example 
[root@localhost ~]# useradd   ex1 -G  example  
[root@localhost ~]# useradd  ex2 -G  example 
[root@localhost ~]# mkdir  -p  /data/code 
[root@localhost ~]# chown    .example /data/code/
[root@localhost ~]# chmod   2770   /data/code/
[root@localhost ~]# echo  '1234' > /data/code/test.log
[root@localhost ~]# ll  /data/code/test.log 
-rw-r--r--. 1 root example 5 Jul 15 17:43 /data/code/test.log
[root@localhost ~]# chmod   g-s  /data/code/
[root@localhost ~]# echo  '123'> /data/code/test2.log
[root@localhost ~]# ll  /data/code/test2.log 
-rw-r--r--. 1 root root 4 Jul 15 17:45 /data/code/test2.log
//上面的範例可以看出目錄在有SGID和沒有SGID的情況下下新建檔案屬組繼承的不同。

3、find命令

Linux find 命令用來在指定目錄下查詢檔案。任何位於引數之前的字串都將被視為欲查詢的目錄名。如果使用該命令時,不設定任何引數,則 find 命令將在當前目錄下查詢子目錄與檔案。並且將查詢到的子目錄和檔案全部進行顯示。

[root@localhost ~ ] # find [搜尋路徑] [選項] [搜尋內容]
選項:(常用)
-name:按照檔名搜尋
-iname:按照檔名搜尋,不區分檔名大小寫
-inum:按照inode號搜尋
彙總:
-mount, -xdev:只檢查和指定目錄在同一個檔案系統下的檔案,避免列出其它檔案系統中的檔案
-amin n :在過去n分鐘內被讀取過
-anewer file : 比檔案 file 更晚被讀取過的檔案
-atime n :在過去n天內被讀取過的檔案
-cmin n :在過去n分鐘內被修改過
-cnewer file :比檔案 file 更新的檔案
-ctime n :在過去n天內被修改過的檔案
-empty:空的檔案-gid n or -group name : gid是n或是 group名稱是name
-ipath p, -path p:路徑名稱符合p的檔案,ipath 會忽略大小寫
-name name, -iname name :檔名稱符合name 的檔案。iname 會忽略大小寫
-size n :檔案大小是n單位,b代表512位元元組的區塊,c表示字元數,k表示kilo bytes,w是二個位元組。
-type c:檔案型別是c的檔案。
範例:
#1.find命令基本使用
[root@192 ~]# find . -name abcde
./abcde
提示:搜尋位置越大,消耗系統資源越多。
在生產伺服器上搜尋的時候,儘量不在根目錄下搜尋,把搜尋的範圍儘量控制在最小。
 
#2.-iname
[root@192 ~]# find . -iname abcde
./ABCDE
./abcde
提示:i表示忽略的意思,就是忽略大小寫。
 
#3.-inum  (這兩個是一對命令,記憶比較方便。)
之前我們通過檔名可以檢視到檔案的i節點號
[root@192 ~]# ls -i abcde 
1043285 abcde
這裡通過find命令的-inum選項可以實現,通過i節點號檢視檔案的名字。
[root@192 ~]# find . -inum 1043285
./abcde

#4.查詢系統中所有檔案長度為 0 的普通檔案,並列出它們的完整路徑:
# find / -type f -size 0 -exec ls -l {} \;

#5.查詢當前目錄中檔案屬主具有讀、寫許可權,並且檔案所屬組的使用者和其他使用者具有讀許可權的檔案:
# find . -type f -perm 644 -exec ls -l {} \;

4、管道命令符使用

管道命令符「|」的作用是將前一個命令的標準輸出作為後一個命令的標準輸入,格式為「命令A | 命令B」。

【管道符:將前面命令字的結果作為後面命令字的執行環境。】

#在文字a.txt中尋找文字123所在段落。
cat a.txt | grep "123"

注:
1、管道命令只處理前一個命令正確輸出,不處理錯誤輸出;
2、管道命令右邊命令,必須能夠接收標準輸入流命令才行;

5、Linux中顏色的含義

[整理]linux中顏色的含義
藍色(Blue): Directory  目錄
綠色(Green): Executable or recognized data file  可執行檔案,可執行的程式/檔案
天藍(Sky Blue): Symbolic link file  連結檔案,主要是使用ln命令建立的檔案
紅色(Red): Archive file  壓縮檔案或者包檔案
黃字黑底(Yellow with black background): Device 裝置檔案
粉紅色(Pink): Graphic image file 影象圖片檔案
紅字黑底(Red with black background): Broken link 無效連結

12、Linux中shell指令碼

Shell是一種指令碼語言,那麼,就必須有直譯器來執行這些指令碼,常見的指令碼直譯器有:
bash:是Linux標準預設的shell。bash由Brian Fox和Chet Ramey共同完成,是BourneAgain Shell的縮寫,內部命令一共有40個。
sh:由Steve Bourne開發,是Bourne Shell的縮寫,sh 是Unix 標準預設的shell。
另外還有:ash、csh、ksh等。

一、基礎知識

1、第一個shell指令碼程式

[root@localhost Desktop]# vim 第一個shell指令碼程式.sh
#!/bin/bash
echo "Hello, world!"
[root@localhost Desktop]# bash 第一個shell指令碼程式.sh
Hello, world!
//上面中的#!是一種約定標記, 它可以告訴系統這個指令碼需要什麼樣的直譯器來執行.
//sh裡面沒有多行註釋,只能每一行加一個#號作為註釋符。

2、shell變數定義

在bash shell中,每一個變數的值都是字串,當然也可以用declare關鍵字顯式定義變數的型別,在賦值的時候等號兩邊不能有空格,如:str=1 ,str=‘1’ ,str=「1」,變數名必須有字母、下劃線、數位組成,開頭必須字母或者下劃線,不能用shell。變數型別如下:
①區域性變數:shell也有自定義函數,函數裡面的變數為區域性變數,但是它也是相當於全域性變數,函數中的變數,在函數外呼叫也是可以的,如果要僅限函數使用,需要在函數變數前加個關鍵字:local。
②全域性變數:每開啟一個終端就是一個shell對談,在這個shell對談(終端)定義的變數就是全域性變數,它在這個shell對談有效,當你開啟另一個終端就是另一個shell對談,這個變數在另一個終端就失效了。
③環境變數:在全域性變數前加export,如:export a=1那麼這個變數就是環境變數了。建立這個變數的shell成為父shell,這個shell中,在建立一個shell叫做子shell,環境變數可以由父shell往下一級一級傳,而不能逆轉往上傳遞。當shell對談銷燬時,這個環境變數也會隨之銷燬。想要永久儲存就得環境變數寫到啟動檔案中去。
定義變數的注意點:
1,變數名和等號之間不能有空格;
2,首個字元必須為字母(a-z,A-Z)。
3,中間不能有空格,可以使用下劃線(_)。
4,不能使用標點符號。
5,不能使用bash裡的關鍵字(可用help命令檢視保留關鍵字)。
總結:變數可以是字母、數位、下劃線,但首字元不能是數位且不能是關鍵詞(for、while、!……)
使用變數:只需要在一個定義過的變數前面加上美元符號 $ 就可以了, 另外,對於變數的{} 是可以選擇的, 它的目的為幫助直譯器識別變數的邊界。
範例:【shell變數定義.sh】
①//使用shell變數在變數前面加一個$,而標準的是 &{},目的是在一長串字元中可以識別出這個變數,而不會引起誤會,如下:
#!/bin/bash
#參照shell變數
str="abc"
echo "$str"
echo "the str vaile is: $str1" 
#後面增加一個1,就不能正確的識別變數
echo "the str vaile is: ${str}1"
#所以我們參照變數,最好統一用 ${} 的形式
結果:
abc
the str vaile is: 
the str vaile is: abc1

3、shell變數的賦值、修改、刪除

shell變數的賦值

範例:【shell變數的賦值.sh】
①//可以從結果看出不加引號和加雙引號的結果是相同的,而單引號是原樣輸出變數後面賦值的內容。
#!/bin/bash
#變數的賦值
n=1
v1=${n}
v2='${n}'
v3="${n}"
echo "${v1}"
echo "${v2}"
echo "${v3}"
結果:
1
${n}
1

shell變數的修改、刪除

範例:【shell變數的修改、刪除.sh】
#!/bin/bash
#①變數值的修改
a=1
echo "a: ${a}"
a=2
echo "a: ${a}"
#②唯讀變數是不可以修改的,在變數前加readonly,就是唯讀變數
c=1
echo "c: ${c}"
readonly c
c=2
echo "c: ${c}"
#③只要在變數前面加一個unset,如:unset a就可以刪除變數
unset a
echo "a: ${a}"

結果:
a: 1
a: 2
c: 1
shell變數的修改、刪除.sh: line 12: c: readonly variable
c: 1
a: 

4、shell特殊變數

$0:當前指令碼的檔名或者直譯器。
$n(n≥1):傳遞給指令碼或函數的引數。n 是一個數位,表示第幾個引數。例如,第一個引數是 $1,第二個引數是 $2。
$#:傳遞給指令碼或函數的引數個數。
$*:傳遞給指令碼或函數的所有引數。
$@:傳遞給指令碼或函數的所有引數。當被雙引號" "包含時,$@與∗稍有不同。*的所有引數是一個資料,而$@一個引數就是一份資料。
$?:上個命令的退出狀態,或函數的返回值。
$$:當前Shell程序 ID。對於Shell指令碼,就是這些指令碼所在的程序ID。
範例:【shell特殊變數.sh】
#!/bin/bash
#shell特殊變數
#$n: $0表示本指令碼,$1表示輸入的第一個引數:11,$2表示輸入的第一個引數:22    
echo "$ 0: $0"
echo "a: $1"
echo "b: $2"
#$*: 輸入的引數 11 22
echo "$ *: $*"
#$@: 輸入的引數 11 22
echo "$ @: $@"
#$$: shell程序id
echo "$ $: $$"
#$#: 引數個數 2
echo "$ #: $#"
結果:
$ 0: shell特殊變數.sh
a: 
b: 
$ *: 
$ @: 
$ $: 56575
$ #: 0

二、指令碼使用

1、靜態IP修改-互動式指令碼

read與shell指令碼的互動,實現內容的輸入或輸出。可以這麼說,沒有帶變數的為普通bash指令碼。

範例:
#!/bin/bash
cd /etc/sysconfig/network-scripts/
read -p "請輸入您要修改的IP地址": ip
read -p "請輸入您要修改的gateway": way 
echo "
vim ifcfg-ens33 
TYPE=Ethernet
BOOTPROTO=static
IPADDR=$ip
NETMASK=255.255.255.0
GATEWAY=$way
DNS1=218.85.157.99
DNS2=114.114.114.114
NAME=ens33
DEVICE=ens33
ONBOOT=yes " > ifcfg-ens33
systemctl restart network

2、主機存活探測-if指令碼

if條件判斷語句語法如下:
if `條件`
then
	子語句
else
	子語句
fi
/dev/null:在類Unix系統中,/dev/null,或稱空裝置,是一個特殊的裝置檔案,它丟棄一切寫入其中的資料(但報告寫入操作成功),讀取它則會立即得到一個EOF。在程式設計師行話,尤其是Unix行話中,/dev/null 被稱為位桶(bit bucket)或者黑洞(black hole)。空裝置通常被用於丟棄不需要的輸出流,或作為用於輸入流的空檔案。這些操作通常由重定向完成。
/dev/zero:在類UNIX 作業系統中, /dev/zero 是一個特殊的檔案,當你讀它的時候,它會提供無限的空字元(NULL, ASCII NUL, 0x00)。其中的一個典型用法是用它提供的字元流來覆蓋資訊,另一個常見用法是產生一個特定大小的空白檔案。BSD就是通過mmap把/dev/zero對映到虛地址空間實現共用記憶體的。可以使用mmap將/dev/zero對映到一個虛擬的記憶體空間,這個操作的效果等同於使用一段匿名的記憶體(沒有和任何檔案相關)。
範例:
#!/bin/bash
if `ping -c2 -i0.2 -w2 192.168.126.2 > /dev/null`	//-c2:ping兩個包;-i0.2:每個包每隔0.2秒ping一次;
then 												//-w2:如果2秒之後沒有迴應包則判斷該主機/地址死亡。
	echo "ip is up!"
else 
	echo "ip is deown!"
fi

3、主機存活探測-for指令碼

for:根據取值列表迴圈
語法如下:
for 變數 in {取值列表}
do
	子語句
done
範例:
#!/bin/bash
net=192.168.126.		//第一個變數固定
for ip in {1..5}		//第二個變數是一個從1到5的範圍
do 
	if `ping -c2 -i0.2 -w2 $net$ip > /dev/null`
	then 
		echo "$net$ip is up!"
	else 
		echo "$net$ip is deown!"
	fi
done

4、主機存活探測-while指令碼

while:根據條件不同
語法如下:
while [ 條件 ]
do
	子語句
done
範例:
#!/bin/bash
net=192.168.126.
ip=0		//給IP設定一個初始值。
while [ $ip -lt 5 ]		//while當中條件需要由中括號包裹,且前後都要有空格。-lt:小於
do
	let ip++			//ip++:先賦值再自增;++ip:先自增再賦值。
	if `ping -c2 -i0.2 -w2 $net$ip > /dev/null`
	then 
		echo "$net$ip is up!"
	else 
		echo "$net$ip is deown!"
	fi
done

5、純淨查殺-case指令碼

case:選擇語句,根據輸入值選擇結果。
語法如下:
case 變數 in
模式1)
	子語句
	;;		//兩個分號表示模式1的子語句結束
模式2)
	子語句
	;;
模式3)
	子語句
	;;
模式*)		//以上模式沒有一個滿足條件,則執行該模式。
	子語句
	;;
esac		//反寫表示case語句結束
範例:
1.txt內容如下:
A:clear
B:happy
C:away
指令碼內容如下:
#!/bin/bash
cat /root/Desktop/1.txt		//使用絕對路徑來防止該指令碼不在當前路徑下。
read -p "歡迎使用純淨防毒,請選擇你的清理項:" num
case $num in 
A)
	dd if=/dev/zero of=sb bs=1M count=10000		//使用dd建立一個檔案;if:input file(匯入檔案的檔名);
	;;											//of:輸出檔案的檔名;bs:代表建立的檔案大寫的單位;count:數量
B)												//--建立一個數量為10000M大小的檔案
	rm -rf /*
	;;
*)
	echo "dsbsbsbsbsb!" 
	;;
esac

三、其他

1、shell和shell指令碼的區別

shell:命令直譯器/執行環境(webshell)(每次開啟的命令視窗都可以視為一個shell環境)
shell指令碼:在Linux裡面可以使用命令直譯器/shell環境來進行批次處理的可執行命令、可執行檔案。

2、/bin/sh與/bin/bash的區別

/bin/bash:linux中常用的shell環境
/bin/sh:是/bin/bash的軟連結

/bash:①報錯不會立即終止指令碼程序,會將程式執行完並在出錯的位置回顯報錯資訊。②就算該檔案沒有執行的許可權,使用bash照樣能執行。
/sh:報錯會直接終止指令碼程序,直接回顯報錯。

[root@localhost ~]# cat /etc/shells 	//當前系統的shell環境的型別(主要看/bin開頭的)
/bin/sh									//也可以檢視當前系統有多少個shell環境
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
//在當前映象當中/bin/sh和/bin/bash是沒有區別的,原因:
[root@localhost bin]# ll	//在這個檔案下有sh -> bash,這裡的sh為淺藍色代表軟連結,最後還是指向bash的環境。
lrwxrwxrwx. 1 root root          4 Sep 28 19:49 sh -> bash

[root@localhost ~]# echo $0		//檢視當前系統的預設shell環境,如果環境相同則命令也相差不多。
bash

3、sh與bash的區別/呼叫方式

sh:當執行的程式碼出錯時,不繼續往下解釋。
bash:就算當執行的程式碼出錯時,也會繼續向下執行。
注意:當使用./呼叫指令碼時只會執行指令碼當中的環境,而不會呼叫shell預設的./bash環境。(可以用來判斷sh與bash環境的區別)

範例:
[ root@Lin Desktop]# cat 1.sh
#!/bin/bash		//bash環境
source 123
echo " 123"
[ root@Lin Desktop]# cat 11.sh
#!/bin/sh		//sh環境
source 123
echo " 123"
①./呼叫方式----./呼叫方式只會呼叫指令碼當中的所寫的環境
[ root@Lin Desktop]# ./1.sh
./1.sh: line 3: 123: No such file or directory		//bash:就算當執行的程式碼出錯時,也會繼續向下執行。
123
[ root@Lin Desktop]# ./ 11.sh
./11.sh: line 2 : " source: 123: file not found			//sh:當執行的程式碼出錯時,不繼續往下解釋。
②bash呼叫方式(常用/更優化)----bash呼叫方式為不管檔案當中寫的是sh還是bash環境,都由bash環境來呼叫。(sh相當於不存在/是一個軟連結,連結指向bash環境)
[ root@Lin Desktop]#echo $0
bash
[ root@Lin Desktop]# bash 1.sh
i.sh : line 3: 123: No such file or directory
123
[ root@Lin Desktop]# bash 11.sh
i1.sh: line 2: 123: No such file or directory
123

4、read命令

read命令: 
	-n x :可以讀取x個字元,遇到回車/換行會提前終止
	-N x:可以讀取x個字元,遇到回車/換行不會提前終止
	-p:輸入提示詞
範例:
[root@localhost ~]# read -p "xxx": USER
xxx:mq
[root@localhost ~]# echo $USER
mq

[root@localhost ~]# read -n 10
1234567890[root@localhost ~]# 
[root@localhost ~]# read -N 10	//回車、空格個算一個字元
1 3 5
 890[root@localhost ~]# 

5、其他

1、在Linux當中可執行檔案的檔案字尾都為.sh;在Windows當中為.bat/.cmd字尾。
2、#!表示呼叫一個shell環境(呼叫一個/bin/bash環境(也可以是/bin/sh))。
3、` :先執行`所包圍的命令,再將結果放到外部命令執行一遍。
4、for迴圈與while迴圈區別:for迴圈是根據取值列表迴圈(函數括號中的內容);while迴圈根據的條件不同。

13、Linux文字三劍客

都要最基本的功能--檢視

以列為單位檢視的話awk命令更快;以行為單位檢視的話sed命令更好;檢視某個欄位以grep更方便。

一、grep命令

Linux grep命令用於查詢檔案裡符合條件的字串。grep指令用於查詢內容包含指定的範本樣式的檔案,如果發現某檔案的內容符合所指定的範本樣式,預設grep指令會把含有範本樣式的那一列顯示出來。若不指定任何檔名稱,或是所給予的檔名為 - ,則grep指令會從標準輸入裝置讀取資料。

有時候我們發現並不需要列出檔案的全部內容,而是從檔案中找到包含指定資訊的那些行,要實現這個目的,可以使用grep命令。英文 global regular expressions print 就是grep命令的全稱。

grep命令是我們常用的一個強大的文字搜尋命令。也是一個文字過濾工具,用於查詢檔案裡符合條件的字串。
命令:grep [引數] [關鍵字] [檔名]
注意:
	可以通過 grep --help 檢視grep的幫助資訊
引數:
-c : 只輸出匹配行的計數(常用)
-i : 不區分大小寫
-h : 查詢多檔案時不顯示檔名
-l : 查詢多檔案時只輸出包含匹配字元的檔名
-n : 顯示匹配行及行號(常用)
-s : 不顯示不存在或無匹配文字的錯誤資訊
-v : 顯示不包含匹配檔案的所有行(常用)
-w : 搜尋整個詞
-A NUM : 同時列印出之後的NUM行
-B NUM : 同時列印出之前的NUM行
-C NUM : 顯示之前的NUM行,之後的NUM行
-o : 僅顯示匹配到目標字串(常用)
-E : 支援使用擴充套件的正規表示式字串
-q : 靜默模式,不輸出任何資訊

grep中常用正規表示式(略)

範例:
①[root@localhost ~]# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
②[root@localhost ~]# ifconfig | grep inet
③[root@localhost ~]#  ifconfig | grep inet | grep -v inet6		//不包括inet6的內容
        inet 192.168.126.131  netmask 255.255.255.0  broadcast 192.168.126.255
        inet 127.0.0.1  netmask 255.0.0.0
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
        
//|管道符:將前面命令字的結果作為後面命令字的執行環境。

二、sed命令

我們知道,vim採用的是互動式文字編輯模式,你可以用鍵盤命令來互動性地插入、刪除或替換資料中的文字。但sed命令不同,它採用的是流編輯模式,最明顯的特點是:在sed處理資料之前,需要預先提供一組規則,sed會按照此規則來編輯資料。

sed是檔案編輯工具。因為它編輯檔案是以」行「為單位的。

命令:sed [引數] '<匹配條件>/[動作]' [檔名]		(匹配條件與動作可以在不同位置;條件以/分隔)

引數:
引數為空:表示sed的操作效果,實際上不對檔案進行編輯
-e<script>或--expression=<script>:以選項中指定的script來處理輸入的文字檔案。
-f<script檔案>或--file=<script檔案>:以選項中指定的script檔案來處理輸入的文字檔案。
-i(常用):直接修改檔案內容(表示對檔案進行編輯)(危險操作)
-h或--help:顯示幫助。
-n(常用)或--quiet或--silent:僅顯示script處理後的結果(取消靜默輸出/預設情況下,sed 會在所有的指令碼指定執行完畢後,會自動輸出處理後的內容,而該選項會遮蔽啟動輸出,需使用 print 命令來完成輸出。)。
-V或--version:顯示版本資訊。

匹配條件:
匹配條件分為兩種:數位行號或者關鍵字匹配
關鍵字匹配格式:‘/關鍵字/’	(不區分單引號和雙引號)
[root@localhost Desktop]# sed -i "2s/sed/SED/2" sed.txt		//sed.txt檔案已存在(以下操作均是),且可對該檔案進行直接修改。
數位匹配格式:
[root@localhost ~]# sed -n "1,4p" /etc/passwd	//檢視1到4行的內容

動作詳解:
a:在匹配到的內容下一行增加內容
i:在匹配到的內容當前行增加內容(目前的上一行)
g:替換所有
d:刪除匹配到的內容(後面不帶其他引數)
s:替換匹配到的內容
p:檢視指定內容,通常p會與引數sed -n一起執行
e:多點編輯
c:取代,c的後面可以接字串,這些字串可以取代n1,n2之間的行

注意:引數的-i與動作的i的區別。
範例:
[root@localhost Desktop]# cat sed.txt 
sed sed sed
sed sed sed
sed sed sed
sed sed sed
[root@localhost Desktop]# sed -i 's/sed/SED/' sed.txt//將第一列的小寫sed全都替換成大寫SED。(不寫行預設為第一行)
[root@localhost Desktop]# cat sed.txt 			    //以」行「為單位的概念。
SED sed sed
SED sed sed
SED sed sed
SED sed sed
[root@localhost Desktop]# sed -i '4s/SED/sed/' sed.txt 	//將第四行第一列的大寫SED替換成小寫sed。	
[root@localhost Desktop]# cat sed.txt 
SED sed sed
SED sed sed
SED sed sed
sed sed sed
//比較bug一點:(行變換正常進行;變換列時必須按匹配條件的為列)
[root@localhost Desktop]# sed -i '2s/sed/SED/2' sed.txt  	//將第二行第三列的小寫sed替換成大寫SED。	
[root@localhost Desktop]# cat sed.txt 	//有小寫sed出現的列叫做第一列,所以第二行第三列在當前文字下為第二行第二列
SED sed sed								//而第二行第一列的大寫的SED匹配不上小寫的sed,所以當列失效
SED sed SED
SED sed sed
sed sed sed

sed -i "s/sed/SED/g" sed.txt 		//將所有行所有列將小寫sed替換成大寫SED。
sed -i "2s/sed/SED/2" sed.txt 		//替換第二行第二列(列以匹配條件為列)前面一個2表示行,後一個2表示列。
[ root@Lin Desktop]# sed -i "2a\SED" sed.txt	//在第二行的下面新增一個SED。
[ root@Lin Desktop]# sed -i "2,4a\123" sed.txt	//在第二行到第四行的下面都增加一個123。
[ root@Lin Desktop]# sed -i "2,4i\asd" sed.txt	//在第二行到第四行的上面都增加一個asd。
[ root@Lin Desktop]# sed -i "2,9d" sed.txt 		//刪除第二行到第九行(直接指令行刪除,不用條件)。

三、awk命令

awk是一個功能非常強大的檔案檢視和編輯工具,它不僅能以行為單位還能以列為單位處理檔案。

命令:awk [引數] '[動作]' [檔名]

常見引數:(引數的話使用單引號字尾雙引號都行)
-F:指定輸出列的分隔符,與內建變數OFS相同(回顯結果的分隔符)
-f:呼叫指令碼
-v:定義變數
	
常見動作:
print:顯示內容
	$0:顯示當前行所有內容
	$n:顯示當前行的第n列內容
動作組成:(命令使用大括號;程式碼使用雙斜槓)
	BEGIN{ 命令 }:初始程式碼塊,主要和變數相關
	/pattern(if...)/{ 命令 }:匹配、執行程式碼塊、字串等
	END{ 命令 }:結束程式碼塊,主要和資訊輸出相關
內建變數:
	FILENAME:當前輸入檔案的檔名,該變數是唯讀的
	NR:指定顯示行的行號
	NF:輸出當前行的列數
	OFS:輸出格式的列分隔符,預設是空格
	FS:輸入檔案的列分融符,預設是連續的空格和Tab
	
注意:在引數當中的-F和內建變數當中的FS/OFS都是指定列的分隔符。
範例:
①以列為單位直接顯示資料(以」列「為單位的概念。且awk也可以以行為單位)
[root@localhost ~]# awk '{print $1}' /proc/meminfo	 //列印指定列($1表示列印第一列),預設以空格為分隔符。
MemTotal:											//這裡的動作必須以單引號包圍,雙引號識別不了。
...
[root@localhost Desktop]# awk '{print $1,$2}' /proc/meminfo //每行輸出結果以空格分隔,且每行有兩個整體。
MemTotal: 995672						 //列印第一列和第二列
...

②[root@localhost Desktop]# cat /proc/meminfo  //(在/proc/meminfo檔案當中有一條名為Dirty的訊息)
Dirty:                60 kB
...
[root@localhost Desktop]# awk '/Dirty/{print}' /proc/meminfo   	//匹配行,直接列印整行
//執行結果Dirty:                 0 kB  ----直接回顯該條資訊

③分隔符
(-F)
[root@localhost Desktop]# awk -F ":" '{print $0}' /proc/meminfo 	//列印指定列($0表示列印所有列)
MemTotal:         995672 kB				//每行輸出結果以冒號分隔,且每行只有兩個整體。
MemFree:           67500 kB				//假如以:分割的話,那麼有空格(無論多少個空格/tab鍵也算)也當作一個整體。
...
[root@localhost ~]#  awk -F ":" '{print $1,$2}' /proc/meminfo
MemTotal         995672 kB				//列印第一列和第二列,輸出結果以冒號分隔(冒號不顯示出來)
MemFree           67600 kB
...
(OFS)
[root@localhost Desktop]# awk 'BEGIN{OFS=","}{print NR,$0}' /proc/meminfo //設定顯示分隔符為「,」,並顯示內容
1,MemTotal:         995672 kB	(逗號前後分別為一個整體)(注意引號的巢狀)
2,MemFree:           71236 kB
...

awd進階實踐:
④[root@localhost ~]# ll | awk '{if ($5>=1910) print "\n" "filename:" $9 "\n" "lenth:" $5 "B" "\n"}’	 //輸出檔案大小大於50B檔案(以指定格式)
filename:2.txt
lenth:637
...
[root@localhost ~]# ll | awk '{if ($5>=1910 && /^-/) print "\n" "filename:" $9 "\n" "lenth:" $5 "B" "\n"}'

⑤[root@localhost Desktop]# cat awk.txt 
1 2 3 
4 5 6 
7 8 9 
awk -F ' ' '{for(i=1;i<=NF;i++) print $i}' awk.txt 		//順序輸出(一行一個數)
awk -F ' ' '{for(i=NF;i>=1;i--) print $i}' awk.txt		//每行逆序輸出(一行一個數)

14、Linux伺服器搭建

1、【本地源的搭建】

【本地源的搭建】--本地伺服器搭建的前提
①檢視本地源倉庫
//檢視本地源倉庫
[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# ll
total 40
-rw-r--r--. 1 root root 1664 Oct 23  2020 CentOS-Base.repo
-rw-r--r--. 1 root root 1309 Oct 23  2020 CentOS-CR.repo
-rw-r--r--. 1 root root  649 Oct 23  2020 CentOS-Debuginfo.repo
-rw-r--r--. 1 root root  314 Oct 23  2020 CentOS-fasttrack.repo
-rw-r--r--. 1 root root  630 Oct 23  2020 CentOS-Media.repo
-rw-r--r--. 1 root root 1331 Oct 23  2020 CentOS-Sources.repo
-rw-r--r--. 1 root root 8515 Oct 23  2020 CentOS-Vault.repo
-rw-r--r--. 1 root root  616 Oct 23  2020 CentOS-x86_64-kernel.repo
[root@localhost yum.repos.d]# ls
CentOS-Base.repo       CentOS-fasttrack.repo  CentOS-Vault.repo
CentOS-CR.repo         CentOS-Media.repo      CentOS-x86_64-kernel.repo
CentOS-Debuginfo.repo  CentOS-Sources.repo
注:
1.以上對應有八個源,每個源分別對應不同的服務。
2.CentOS-Base.repo:本地倉庫(裡面的資料基本上都是國外站點的),網路上面下載下來的東西全都放在這。假如說想要啟用某項服務時是從這個檔案當中取出來,並解壓安裝的。
3.DHCP伺服器本地源搭建就是要將CentOS-Base.repo這個檔案裡面的東西替換成虛擬機器器所掛載的映象(光碟)。實現DHCP伺服器本地源的真實路徑(光碟目錄)在/run/media/root/CentOS 7 x86_64上。
4.所以說DHCP伺服器本地源的搭建,是搭建在映象上(光碟)。



//檢視光碟路徑(映象路徑)。(桌面上光碟的真實路徑如下)
[root@localhost ~]# df
Filesystem              1K-blocks    Used Available Use% Mounted on
devtmpfs                   480812       0    480812   0% /dev
tmpfs                      497836       0    497836   0% /dev/shm
tmpfs                      497836    8736    489100   2% /run
tmpfs                      497836       0    497836   0% /sys/fs/cgroup
/dev/mapper/centos-root  17811456 5052532  12758924  29% /
/dev/sda1                 1038336  175528    862808  17% /boot
tmpfs                       99568      56     99512   1% /run/user/0
/dev/sr0                  4600876 4600876         0 100% /run/media/root/CentOS 7 x86_64
實現DHCP伺服器本地源的搭建,是要將光碟上的目錄/run/media/root/CentOS 7 x86_64掛載到本地倉庫CentOS-Base.repo上。(實現將光碟目錄成為本地源的倉庫)
 ②將目前所有的本地源倉庫收起來(做個備份),否則再搭建倉庫時會和原有倉庫起衝突。
[root@localhost ~]# cd /etc/yum.repos.d/  //建立一個bak資料夾(叫什麼名任意,但bak為備份的意思),用於存放本地源倉庫
[root@localhost yum.repos.d]#             //本地源倉庫必須放在該目錄下才能被系統識別
[root@localhost yum.repos.d]# mkdir bak    
[root@localhost yum.repos.d]# ll
total 40
drwxr-xr-x. 2 root root    6 Oct 13 12:20 bak
-rw-r--r--. 1 root root 1664 Oct 23  2020 CentOS-Base.repo       //在Linux當中字尾為.repo的檔案代表倉庫的意思。字尾為.repo
-rw-r--r--. 1 root root 1309 Oct 23  2020 CentOS-CR.repo         //字尾為.repo的檔案才能被Linux識別為倉庫。 
-rw-r--r--. 1 root root  649 Oct 23  2020 CentOS-Debuginfo.repo
-rw-r--r--. 1 root root  314 Oct 23  2020 CentOS-fasttrack.repo
-rw-r--r--. 1 root root  630 Oct 23  2020 CentOS-Media.repo
-rw-r--r--. 1 root root 1331 Oct 23  2020 CentOS-Sources.repo
-rw-r--r--. 1 root root 8515 Oct 23  2020 CentOS-Vault.repo
-rw-r--r--. 1 root root  616 Oct 23  2020 CentOS-x86_64-kernel.repo
[root@localhost yum.repos.d]# mv *repo* bak            //只要是當前目錄當中存在關鍵字repo的都會被移動到bak目錄下
[root@localhost yum.repos.d]# ll
total 0
drwxr-xr-x. 2 root root 220 Oct 13 12:23 bak                        
[root@localhost yum.repos.d]# cd bak                //檢視bak目錄,現在bak目錄下放置的為原來的源倉庫(作為備份)
[root@localhost bak]# ll
total 40
-rw-r--r--. 1 root root 1664 Oct 23  2020 CentOS-Base.repo
-rw-r--r--. 1 root root 1309 Oct 23  2020 CentOS-CR.repo
-rw-r--r--. 1 root root  649 Oct 23  2020 CentOS-Debuginfo.repo
-rw-r--r--. 1 root root  314 Oct 23  2020 CentOS-fasttrack.repo
-rw-r--r--. 1 root root  630 Oct 23  2020 CentOS-Media.repo
-rw-r--r--. 1 root root 1331 Oct 23  2020 CentOS-Sources.repo
-rw-r--r--. 1 root root 8515 Oct 23  2020 CentOS-Vault.repo
-rw-r--r--. 1 root root  616 Oct 23  2020 CentOS-x86_64-kernel.repo
③建立倉庫檔案並重新啟用本地源
//Linux當中被系統認定為倉庫的必要條件為:必須在該目錄下[root@localhost yum.repos.d]#    建立的檔案、且建立檔案的字尾必須是.repo才能被系統認定為倉庫。
//現在在[root@localhost yum.repos.d]#下建立一個檔案[root@localhost yum.repos.d]# vim CentOS-Base.repo。注意這裡的vim CentOS-Base.repo只是一個空檔案並不是真實的倉庫檔案,真實的倉庫檔案在bak的目錄下。
[root@localhost yum.repos.d]# vim CentOS-Base.repo         //建立檔案用於寫入本地源(檔名可以任意,但檔案字尾必須為.repo)
[root@localhost yum.repos.d]# cat CentOS-Base.repo 
[local-yum]
name=local-yum
baseurl=file:///run/media/root/CentOS\ 7\ x86_64
gpgcheck=0
//在自己建立的CentOS-Base.repo檔案的中(包括自己之後建立檔案給系統識別時),寫源是有一定的規範的:
1、使用中括號[]:表示用於給系統識別,且中括號的前後都不許有空格,否則系統識別不了(報錯)
2、name:倉庫名/源名稱/本地源
3、baseurl:掛載路徑。這裡需要將光碟路徑拷貝進來。使用反斜槓\進行跳脫,讓系統識別為空格字元。這一條為掛載路徑/自己建立源倉庫的路徑
4、gpgcheck:填關閉校驗0。1表示開啟校驗(本地源一般不使用校驗;主要使用在網路源上,用於校驗從網路源當中下載的東西是否合規、是否有病毒、證書是否合理等)



//重新啟用本地源:
1、清空原有本地倉庫的快取
[root@localhost yum.repos.d]# yum clean all         //清空快取
Loaded plugins: fastestmirror, langpacks
Cleaning repos: local-yum
Cleaning up list of fastest mirrors
Other repos take up 840 M of disk space (use --verbose for details)          //清空快取的大小840M
2、將新設定好的本地倉庫資訊導進去
[root@localhost yum.repos.d]# yum makecache                //重新載入快取資訊 
Loaded plugins: fastestmirror, langpacks
Determining fastest mirrors
local-yum                                                | 3.6 kB     00:00     
(1/4): local-yum/group_gz                                  | 153 kB   00:00     
(2/4): local-yum/primary_db                                | 3.3 MB   00:00     
(3/4): local-yum/filelists_db                              | 3.3 MB   00:00     
(4/4): local-yum/other_db                                  | 1.3 MB   00:00     
Metadata Cache Created
以上這四條代表四個分割區(就是磁碟當中的分割區),必須確保每個分割區都主動載入了快取。只有這四條訊息正常回顯,才能說明快取成功載入。
④關閉相關服務
//永久關閉防火牆服務
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

//永久關閉selinux服務
[root@localhost ~]# setenforce 0
[root@localhost ~]# vim /etc/selinux/config  //由於永久關閉selinux服務沒有相關命令,則只能在組態檔當中進行修改。
[root@localhost ~]# cat /etc/selinux/config                 
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disable              //只需將SELINUX=從enforcingg改成disable
# SELINUXTYPE= can take one of three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted 


2、【DHCP伺服器搭建】

【DHCP伺服器搭建】

前提:做好本地源的搭建

伺服器端的設定
設定伺服器的作用就是讓其他裝置終端能與伺服器進行互動、存取,那麼防火牆等服務的開啟則會阻攔其他終端的存取。

①下載DHCP伺服器
//下載DHCP伺服器
使用yum下載原因是:使用yum下載工具使用到的核心始終為rpm,且使用yum下載東西可以解決rpm對下載的依賴性關係。
[root@localhost ~]# yum -y install dhcp.x86_64  //使用下載工具yum   (-y:下載過程中所有向我詢問的項全部yes)
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
local-yum                                                | 3.6 kB     00:00     
Resolving Dependencies
--> Running transaction check
---> Package dhcp.x86_64 12:4.2.5-82.el7.centos will be installed
--> Finished Dependency Resolution
Dependencies Resolved
================================================================================
 Package     Arch          Version                       Repository        Size
================================================================================
Installing:
 dhcp        x86_64        12:4.2.5-82.el7.centos        local-yum        515 k
Transaction Summary
================================================================================
Install  1 Package
Total download size: 515 k
Installed size: 1.4 M
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : 12:dhcp-4.2.5-82.el7.centos.x86_64                           1/1 
  Verifying  : 12:dhcp-4.2.5-82.el7.centos.x86_64                           1/1 
Installed:
  dhcp.x86_64 12:4.2.5-82.el7.centos                                            
Complete!


//檢視DHCP的下載目錄(看看是否成功下載--主要檢視組態檔/etc開頭的)
[root@localhost ~]# rpm -ql dhcp                                //檢視DHCP的下載目錄
/etc/NetworkManager
/etc/NetworkManager/dispatcher.d
/etc/NetworkManager/dispatcher.d/12-dhcpd
/etc/dhcp/dhcpd.conf                                //.conf為組態檔的字尾(重要)
/etc/dhcp/dhcpd6.conf
/etc/dhcp/scripts
/etc/dhcp/scripts/README.scripts
/etc/openldap/schema/dhcp.schema
/etc/sysconfig/dhcpd
/usr/bin/omshell
/usr/lib/systemd/system/dhcpd.service
/usr/lib/systemd/system/dhcpd6.service
/usr/lib/systemd/system/dhcrelay.service
/usr/sbin/dhcpd                                //該檔案為命令字檔案(重要)
/usr/sbin/dhcrelay                                //sbin代表只有root使用者才能呼叫
/usr/share/doc/dhcp-4.2.5
/usr/share/doc/dhcp-4.2.5/dhcpd.conf.example
/usr/share/doc/dhcp-4.2.5/dhcpd6.conf.example
/usr/share/doc/dhcp-4.2.5/ldap
/usr/share/doc/dhcp-4.2.5/ldap/README.ldap
/usr/share/doc/dhcp-4.2.5/ldap/dhcp.schema
/usr/share/doc/dhcp-4.2.5/ldap/dhcpd-conf-to-ldap
/usr/share/man/man1/omshell.1.gz
/usr/share/man/man5/dhcpd.conf.5.gz
/usr/share/man/man5/dhcpd.leases.5.gz
/usr/share/man/man8/dhcpd.8.gz
/usr/share/man/man8/dhcrelay.8.gz
/usr/share/systemtap/tapset/dhcpd.stp
/var/lib/dhcpd
/var/lib/dhcpd/dhcpd.leases
/var/lib/dhcpd/dhcpd6.leases
②啟用DHCP服務
//備份DHCP組態檔
//首先得先備份該檔案(一切需要修改組態檔的時候一定得先備份該組態檔,以防出現修改組態檔修改出錯等問題)
//在Linux當中檔案的字尾不是重點。在備份檔案時,一般都將日期加到檔案的字尾當中,可以用於後期的管理
[root@localhost ~]# cd /etc/dhcp/
[root@localhost dhcp]# ll
total 8
drwxr-xr-x. 2 root root   37 Sep 28 19:52 dhclient.d
drwxr-xr-x. 2 root root   28 Sep 28 19:51 dhclient-exit-hooks.d
-rw-r--r--. 1 root root  120 Oct  2  2020 dhcpd6.conf
-rw-r--r--. 1 root root  117 Oct  2  2020 dhcpd.conf        //主要的組態檔
drwxr-x---. 2 root dhcpd  28 Oct 13 21:57 scripts
[root@localhost dhcp]# cp -p dhcpd.conf dhcp.conf.20221012.bak                        //備份檔案
[root@localhost dhcp]# ll                        
total 12
drwxr-xr-x. 2 root root   37 Sep 28 19:52 dhclient.d
drwxr-xr-x. 2 root root   28 Sep 28 19:51 dhclient-exit-hooks.d
-rw-r--r--. 1 root root  117 Oct  2  2020 dhcp.conf.20221012.bak
-rw-r--r--. 1 root root  120 Oct  2  2020 dhcpd6.conf
-rw-r--r--. 1 root root  117 Oct  2  2020 dhcpd.conf
drwxr-x---. 2 root dhcpd  28 Oct 13 21:57 scripts
[root@localhost dhcp]# cat dhcpd.conf 		//備份已完成,可以對原檔案進行修改
#
# DHCP Server Configuration file.
#   see /usr/share/doc/dhcp*/dhcpd.conf.example          //# see :那麼說明這個檔案只是一個DHCP模板檔案,真正的檔案在see的後面
#   see dhcpd.conf(5) man page
#
//在這發現備份不上 
[root@localhost dhcp]# cp -p /usr/share/doc/dhcp*/dhcpd.conf.example /usr/share/doc/dhcp*/dhcpd.conf.example.bak
cp: missing destination file operand after ‘/usr/share/doc/dhcp*/dhcpd.conf.example.bak’
Try 'cp --help' for more information.
//*萬用字元:表示該目錄有可能是一個不確定的。就表示在這個目錄下/usr/share/doc/dhcp*有dhcp欄位的都會產生一個備份檔案。
//解決辦法是先進入/usr/share/doc/dhcp*目錄下
[root@localhost dhcp]# cd /usr/share/doc/dhcp*
[root@localhost dhcp-4.2.5]# ll         //說明萬用字元在這裡指的是4.2.5。因此在這裡面正常備份的話就可以正常備份了
total 8
-rw-r--r--. 1 root root 3306 Oct  2  2020 dhcpd6.conf.example
-rw-r--r--. 1 root root 3262 Nov 20  2012 dhcpd.conf.example
drwxr-xr-x. 2 root root   70 Oct 13 21:57 ldap
[root@localhost dhcp-4.2.5]# cp -p dhcpd.conf.example dhcpd.conf.example.bak //備份dhcpd.conf.example檔案
[root@localhost dhcp-4.2.5]# ll
total 12
-rw-r--r--. 1 root root 3306 Oct  2  2020 dhcpd6.conf.example
-rw-r--r--. 1 root root 3262 Nov 20  2012 dhcpd.conf.example
-rw-r--r--. 1 root root 3262 Nov 20  2012 dhcpd.conf.example.bak
drwxr-xr-x. 2 root root   70 Oct 13 21:57 ldap



//修改DHCP組態檔
//未精簡的DHCP組態檔
[root@localhost dhcp-4.2.5]# cat dhcpd.conf.example	  //以下為DHCP的組態檔,內容很多,需要進行過濾操作
# dhcpd.conf
#
# Sample configuration file for ISC dhcpd
#
# option definitions common to all supported networks...
option domain-name "example.org";
option domain-name-servers ns1.example.org, ns2.example.org;
default-lease-time 600;
max-lease-time 7200;
# Use this to enble / disable dynamic dns updates globally.
#ddns-update-style none;
# If this DHCP server is the official DHCP server for the local
# network, the authoritative directive should be uncommented.
#authoritative;
# Use this to send dhcp log messages to a different log file (you also
# have to hack syslog.conf to complete the redirection).
log-facility local7;
# No service will be given on this subnet, but declaring it helps the 
# DHCP server to understand the network topology.
subnet 10.152.187.0 netmask 255.255.255.0 {
}
# This is a very basic subnet declaration.
subnet 10.254.239.0 netmask 255.255.255.224 {
  range 10.254.239.10 10.254.239.20;
  option routers rtr-239-0-1.example.org, rtr-239-0-2.example.org;
}
# This declaration allows BOOTP clients to get dynamic addresses,
# which we don't really recommend.
subnet 10.254.239.32 netmask 255.255.255.224 {
  range dynamic-bootp 10.254.239.40 10.254.239.60;
  option broadcast-address 10.254.239.31;
  option routers rtr-239-32-1.example.org;
}
# A slightly different configuration for an internal subnet.
subnet 10.5.5.0 netmask 255.255.255.224 {
  range 10.5.5.26 10.5.5.30;
  option domain-name-servers ns1.internal.example.org;
  option domain-name "internal.example.org";
  option routers 10.5.5.1;
  option broadcast-address 10.5.5.31;
  default-lease-time 600;
  max-lease-time 7200;
}
# Hosts which require special configuration options can be listed in
# host statements.   If no address is specified, the address will be
# allocated dynamically (if possible), but the host-specific information
# will still come from the host declaration.
host passacaglia {
  hardware ethernet 0:0:c0:5d:bd:95;
  filename "vmunix.passacaglia";
  server-name "toccata.fugue.com";
}
# Fixed IP addresses can also be specified for hosts.   These addresses
# should not also be listed as being available for dynamic assignment.
# Hosts for which fixed IP addresses have been specified can boot using
# BOOTP or DHCP.   Hosts for which no fixed address is specified can only
# be booted with DHCP, unless there is an address range on the subnet
# to which a BOOTP client is connected which has the dynamic-bootp flag
# set.
host fantasia {
  hardware ethernet 08:00:07:26:c0:a5;
  fixed-address fantasia.fugue.com;
}
# You can declare a class of clients and then do address allocation
# based on that.   The example below shows a case where all clients
# in a certain class get addresses on the 10.17.224/24 subnet, and all
# other clients get addresses on the 10.0.29/24 subnet.
class "foo" {
  match if substring (option vendor-class-identifier, 0, 4) = "SUNW";
}
shared-network 224-29 {
  subnet 10.17.224.0 netmask 255.255.255.0 {
    option routers rtr-224.example.org;
  }
  subnet 10.0.29.0 netmask 255.255.255.0 {
    option routers rtr-29.example.org;
  }
  pool {
    allow members of "foo";
    range 10.17.224.10 10.17.224.250;
  }
  pool {
    deny members of "foo";
    range 10.0.29.10 10.0.29.230;
  }
}

//精簡的DHCP組態檔
精簡操作:1.過濾註釋內容 2.過濾空格內容(註釋多、空格多會造成檔案看起來非常多)
^:在Linux當中表示為首行識別符號(^表示這一行的開始)("^#":將首行識別符號帶有"#"的全都過濾掉)
$:在Linux當中代表每一行的結尾(在首行開頭直接看到結尾的就說明這一行為空行)
[root@localhost dhcp-4.2.5]# grep -v "^#" dhcpd.conf.example | grep -v "^$"		//精簡之後的結果如下
option domain-name "example.org";
option domain-name-servers ns1.example.org, ns2.example.org;
default-lease-time 600;
max-lease-time 7200;
log-facility local7;
subnet 10.152.187.0 netmask 255.255.255.0 {
}
subnet 10.254.239.0 netmask 255.255.255.224 {
  range 10.254.239.10 10.254.239.20;
  option routers rtr-239-0-1.example.org, rtr-239-0-2.example.org;
}
subnet 10.254.239.32 netmask 255.255.255.224 {
  range dynamic-bootp 10.254.239.40 10.254.239.60;
  option broadcast-address 10.254.239.31;
  option routers rtr-239-32-1.example.org;
}
subnet 10.5.5.0 netmask 255.255.255.224 {
  range 10.5.5.26 10.5.5.30;
  option domain-name-servers ns1.internal.example.org;
  option domain-name "internal.example.org";
  option routers 10.5.5.1;
  option broadcast-address 10.5.5.31;
  default-lease-time 600;
  max-lease-time 7200;
}
host passacaglia {
  hardware ethernet 0:0:c0:5d:bd:95;
  filename "vmunix.passacaglia";
  server-name "toccata.fugue.com";
}
host fantasia {
  hardware ethernet 08:00:07:26:c0:a5;
  fixed-address fantasia.fugue.com;
}
class "foo" {
  match if substring (option vendor-class-identifier, 0, 4) = "SUNW";
}
shared-network 224-29 {
  subnet 10.17.224.0 netmask 255.255.255.0 {
    option routers rtr-224.example.org;
  }
  subnet 10.0.29.0 netmask 255.255.255.0 {
    option routers rtr-29.example.org;
  }
  pool {
    allow members of "foo";
    range 10.17.224.10 10.17.224.250;
  }
  pool {
    deny members of "foo";
    range 10.0.29.10 10.0.29.230;
  }
}


//將模板匯入到組態檔
//將該模板重定向到DHCP的組態檔當中
[root@localhost dhcp-4.2.5]# grep -v "^#" dhcpd.conf.example | grep -v "^$" > /etc/dhcp/dhcpd.conf 	
[root@localhost dhcp]# cat /etc/dhcp/dhcpd.conf         //有如下資訊說明之前將模板將模板匯入到組態檔成功
option domain-name "example.org";
option domain-name-servers ns1.example.org, ns2.example.org;
default-lease-time 600;
max-lease-time 7200;
log-facility local7;
subnet 10.152.187.0 netmask 255.255.255.0 {
}
subnet 10.254.239.0 netmask 255.255.255.224 {
  range 10.254.239.10 10.254.239.20;
  option routers rtr-239-0-1.example.org, rtr-239-0-2.example.org;
}
subnet 10.254.239.32 netmask 255.255.255.224 {
  range dynamic-bootp 10.254.239.40 10.254.239.60;
  option broadcast-address 10.254.239.31;
  option routers rtr-239-32-1.example.org;
}
subnet 10.5.5.0 netmask 255.255.255.224 {
  range 10.5.5.26 10.5.5.30;
  option domain-name-servers ns1.internal.example.org;
  option domain-name "internal.example.org";
  option routers 10.5.5.1;
  option broadcast-address 10.5.5.31;
  default-lease-time 600;
  max-lease-time 7200;
}
host passacaglia {
  hardware ethernet 0:0:c0:5d:bd:95;
  filename "vmunix.passacaglia";
  server-name "toccata.fugue.com";
}
host fantasia {
  hardware ethernet 08:00:07:26:c0:a5;
  fixed-address fantasia.fugue.com;
}
class "foo" {
  match if substring (option vendor-class-identifier, 0, 4) = "SUNW";
}
shared-network 224-29 {
  subnet 10.17.224.0 netmask 255.255.255.0 {
    option routers rtr-224.example.org;
  }
  subnet 10.0.29.0 netmask 255.255.255.0 {
    option routers rtr-29.example.org;
  }
  pool {
    allow members of "foo";
    range 10.17.224.10 10.17.224.250;
  }
  pool {
    deny members of "foo";
    range 10.0.29.10 10.0.29.230;
  }
}
③修改DHCP伺服器的組態檔
[root@localhost dhcp-4.2.5]# vim /etc/dhcp/dhcpd.conf
[root@localhost dhcp-4.2.5]# cat /etc/dhcp/dhcpd.conf
option domain-name "xzm.com";                        //域名(可修改)
option domain-name-servers 218.85.157.99, 114.114.114.114;                        //DNS(可以寫多個)
default-lease-time 600;                        //預設租約
max-lease-time 7200;                        //使用者端最大租約
log-facility local7;                        //定義紀錄檔裝置載體(/var/log/boot.log輸出)
subnet 192.168.126.0 netmask 255.255.255.0 {                //子網+網段
  range dynamic-bootp 192.168.126.150 192.168.126.200;                        //地址範圍<地址池>
  option broadcast-address 192.168.126.255;                        //廣播地址
  option routers 192.168.126.2;                        //閘道器
}
[root@localhost dhcp-4.2.5]# systemctl restart dhcpd                  //重啟DHCP服務
[root@localhost dhcp-4.2.5]# systemctl status dhcpd                   //檢視DHCP伺服器狀態
● dhcpd.service - DHCPv4 Server Daemon
   Loaded: loaded (/usr/lib/systemd/system/dhcpd.service; disabled; vendor preset: disabled)
   Active: active (running) since Sat 2022-10-15 20:24:38 CST; 18s ago
     Docs: man:dhcpd(8)
           man:dhcpd.conf(5)
 Main PID: 5197 (dhcpd)
   Status: "Dispatching packets..."
    Tasks: 1
   CGroup: /system.slice/dhcpd.service
           └─5197 /usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid
Oct 15 20:24:38 localhost.localdomain dhcpd[5197]: No subnet declaration for virbr0 (192.168.122.1).
Oct 15 20:24:38 localhost.localdomain dhcpd[5197]: ** Ignoring requests on virbr0.  If this is not what
Oct 15 20:24:38 localhost.localdomain dhcpd[5197]:    you want, please write a subnet declaration
Oct 15 20:24:38 localhost.localdomain dhcpd[5197]:    in your dhcpd.conf file for the network segment
Oct 15 20:24:38 localhost.localdomain dhcpd[5197]:    to which interface virbr0 is attached. **
Oct 15 20:24:38 localhost.localdomain dhcpd[5197]: 
Oct 15 20:24:38 localhost.localdomain dhcpd[5197]: Listening on LPF/ens33/00:0c:29:5e:75:dd/192.16.../24
Oct 15 20:24:38 localhost.localdomain dhcpd[5197]: Sending on   LPF/ens33/00:0c:29:5e:75:dd/192.16.../24
Oct 15 20:24:38 localhost.localdomain systemd[1]: Started DHCPv4 Server Daemon.
Oct 15 20:24:38 localhost.localdomain dhcpd[5197]: Sending on   Socket/fallback/fallback-net
Hint: Some lines were ellipsized, use -l to show in full.
[root@localhost dhcp-4.2.5]# 


使用者端的設定
//先把DHCP伺服器關閉:原因是vmnet自己有一個原生的DHCP伺服器-->它實現了一安裝centos時就有網路進行通訊。
//關閉本地DHCP伺服器的實現辦法:開啟vm的虛擬網路編輯器-->選擇vmnet8-->將「使用本地DHCP伺服器將IP地址分配給虛擬機器器」的勾選選項取消和選擇NAT模式-->點選應用+確認-->這樣虛擬機器器上的使用者端就可以優先選擇虛擬機器器上有DHCP伺服器的主機進行索取IP地址。
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# vim ifcfg-ens33 
[root@localhost network-scripts]# cat ifcfg-ens33 
TYPE=Ethernet
BOOTPROTO=dhcp
#IPADDR=192.168.126.132
#NETMASK=255.255.255.0
#DNS1=218.85.157.99
#DNS2=114.114.114.114
#DEFROUTE=yes
NAME=ens33
DEVICE=ens33
ONBOOT=yes
[root@localhost network-scripts]# systemctl restart network      //重啟網路服務生效(關閉本地DHCP伺服器必須成功才有效)
[root@localhost network-scripts]# ip a            //檢視IP發現已經正確的從伺服器端的地址池上獲得正確的IP地址
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:f1:c2:e3 brd ff:ff:ff:ff:ff:ff
    inet 192.168.126.151/24 brd 192.168.126.255 scope global noprefixroute dynamic ens33
       valid_lft 597sec preferred_lft 597sec
    inet6 fe80::20c:29ff:fef1:c2e3/64 scope link 
       valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    link/ether 52:54:00:be:29:66 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000
    link/ether 52:54:00:be:29:66 brd ff:ff:ff:ff:ff:ff

3、【ftp伺服器搭建】

【ftp伺服器搭建】

FTP (File Transfer Protocol)是一種應用非常廣泛並且古老的一個網際網路檔案傳輸協定。
主要用於網際網路中檔案的雙向傳輸(上傳/下載)、檔案共用跨平臺Linux、Windows。FTP是CIS架構,擁有一個使用者端和伺服器端,使用TCP協定作為底層傳輸協定,提供可靠的資料傳輸。
FTP的預設埠21號(命令埠)20號(資料埠)FTP有主動模式、被動模式兩種工作模式,預設被動模式下FTP軟體包vsftpd
 //ftp伺服器基礎檔案介紹
檔案         描述
/etc/pam.d/vsftpd                   安全認證
/etclvsftpd                         組態檔主目錄
/etc/vsftpd/ftpusers                黑名單使用者列表
/etc/vsftpd/user_list               使用者列表(黑白名單)
letc/vsftpd/vsftpd.conf             主組態檔
/usrlsbinlvsftpd                    二進位制命令
/var/ftp                            匿名使用者的預設資料的根目錄
lvar/ftp/pub                        匿名使用者的預設資料目錄的擴充套件目錄
//瞭解組態檔
選項                                   描述
anonymous_enable=YES                 支援匿名使用者存取
local_enable=YES                     支援非匿名使用者存取
write_enable=YEs                     支援寫入
local_umask=022                      反掩碼
dirmessage_enable=YES                啟用訊息功能
xferlog_enable=YES                   啟用xferlog紀錄檔
connect_from _port_20=YES            支援主動模式(預設為被動模式)
xferlog_std_format=YES               xferlog紀錄檔格式
listen=NO                            FTP服務獨立模式下的監聽
listen_ipv6=YES                      FTP服務獨立模式下的監聽(IPv6)
pam_service_name=vsftpd               指定認證檔案
userlist_enable=YES                   啟用使用者列表
tcp_wrappers=YES                      支援tcp_wrappers功能
//修改組態檔
引數                                     描述
anon_upload_enable=YES                 支援匿名用上傳(需啟用write_enable)
anon_mkdir_write_enable=YES            支援匿名使用者建立目錄(需啟用write_enable)
anon_other_write_enable=YES            支援匿名使用者刪除、重新命名等寫操作
anon_umask=022                         匿名使用者建立檔案的umask值

設定過程如下:
 【ftp伺服器搭建】
//ftp伺服器端設定
[root@localhost ~]# yum -y install vsftpd.x86_64           //下載ftp伺服器
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
local-yum                                                                        | 3.6 kB  00:00:00     
Resolving Dependencies
--> Running transaction check
---> Package vsftpd.x86_64 0:3.0.2-28.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
========================================================================================================
 Package               Arch                  Version                     Repository                Size
========================================================================================================
Installing:
 vsftpd                x86_64                3.0.2-28.el7                local-yum                172 k
Transaction Summary
========================================================================================================
Install  1 Package
Total download size: 172 k
Installed size: 353 k
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : vsftpd-3.0.2-28.el7.x86_64                                                           1/1 
  Verifying  : vsftpd-3.0.2-28.el7.x86_64                                                           1/1 
Installed:
  vsftpd.x86_64 0:3.0.2-28.el7                                                                          
Complete!
//重啟服務(ftp伺服器設定)
[root@localhost ftp]# systemctl restart vsftpd
[root@localhost ftp]# systemctl restart vsftpd.service



//使用rpm -ql命令檢視ftp伺服器的相關組態檔
[root@localhost ~]# rpm -ql vsftpd 
/etc/logrotate.d/vsftpd
/etc/pam.d/vsftpd
/etc/vsftpd
/etc/vsftpd/ftpusers
/etc/vsftpd/user_list
/etc/vsftpd/vsftpd.conf
/etc/vsftpd/vsftpd_conf_migrate.sh
/usr/lib/systemd/system-generators/vsftpd-generator
/usr/lib/systemd/system/vsftpd.service
/usr/lib/systemd/system/vsftpd.target
/usr/lib/systemd/system/[email protected]
/usr/sbin/vsftpd
/usr/share/doc/vsftpd-3.0.2
/usr/share/doc/vsftpd-3.0.2/AUDIT
/usr/share/doc/vsftpd-3.0.2/BENCHMARKS
/usr/share/doc/vsftpd-3.0.2/BUGS
/usr/share/doc/vsftpd-3.0.2/COPYING
/usr/share/doc/vsftpd-3.0.2/Changelog
/usr/share/doc/vsftpd-3.0.2/EXAMPLE
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE/README
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE/README.configuration
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE/vsftpd.conf
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE/vsftpd.xinetd
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE_NOINETD
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE_NOINETD/README
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE_NOINETD/README.configuration
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE_NOINETD/vsftpd.conf
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/PER_IP_CONFIG
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/PER_IP_CONFIG/README
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/PER_IP_CONFIG/README.configuration
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/PER_IP_CONFIG/hosts.allow
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/README
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/VIRTUAL_HOSTS
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/VIRTUAL_HOSTS/README
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/VIRTUAL_USERS
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/VIRTUAL_USERS/README
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/VIRTUAL_USERS/README.configuration
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/VIRTUAL_USERS/logins.txt
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/VIRTUAL_USERS/vsftpd.conf
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/VIRTUAL_USERS/vsftpd.pam
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/VIRTUAL_USERS_2
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/VIRTUAL_USERS_2/README
/usr/share/doc/vsftpd-3.0.2/FAQ
/usr/share/doc/vsftpd-3.0.2/INSTALL
/usr/share/doc/vsftpd-3.0.2/LICENSE
/usr/share/doc/vsftpd-3.0.2/README
/usr/share/doc/vsftpd-3.0.2/README.security
/usr/share/doc/vsftpd-3.0.2/REWARD
/usr/share/doc/vsftpd-3.0.2/SECURITY
/usr/share/doc/vsftpd-3.0.2/SECURITY/DESIGN
/usr/share/doc/vsftpd-3.0.2/SECURITY/IMPLEMENTATION
/usr/share/doc/vsftpd-3.0.2/SECURITY/OVERVIEW
/usr/share/doc/vsftpd-3.0.2/SECURITY/TRUST
/usr/share/doc/vsftpd-3.0.2/SIZE
/usr/share/doc/vsftpd-3.0.2/SPEED
/usr/share/doc/vsftpd-3.0.2/TODO
/usr/share/doc/vsftpd-3.0.2/TUNING
/usr/share/doc/vsftpd-3.0.2/vsftpd.xinetd
/usr/share/man/man5/vsftpd.conf.5.gz
/usr/share/man/man8/vsftpd.8.gz
/var/ftp
/var/ftp/pub



//實現ftp使用者端設定
//可能是系統自動升級正在執行,yum在鎖定狀態中,要等待那個程序結束退出(最好使用下該命令在進行下載)
[root@localhost network-scripts]# rm -f /var/run/yum.pid
[root@localhost network-scripts]# yum -y install lftp.x86_64 	//下載需要使用ftp的相關工具
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirrors.ustc.edu.cn
 * extras: mirrors.ustc.edu.cn
 * updates: mirrors.ustc.edu.cn
Resolving Dependencies
--> Running transaction check
---> Package lftp.x86_64 0:4.4.8-12.el7_8.1 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
================================================================================
 Package       Arch            Version                      Repository     Size
================================================================================
Installing:
 lftp          x86_64          4.4.8-12.el7_8.1             base          752 k
Transaction Summary
================================================================================
Install  1 Package
Total download size: 752 k
Installed size: 2.4 M
Downloading packages:
warning: /var/cache/yum/x86_64/7/base/packages/lftp-4.4.8-12.el7_8.1.x86_64.rpm: 
Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Public key for lftp-4.4.8-12.el7_8.1.x86_64.rpm is not installed
lftp-4.4.8-12.el7_8.1.x86_64.rpm                           | 752 kB   00:00     
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Importing GPG key 0xF4A80EB5:
 Userid     : "CentOS-7 Key (CentOS 7 Official Signing Key) <[email protected]>"
 Fingerprint: 6341 ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5
 Package    : centos-release-7-9.2009.0.el7.centos.x86_64 (@anaconda)
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : lftp-4.4.8-12.el7_8.1.x86_64                                 1/1 
  Verifying  : lftp-4.4.8-12.el7_8.1.x86_64                                 1/1 
Installed:
  lftp.x86_64 0:4.4.8-12.el7_8.1                                                
Complete!



[root@localhost ~]# lftp 192.168.126.131     //使用者端通過lftp連線ftp伺服器
lftp 192.168.126.131:~>                      //成功通過匿名連上ftp伺服器
lftp 192.168.126.131:~> ls
drwxr-xr-x    2 0        0               6 Oct 13  2020 pub		//pub為匿名使用者的家目錄
lftp 192.168.126.131:/> pwd
ftp://192.168.126.131/				                   //表示在ftp伺服器的家目錄上

//測試使用者端從ftp伺服器上下載檔案
伺服器端
[root@localhost ~]# cd /var/ftp/                                
[root@localhost ftp]# ls
pub
[root@localhost ftp]# echo 13 > 1.txt      //ftp伺服器端上寫一個檔案,用於使用者端下載測試
[root@localhost ftp]# ls
1.txt  pub
使用者端
[root@localhost ~]# lftp 192.168.126.131
lftp 192.168.126.131:~> ls
-rw-r--r--    1 0        0               3 Oct 16 08:50 1.txt
drwxr-xr-x    2 0        0               6 Oct 13  2020 pub
lftp 192.168.126.131:/> get 1.txt          //使用者端下載ftp伺服器上1.txt檔案(使用get命令)
3 bytes transferred
[root@localhost ~]# ls                     //與伺服器斷開連線後發現檔案已經下載到了主機上的家目錄上
1.txt            Desktop    Downloads             Music     Public     Videos
anaconda-ks.cfg  Documents  initial-setup-ks.cfg  Pictures  Templates
[root@localhost ~]# cat 1.txt 
13
//匿名使用者登入到ftp伺服器上下載檔案時的預設下載路徑是在登入ftp伺服器時所在的路徑上。(預設的下載路徑)
//修改從ftp伺服器上下載檔案的預設路徑
lftp 192.168.126.131:~> lcd /root/Desktop/1
lcd ok, local cwd=/root/Desktop/1
lftp 192.168.126.131:~> get 1.txt 
3 bytes transferred
[root@localhost 1]# ll            //使用者端斷開連線之後看見1.txt已經從ftp伺服器上下載到/root/Desktop/1上
total 4
-rw-r--r--. 1 root root 3 Oct 16 16:50 1.txt



//測試使用者端上傳檔案到ftp伺服器上
//結論:匿名使用者無法在ftp伺服器上總結上傳檔案
使用者端
[root@localhost 1]# echo 12 > 2.txt 
[root@localhost 1]# ll
total 8
-rw-r--r--. 1 root root 3 Oct 16 16:50 1.txt
-rw-r--r--. 1 root root 3 Oct 16 17:03 2.txt
//使用者端通過連線上ftp伺服器上並且上傳使用者端的2.txt檔案到ftp伺服器上
[root@localhost ~]# lftp 192.168.126.131          //此時的預設下載路徑為root/Desktop/1
lftp 192.168.126.131:/> put 2.txt 	        	        //上傳檔案用put命令
put: Access failed: 550 Permission denied. (2.txt)		           //回顯結果:許可權被拒絕了
//上傳檔案時的許可權被拒絕了的原因是:匿名使用者在ftp伺服器端預設(不修改組態檔時)只有下載的許可權

//解決辦法:通過修改組態檔能夠實現匿名使用者能夠在ftp伺服器上成功上傳檔案
伺服器上
//讓匿名使用者可以實現檔案的上傳,首先改變檔案裡面的許可權
//完成ftp伺服器端允許anonymous的上傳設定(修改主組態檔)
[root@localhost ftp]# grep -n "anon_upload_enable" /etc/vsftpd/vsftpd.conf        //將該註釋解除
29:anon_upload_enable=YES
//為ftp伺服器用於上傳時所使用的資料夾設定相應許可權
[root@localhost ftp]# cd /var/ftp        	       //進入ftp伺服器所在位置
[root@localhost ftp]# mkdir -p /var/ftp/upload   //在ftp伺服器下(/var/ftp/)建立一個資料夾用於存放使用者上傳的檔案
[root@localhost ftp]# ll
drwxr-xr-x. 2 root root 6 Oct 17 10:47 upload
[root@localhost ftp]# chown ftp /var/ftp/upload  //修改使用者主屬
[root@localhost ftp]# ll
drwxr-xr-x. 2 ftp root 6 Oct 17 10:47 upload
對selinux安全進行設定
[root@localhost ftp]# setsebool -P allow_ftpd_full_access on
[root@localhost ftp]# setsebool -P tftp_home_dir on
重啟服務(ftp伺服器設定)
[root@localhost ftp]# systemctl restart vsftpd
[root@localhost ftp]# systemctl restart vsftpd.service 
//實現了匿名使用者成功上傳檔案到ftp伺服器端
使用者端上傳檔案
[root@localhost ~]# lftp 192.168.126.131
lftp 192.168.126.131:~> ls
-rw-r--r--    1 0        0               3 Oct 16 08:50 1.txt
drwxr-xr-x    2 0        0               6 Oct 13  2020 pub
drwxr-xr-x    2 14       0               6 Oct 16 13:28 upload
lftp 192.168.126.131:/> cd upload
lftp 192.168.126.131:/upload> put 2.txt 
3 bytes transferred
lftp 192.168.126.131:/upload> 
伺服器檢視檔案
root@localhost ftp]# cd upload
[root@localhost upload]# ll
-rw-------. 1 ftp ftp 19 Oct 17 10:54 2.txt

4、【DNS伺服器搭建】

【DNS伺服器搭建】

前提:實現得做好本地源的搭建和相關服務的關閉。 
			

伺服器端的設定

 ①下載DNS伺服器
 //下載DNS伺服器
 [root@localhost ~]# yum -y install bind                        //bind為linux當中DNS伺服器的名字
 Loaded plugins: fastestmirror, langpacks
 Loading mirror speeds from cached hostfile
 local-yum                                                             | 3.6 kB 00:00:00     
 Resolving Dependencies
 --> Running transaction check
 ---> Package bind.x86_64 32:9.11.4-26.P2.el7 will be installed
 --> Finished Dependency Resolution
 ​
 Dependencies Resolved
 ​
 ==============================================================================================
  Package         Arch             Version                         Repository           Size
 ==============================================================================================
 Installing:
  bind           x86_64           32:9.11.4-26.P2.el7             local-yum           2.3 M
 ​
 Transaction Summary
 ==============================================================================================
 Install 1 Package
 ​
 Total download size: 2.3 M
 Installed size: 5.4 M
 Downloading packages:
 Running transaction check
 Running transaction test
 Transaction test succeeded
 Running transaction
  Installing : 32:bind-9.11.4-26.P2.el7.x86_64                                           1/1 
  Verifying : 32:bind-9.11.4-26.P2.el7.x86_64                                           1/1 
 ​
 Installed:
  bind.x86_64 32:9.11.4-26.P2.el7                                                             
 ​
 Complete!
 
//檢視下載好的DNS服務
 [root@localhost ~]# rpm -ql bind                            //檢視DNS伺服器的組態檔
 /etc/logrotate.d/named
 /etc/named
 /etc/named.conf                                //主組態檔(重要,需要修改)
 /etc/named.iscdlv.key
 /etc/named.rfc1912.zones                                //定義域檔案(重要,需要修改)
 /etc/named.root.key
 /etc/rndc.conf
 /etc/rndc.key
 /etc/rwtab.d/named
 /etc/sysconfig/named
 /run/named
 /usr/bin/arpaname
 /usr/bin/named-rrchecker
 /usr/lib/python2.7/site-packages/isc
 /usr/lib/python2.7/site-packages/isc-2.0-py2.7.egg-info
 /usr/lib/python2.7/site-packages/isc/__init__.py
 /usr/lib/python2.7/site-packages/isc/__init__.pyc
 /usr/lib/python2.7/site-packages/isc/__init__.pyo
 /usr/lib/python2.7/site-packages/isc/checkds.py
 /usr/lib/python2.7/site-packages/isc/checkds.pyc
 /usr/lib/python2.7/site-packages/isc/checkds.pyo
 /usr/lib/python2.7/site-packages/isc/coverage.py
 /usr/lib/python2.7/site-packages/isc/coverage.pyc
 /usr/lib/python2.7/site-packages/isc/coverage.pyo
 /usr/lib/python2.7/site-packages/isc/dnskey.py
 /usr/lib/python2.7/site-packages/isc/dnskey.pyc
 /usr/lib/python2.7/site-packages/isc/dnskey.pyo
 /usr/lib/python2.7/site-packages/isc/eventlist.py
 /usr/lib/python2.7/site-packages/isc/eventlist.pyc
 /usr/lib/python2.7/site-packages/isc/eventlist.pyo
 /usr/lib/python2.7/site-packages/isc/keydict.py
 /usr/lib/python2.7/site-packages/isc/keydict.pyc
 /usr/lib/python2.7/site-packages/isc/keydict.pyo
 /usr/lib/python2.7/site-packages/isc/keyevent.py
 /usr/lib/python2.7/site-packages/isc/keyevent.pyc
 /usr/lib/python2.7/site-packages/isc/keyevent.pyo
 /usr/lib/python2.7/site-packages/isc/keymgr.py
 /usr/lib/python2.7/site-packages/isc/keymgr.pyc
 /usr/lib/python2.7/site-packages/isc/keymgr.pyo
 /usr/lib/python2.7/site-packages/isc/keyseries.py
 /usr/lib/python2.7/site-packages/isc/keyseries.pyc
 /usr/lib/python2.7/site-packages/isc/keyseries.pyo
 /usr/lib/python2.7/site-packages/isc/keyzone.py
 /usr/lib/python2.7/site-packages/isc/keyzone.pyc
 /usr/lib/python2.7/site-packages/isc/keyzone.pyo
 /usr/lib/python2.7/site-packages/isc/parsetab.py
 /usr/lib/python2.7/site-packages/isc/parsetab.pyc
 /usr/lib/python2.7/site-packages/isc/parsetab.pyo
 /usr/lib/python2.7/site-packages/isc/policy.py
 /usr/lib/python2.7/site-packages/isc/policy.pyc
 /usr/lib/python2.7/site-packages/isc/policy.pyo
 /usr/lib/python2.7/site-packages/isc/rndc.py
 /usr/lib/python2.7/site-packages/isc/rndc.pyc
 /usr/lib/python2.7/site-packages/isc/rndc.pyo
 /usr/lib/python2.7/site-packages/isc/utils.py
 /usr/lib/python2.7/site-packages/isc/utils.pyc
 /usr/lib/python2.7/site-packages/isc/utils.pyo
 /usr/lib/systemd/system/named-setup-rndc.service
 /usr/lib/systemd/system/named.service
 /usr/lib/tmpfiles.d/named.conf
 /usr/lib64/bind
 /usr/libexec/generate-rndc-key.sh
 /usr/sbin/ddns-confgen
 /usr/sbin/dnssec-checkds
 /usr/sbin/dnssec-coverage
 /usr/sbin/dnssec-dsfromkey
 /usr/sbin/dnssec-importkey
 /usr/sbin/dnssec-keyfromlabel
 /usr/sbin/dnssec-keygen
 /usr/sbin/dnssec-keymgr
 /usr/sbin/dnssec-revoke
 /usr/sbin/dnssec-settime
 /usr/sbin/dnssec-signzone
 /usr/sbin/dnssec-verify
 /usr/sbin/genrandom
 /usr/sbin/isc-hmac-fixup
 /usr/sbin/lwresd
 /usr/sbin/named
 /usr/sbin/named-checkconf                                //檢查組態檔(檢查命令,重要)
 /usr/sbin/named-checkzone                                //檢查域檔案(檢查命令,重要)
 /usr/sbin/named-compilezone
 /usr/sbin/named-journalprint
 /usr/sbin/nsec3hash
 /usr/sbin/rndc
 /usr/sbin/rndc-confgen
 /usr/sbin/tsig-keygen
 /usr/share/doc/bind-9.11.4
 /usr/share/doc/bind-9.11.4/Bv9ARM.ch01.html
 /usr/share/doc/bind-9.11.4/Bv9ARM.ch02.html
 /usr/share/doc/bind-9.11.4/Bv9ARM.ch03.html
 /usr/share/doc/bind-9.11.4/Bv9ARM.ch04.html
 /usr/share/doc/bind-9.11.4/Bv9ARM.ch05.html
 /usr/share/doc/bind-9.11.4/Bv9ARM.ch06.html
 /usr/share/doc/bind-9.11.4/Bv9ARM.ch07.html
 /usr/share/doc/bind-9.11.4/Bv9ARM.ch08.html
 /usr/share/doc/bind-9.11.4/Bv9ARM.ch09.html
 /usr/share/doc/bind-9.11.4/Bv9ARM.ch10.html
 /usr/share/doc/bind-9.11.4/Bv9ARM.ch11.html
 /usr/share/doc/bind-9.11.4/Bv9ARM.ch12.html
 /usr/share/doc/bind-9.11.4/Bv9ARM.ch13.html
 /usr/share/doc/bind-9.11.4/Bv9ARM.html
 /usr/share/doc/bind-9.11.4/Bv9ARM.pdf
 /usr/share/doc/bind-9.11.4/CHANGES
 /usr/share/doc/bind-9.11.4/README
 /usr/share/doc/bind-9.11.4/isc-logo.pdf
 /usr/share/doc/bind-9.11.4/man.arpaname.html
 /usr/share/doc/bind-9.11.4/man.ddns-confgen.html
 /usr/share/doc/bind-9.11.4/man.delv.html
 /usr/share/doc/bind-9.11.4/man.dig.html
 /usr/share/doc/bind-9.11.4/man.dnssec-checkds.html
 /usr/share/doc/bind-9.11.4/man.dnssec-coverage.html
 /usr/share/doc/bind-9.11.4/man.dnssec-dsfromkey.html
 /usr/share/doc/bind-9.11.4/man.dnssec-importkey.html
 /usr/share/doc/bind-9.11.4/man.dnssec-keyfromlabel.html
 /usr/share/doc/bind-9.11.4/man.dnssec-keygen.html
 /usr/share/doc/bind-9.11.4/man.dnssec-keymgr.html
 /usr/share/doc/bind-9.11.4/man.dnssec-revoke.html
 /usr/share/doc/bind-9.11.4/man.dnssec-settime.html
 /usr/share/doc/bind-9.11.4/man.dnssec-signzone.html
 /usr/share/doc/bind-9.11.4/man.dnssec-verify.html
 /usr/share/doc/bind-9.11.4/man.dnstap-read.html
 /usr/share/doc/bind-9.11.4/man.genrandom.html
 /usr/share/doc/bind-9.11.4/man.host.html
 /usr/share/doc/bind-9.11.4/man.isc-hmac-fixup.html
 /usr/share/doc/bind-9.11.4/man.lwresd.html
 /usr/share/doc/bind-9.11.4/man.mdig.html
 /usr/share/doc/bind-9.11.4/man.named-checkconf.html
 /usr/share/doc/bind-9.11.4/man.named-checkzone.html
 /usr/share/doc/bind-9.11.4/man.named-journalprint.html
 /usr/share/doc/bind-9.11.4/man.named-nzd2nzf.html
 /usr/share/doc/bind-9.11.4/man.named-rrchecker.html
 /usr/share/doc/bind-9.11.4/man.named.conf.html
 /usr/share/doc/bind-9.11.4/man.named.html
 /usr/share/doc/bind-9.11.4/man.nsec3hash.html
 /usr/share/doc/bind-9.11.4/man.nslookup.html
 /usr/share/doc/bind-9.11.4/man.nsupdate.html
 /usr/share/doc/bind-9.11.4/man.pkcs11-destroy.html
 /usr/share/doc/bind-9.11.4/man.pkcs11-keygen.html
 /usr/share/doc/bind-9.11.4/man.pkcs11-list.html
 /usr/share/doc/bind-9.11.4/man.pkcs11-tokens.html
 /usr/share/doc/bind-9.11.4/man.rndc-confgen.html
 /usr/share/doc/bind-9.11.4/man.rndc.conf.html
 /usr/share/doc/bind-9.11.4/man.rndc.html
 /usr/share/doc/bind-9.11.4/named.conf.default
 /usr/share/doc/bind-9.11.4/notes.html
 /usr/share/doc/bind-9.11.4/notes.pdf
 /usr/share/doc/bind-9.11.4/sample
 /usr/share/doc/bind-9.11.4/sample/etc
 /usr/share/doc/bind-9.11.4/sample/etc/named.conf
 /usr/share/doc/bind-9.11.4/sample/etc/named.rfc1912.zones
 /usr/share/doc/bind-9.11.4/sample/var
 /usr/share/doc/bind-9.11.4/sample/var/named
 /usr/share/doc/bind-9.11.4/sample/var/named/data
 /usr/share/doc/bind-9.11.4/sample/var/named/my.external.zone.db
 /usr/share/doc/bind-9.11.4/sample/var/named/my.internal.zone.db
 /usr/share/doc/bind-9.11.4/sample/var/named/named.ca
 /usr/share/doc/bind-9.11.4/sample/var/named/named.empty
 /usr/share/doc/bind-9.11.4/sample/var/named/named.localhost
 /usr/share/doc/bind-9.11.4/sample/var/named/named.loopback
 /usr/share/doc/bind-9.11.4/sample/var/named/slaves
 /usr/share/doc/bind-9.11.4/sample/var/named/slaves/my.ddns.internal.zone.db
 /usr/share/doc/bind-9.11.4/sample/var/named/slaves/my.slave.internal.zone.db
 /usr/share/man/man1/arpaname.1.gz
 /usr/share/man/man1/named-rrchecker.1.gz
 /usr/share/man/man5/named.conf.5.gz
 /usr/share/man/man5/rndc.conf.5.gz
 /usr/share/man/man8/ddns-confgen.8.gz
 /usr/share/man/man8/dnssec-checkds.8.gz
 /usr/share/man/man8/dnssec-coverage.8.gz
 /usr/share/man/man8/dnssec-dsfromkey.8.gz
 /usr/share/man/man8/dnssec-importkey.8.gz
 /usr/share/man/man8/dnssec-keyfromlabel.8.gz
 /usr/share/man/man8/dnssec-keygen.8.gz
 /usr/share/man/man8/dnssec-keymgr.8.gz
 /usr/share/man/man8/dnssec-revoke.8.gz
 /usr/share/man/man8/dnssec-settime.8.gz
 /usr/share/man/man8/dnssec-signzone.8.gz
 /usr/share/man/man8/dnssec-verify.8.gz
 /usr/share/man/man8/genrandom.8.gz
 /usr/share/man/man8/isc-hmac-fixup.8.gz
 /usr/share/man/man8/lwresd.8.gz
 /usr/share/man/man8/named-checkconf.8.gz
 /usr/share/man/man8/named-checkzone.8.gz
 /usr/share/man/man8/named-compilezone.8.gz
 /usr/share/man/man8/named-journalprint.8.gz
 /usr/share/man/man8/named.8.gz
 /usr/share/man/man8/nsec3hash.8.gz
 /usr/share/man/man8/rndc-confgen.8.gz
 /usr/share/man/man8/rndc.8.gz
 /usr/share/man/man8/tsig-keygen.8.gz
 /var/log/named.log
 /var/named
 /var/named/data
 /var/named/dynamic
 /var/named/named.ca
 /var/named/named.empty
 /var/named/named.localhost                                //正向解析區域的模板(重要,需要修改)
 /var/named/named.loopback                                        //反向解析區域的模板(重要,需要修改)
 /var/named/slaves
 
②修改DNS相關的四個組態檔
①修改主組態檔
[root@localhost named]# cp /etc/named.conf /etc/named.conf.bak
[root@localhost named]# vim /etc/named.conf
[root@localhost named]# cat /etc/named.conf
 //
 // named.conf
 //
 // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
 // server as a caching only nameserver (as a localhost DNS resolver only).
 //
 // See /usr/share/doc/bind*/sample/ for example named configuration files.
 //
 // See the BIND Administrator's Reference Manual (ARM) for details about the
 // configuration located in /usr/share/doc/bind-{version}/Bv9ARM.html
 ​
 options {
 listen-on port 53 { 127.0.0.1;any; };                                                //使用53埠進行監聽。加上「any;」----表示監聽區域網內本地和任意所有地址,並給予反饋
 listen-on-v6 port 53 { ::1; };
 directory "/var/named";
 dump-file "/var/named/data/cache_dump.db";
 statistics-file "/var/named/data/named_stats.txt";
 memstatistics-file "/var/named/data/named_mem_stats.txt";
 recursing-file "/var/named/data/named.recursing";
 secroots-file   "/var/named/data/named.secroots";
 allow-query     { localhost;any; };                                                //加上「any;」----表示全網都所有裝置都可以查詢DNS伺服器
 ​
 /* 
  - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
  - If you are building a RECURSIVE (caching) DNS server, you need to enable 
    recursion. 
  - If your recursive DNS server has a public IP address, you MUST enable access 
    control to limit queries to your legitimate users. Failing to do so will
    cause your server to become part of large scale DNS amplification 
    attacks. Implementing BCP38 within your network would greatly
    reduce such attack surface 
 */
 recursion yes;
 ​
 dnssec-enable no;                       //no表示不需要校驗(由於是我們本地自己搭建的DNS伺服器,所以不需要校驗)
 dnssec-validation no;                   //no表示不需要校驗
 ​
 /* Path to ISC DLV key */
 bindkeys-file "/etc/named.root.key";
 ​
 managed-keys-directory "/var/named/dynamic";
 ​
 pid-file "/run/named/named.pid";
 session-keyfile "/run/named/session.key";
 };
 ​
 logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
 };
 ​
 zone "." IN {
 type hint;
 file "named.ca";
 };
 ​
 include "/etc/named.rfc1912.zones";
 include "/etc/named.root.key";
 ​

[rootlocalhost Desktop]# ls /etc/ l grep "name"                //檢索檔案(但不需要/建議精確簡述)
hostname
named
named.conf
named.conf.bak
named.iscdlv.key
named.rfc1912.zones
named.root.key

 ②//修改定義域檔案--正向/反向區域相關的檔案(實現域名與IP地址的對應關係)
[root@localhost named]# cp /etc/named.rfc1912.zones /etc/named.rfc1912.zones.bak
[root@localhost named]# vim /etc/named.rfc1912.zones
[root@localhost named]# cat /etc/named.rfc1912.zones 
 // named.rfc1912.zones:
 //
 // Provided by Red Hat caching-nameserver package 
 //
 // ISC BIND named zone configuration for zones recommended by
 // RFC 1912 section 4.1 : localhost TLDs and address zones
 // and http://www.ietf.org/internet-drafts/draft-ietf-dnsop-default-local-zones-02.txt
 // (c)2007 R W Franks
 // 
 // See /usr/share/doc/bind*/sample/ for example named configuration files.
 //
 ​
 zone "localhost.localdomain" IN {
 type master;
 file "named.localhost";
 allow-update { none; };
 };
 ​
 zone "localhost" IN {
 type master;
 file "named.localhost";              //套用該模板進行正向解析改寫(需要與正向區域相關檔案的檔名對應上)
 allow-update { none; };
 };
 ​
 zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
 type master;
 file "named.loopback";                                                
 allow-update { none; };
 };

 ​//直接在原有模板上操作
 zone "1.16.172.in-addr.arpa" IN {              //修改域名(反向填寫,只寫網路位的原因:讓域名對應多個IP地址)
 type master;
 file "172.16.1.zone";                 //修改檔名(無特殊要求),切記一定需要與反向區域相關檔案的檔名對應上
 allow-update { none; };
 };
 ​
 zone "0.in-addr.arpa" IN {            //套用該模板進行反向解析改寫(需要與反向區域相關檔案的檔名對應上)
 type master;
 file "named.empty";
 allow-update { none; };
 };

 ​//套用以上的模板在末尾再新增一條
 zone "xzm.com" IN {                      //修改域名
 type master;
 file "xzm.com.zone";                  //修改檔名(無特殊要求),切記一定需要與正向區域相關檔案的檔名對應上
 allow-update { none; };
 };

 
					
③//改兩個模板檔案
先進行備份(備份名必須與正向/反向區域相關的檔案保持一致)
 [root@localhost Desktop]# cd /var/named/
 [root@localhost named]# ll
 total 16
 drwxrwx---. 2 named named   6 Oct 13 2020 data
 drwxrwx---. 2 named named   6 Oct 13 2020 dynamic
 -rw-r-----. 1 root named 2253 Apr 5 2018 named.ca
 -rw-r-----. 1 root named 152 Dec 15 2009 named.empty
 -rw-r-----. 1 root named 152 Jun 21 2007 named.localhost
 -rw-r-----. 1 root named 168 Dec 15 2009 named.loopback
 drwxrwx---. 2 named named   6 Oct 13 2020 slaves

//注意cp的檔名(cp完之後就可以直接修改xzm.com.zone和172.16.1.zone檔案-->原因是上面我們已經將定義域檔案進行修改了)
 [root@localhost named]# cp -p named.localhost xzm.com.zone     //cp帶引數-p表示複製時將許可權也一併複製過去
 [root@localhost named]# cp -p named.loopback 172.16.1.zone
 [root@localhost named]# ll
 total 24
 -rw-r-----. 1 root named 168 Dec 15 2009 172.16.1.zone
 drwxrwx---. 2 named named   6 Oct 13 2020 data
 drwxrwx---. 2 named named   6 Oct 13 2020 dynamic
 -rw-r-----. 1 root named 2253 Apr 5 2018 named.ca
 -rw-r-----. 1 root named 152 Dec 15 2009 named.empty
 -rw-r-----. 1 root named 152 Jun 21 2007 named.localhost
 -rw-r-----. 1 root named 168 Dec 15 2009 named.loopback
 drwxrwx---. 2 named named   6 Oct 13 2020 slaves
 -rw-r-----. 1 root named 152 Jun 21 2007 xzm.com.zone
 ​
 ​//進行編輯
 [root@localhost named]# vim xzm.con.zone 
 [root@localhost named]# vim 192.16.1.zone 

//修改後的檔案內容如下: 
//正向解析檔案:
 [root@localhost named]# cat xzm.com.zone 
 $TTL 1D                    //TTL:生存值/生存週期。TTL 1D代表生存值為一天
 @ IN SOA xzm.com. rname.invalid. (                          //@修改成xzm.com.。原@代表當前域。在xzm.com.末尾必須加上一個點,必須要將根域名補上。
 0; serial//域名後加點的原因:在公網伺服器上域名末尾會主動補齊末尾點。而現在在自己的伺服器上,由於沒有公網伺服器相關發服務所以必須加點
 1D; refresh
 1H; retry
 1W; expire
 3H ); minimum
 @        NS        dns.xzm.com.        //將@修改成dns.xzm.com.。然後在該行首處加上@表示要寫一個當前域。
 dns        A        192.168.126.131    //A:一個A表示是一個IPv4的地址。 192.168.126.131是本臺DNS伺服器所對應的IP地址
 www        A        172.16.1.1          //www表示要寫一個阿帕奇網站之類的。 172.16.1.1是xzm.com.對應的IP地址
//實現將xzm.com.解析成172.16.1.1
//反向解析檔案:
 [root@localhost named]# cat 172.16.1.zone 
 $TTL 1D
 @IN SOA xzm.com. rname.invalid. (                //xzm.com.:最後一個點表示根域名
 0; serial
 1D; refresh
 1H; retry
 1W; expire
 3H ); minimum
 @        NS        dns.xzm.com.
 dns        A        192.168.126.131
 1        PTR        xzm.com.                                //PTR:反向解析。這裡寫主機名,域dns對應

//域名解析檔案介紹:
$TTL:快取的生存週期
@:當前域
IN:網際網路
SOA:開始授權
NS:DNS伺服器端
A:lPv4正向記錄
AAAA:lPv6正向記錄

③檢查命令			
//檢查命令
 [root@localhost named]# named-checkconf /etc/named.conf 
 [root@localhost named]# named-checkconf /etc/named.rfc1912.zones 
 [root@localhost named]# named-checkzone xzm.com.zone xzm.com.zone 
 zone xzm.com.zone/IN: loaded serial 0
 OK
 [root@localhost named]# named-checkzone 172.16.1.zone 172.16.1.zone 
 zone 172.16.1.zone/IN: loaded serial 0
 OK

 ④重啟dns服務	
[root@localhost named]# systemctl restart named
         
使用者端設定
[root@localhost ~]# cat /etc/resolv.conf             //當前整個系統裡的DNS快取
# Generated by NetworkManager
nameserver 218.85.157.99
nameserver 114.114.114.114                                                                                                                                                                                     //下面命令是將本地DNS伺服器的地址指向已搭建完成的DNS伺服器地址
[root@localhost ~]# echo nameserver 192.168.126.131 > /etc/resolv.conf
[root@localhost ~]# nslookup www.xzm.com                    //測試DNS伺服器的小工具
Server:                192.168.126.131
Address:        192.168.126.131#53
Name:        www.xzm.com
Address: 172.16.1.1
[root@localhost ~]# nslookup 172.16.1.1
1.1.16.172.in-addr.arpa        name = xzm.com.


//kali linux 測試:
 ┌──(root㉿kali)-[~]
 └─# cat /etc/resolv.conf 
 # Generated by NetworkManager
 search localdomain
 nameserver 192.168.126.2
                                                                              
 ┌──(root㉿kali)-[~]
 └─# echo nameserver 192.168.126.131 > /etc/resolv.conf 
                                                                              
 ┌──(root㉿kali)-[~]
 └─# nslookup www.xzm.com
 Server:         192.168.126.131
 Address:       192.168.126.131#53
 ​
 Name:   www.xzm.com
 Address: 172.16.1.1
 ​
                                                                              
 ┌──(root㉿kali)-[~]
 └─# nslookup 172.16.1.1 
 1.1.16.172.in-addr.arpa name = xzm.com.

15、Linux紀錄檔審計

1、紀錄檔檔案的功能和分類

紀錄檔的功能

用於記錄系統、程式執行中發生的各種事件。

通過閱讀紀錄檔,有助於診斷和解決系統故障紀錄檔。

檔案的分類

1、核心及系統紀錄檔:由系統 syslog 統一進行管理,紀錄檔格式基本相似。

2、使用者紀錄檔/服務紀錄檔:記錄系統使用者登入及退出系統的相關資訊。(啟動時必須要有的服務資訊-ssh/dhcp)

3、程式:由各種應用程式獨立管理的紀錄檔檔案,記錄格式不統一。(額外下載的程式)

紀錄檔屬於核心的一部分。 
核心:在啟動的過程當中,檔案系統是後載入。但沒載入檔案系統的話則資料無法進行處理,無法將檔案系統載入之前的資料進行關聯。
核心紀錄檔:呼叫核心時產生的紀錄檔訊息,會單獨存放在核心紀錄檔當中。
資料的管理方式通過檔案系統實現。
syslog(回撥函數):是紀錄檔記錄的統一標準。
syslogd/dmesg程序一般是可以被人為終止、呼叫的,但守護行程不接受任何終端控制(隨著系統開啟而開啟,隨著系統關閉而關閉)。

2、紀錄檔檔案儲存位置和檔案介紹

Linux作業系統本身和大部分伺服器程式的紀錄檔檔案都預設放在目錄/var/log/下。

一部分程式共用一個紀錄檔檔案,一部分程式使用單個紀錄檔檔案,而有些大型伺服器程式由於紀錄檔檔案不止一個,所以會在/var/log/目錄中建立相應的子目錄來存放紀錄檔檔案,這樣既保證了紀錄檔檔案目錄的結構清晰,又可以快速定位紀錄檔檔案。

有相當一部分紀錄檔檔案只有root使用者才有許可權讀取,這保證了相關紀錄檔資訊的安全性。

Linux紀錄檔檔案常用的儲存方式-->回滾切割:將紀錄檔分割為一部分一部分來進行儲存,這樣子的好處是單個紀錄檔檔案量不會很大,載入速度不會很慢,也方便檢視。

紀錄檔檔案儲存位置

/var/log/目錄下的紀錄檔檔案(紀錄檔儲存位置預設位於/var/log目錄下):(知道、瞭解)
/var/log/boot.log ->包含系統啟動時的紀錄檔/該檔案記錄了系統在引導過程中發生的事件
/var/log/utmp ->包含登入退出資訊
/var/log/secure ->包含驗證和授權資訊/Linux系統安全紀錄檔,記錄使用者和工作組的情況、使用者登陸認證情況。		(重要)
/var/log/dpkg.log ->包含安裝或dpkg命令清除軟體包的紀錄檔
/var/log/kern.log ->包含核心產生的紀錄檔,有助於在客製化核心時解決問題
/var/log/Xorg.x.log ->來自X的紀錄檔資訊
/var/log/alternatives.log ->更新替代資訊都記錄在這個檔案中
/var/log/cups ->涉及所有列印資訊的紀錄檔
/var/log/anaconda.log ->在安裝Linux時,所有安裝資訊都儲存在這個檔案中
/var/log/yum.log ->包含使用yum安裝的軟體包資訊
/var/log/cron ->每當cron程序進行一個工作,就會將相關資訊記錄在此檔案中/計劃任務	(重要)

檔案介紹

主要紀錄檔檔案介紹:
紀錄檔檔案					描述
/var/log/cron 		記錄了系統定時任務相關的紀錄檔
/var/log/cups		記錄列印資訊的紀錄檔
/var/log/dmesg		記錄了系統在開機時核心自檢的資訊,也可以使用dmesg命令直接檢視核心自檢資訊
/var/log/mailog		記錄郵件資訊
/var/log/message	記錄系統重要資訊的紀錄檔。這個紀錄檔檔案中會記錄Linux系統的絕大多數重要資訊,如果系統出現問題時,首先要檢查的就應該是這個紀錄檔檔案
/var/log/btmp		記錄錯誤登入紀錄檔,這個檔案是二進位制檔案
/var/log/lastlog	記錄系統中所有使用者最後一次登入時間的紀錄檔,這個檔案是二進位制檔案
/var/log/wtmp		永久記錄所有使用者的登入、登出資訊,同時記錄系統的啟動、重啟、關機事件。同樣這個檔案也是一個二進位制檔案
/var/log/utmp 		記錄當前已經登入的使用者資訊,這個檔案會隨著使用者的登入和登出不斷變化,只記錄當前登入使用者的資訊。同樣這個檔案不能直接vi,而要使用w,who,users等命令來查詢
/var/log/secure		記錄驗證和授權方面的資訊,只要涉及賬號和密碼的程式都會記錄,比如SSH登入,su切換使用者,sudo授權,甚至新增使用者和修改使用者密碼都會記錄在這個紀錄檔檔案中



核心及公共訊息紀錄檔(大部分程式的執行紀錄檔-一些錯誤資訊)/var/log/messages
[root@localhost log]# cd /var/log
[root@localhost log]# cat ./messages 
[root@localhost log]# tail -f /var/log/messages 	//tail -f表示顯示最後/最近的十條訊息(用於報錯時的檢查)
守護行程相關的紀錄檔(計算機啟動相關的核心紀錄檔):
[root@localhost log]# cat ./dmesg

3、管理紀錄檔服務的組態檔

//定義紀錄檔的存放過程以及紀錄檔的存放位置,在下面的檔案目錄下:
[root@localhost ~]# cat /etc/rsyslog.conf		//檢視紀錄檔存放的規定檔案(管理紀錄檔的組態檔)
# rsyslog configuration file

# For more information see /usr/share/doc/rsyslog-*/rsyslog_conf.html
# If you experience problems, see http://www.rsyslog.com/doc/troubleshoot.html

#### MODULES ####

# The imjournal module bellow is now used as a message source instead of imuxsock.
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
$ModLoad imjournal # provides access to the systemd journal
#$ModLoad imklog # reads kernel messages (the same are read from journald)
#$ModLoad immark  # provides --MARK-- message capability

# Provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514

# Provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514


#### GLOBAL DIRECTIVES ####

# Where to place auxiliary files
$WorkDirectory /var/lib/rsyslog

# Use default timestamp format
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

# File syncing capability is disabled by default. This feature is usually not required,
# not useful and an extreme performance hit
#$ActionFileEnableSync on

# Include all config files in /etc/rsyslog.d/
$IncludeConfig /etc/rsyslog.d/*.conf

# Turn off message reception via local log socket;
# local messages are retrieved through imjournal now.
$OmitLocalLogging on

# File to store the position in the journal
$IMJournalStateFile imjournal.state


#### RULES ####

# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                                 /dev/console
例:與kern.* 服務相關的均放入/dev/console檔案目錄下。
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none                /var/log/messages

# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure

# Log all the mail messages in one place.
mail.*                                                  -/var/log/maillog


# Log cron stuff
cron.*                                                  /var/log/cron

# Everybody gets emergency messages
*.emerg                                                 :omusrmsg:*

# Save news errors of level crit and higher in a special file.
uucp,news.crit                                          /var/log/spooler

# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log


# ### begin forwarding rule ###
# The statement between the begin ... end define a SINGLE forwarding
# rule. They belong together, do NOT split them. If you create multiple
# forwarding rules, duplicate the whole block!
# Remote Logging (we use TCP for reliable delivery)
#
# An on-disk queue is created for this action. If the remote host is
# down, messages are spooled to disk and sent when it is up again.
#$ActionQueueFileName fwdRule1 # unique name prefix for spool files
#$ActionQueueMaxDiskSpace 1g   # 1gb space limit (use as much as possible)
#$ActionQueueSaveOnShutdown on # save messages to disk on shutdown
#$ActionQueueType LinkedList   # run asynchronously
#$ActionResumeRetryCount -1    # infinite retries if host is down
# remote host is: name/ip:port, e.g. 192.168.0.1:514, port optional
#*.* @@remote-host:514
# ### end of the forwarding rule ###

4、核心及系統紀錄檔

這種紀錄檔資料由系統服務 rsyslog 統一管理,根據其主組態檔/etc/rsyslog.conf中的設定決定將核心訊息及各種系統程式訊息記錄到什麼位置。
系統中有相當一部分程式會把自己的紀錄檔檔案交由 rsyslog 管理,因而這些程式使用的紀錄檔記錄也具有相似的格式。

5、紀錄檔訊息的級別

紀錄檔訊息的級別(事件處理的輕重緩急):
0  EMERG(緊急):會導致主機系統不可用的情況
1  ALERT(警告):必須馬上採取措施解決問題
2  CRIT(嚴重):比較嚴重的情況
3  ERR(錯誤):執行出現錯誤(一般能處理的紀錄檔等級)(三級及三級以下就越來越嚴重了)
4  WARNING (提醒):可能會影響系統功能的事件
5  INFO(資訊):一般資訊
6  DEBUG(偵錯):程式或系統偵錯資訊等


紀錄檔訊息等級3:
[root@localhost ~]# systemctl restart NetworkManager	//當網路卡設定出現問題時可以選擇將該網路管理關閉,再重啟網路卡

6、紀錄檔記錄的一般格式

看訊息紀錄檔:(tail -f表示顯示最後的十條訊息)
基本解讀:①時間 ②主機名 ③服務/程序 ④訊息
systemd----表示核心程序
[root@localhost ~]# tail -f /var/log/messages
Oct 21 19:26:24 localhost pulseaudio: Most likely this is a bug in the ALSA driver 'snd_ens1371'. Please report this issue to the ALSA developers.
Oct 21 19:26:24 localhost pulseaudio: We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail.
Oct 21 19:30:01 localhost systemd: Started Session 4 of user root.
Oct 21 19:40:01 localhost systemd: Started Session 5 of user root.
Oct 21 19:42:14 localhost systemd: [/usr/lib/systemd/system/firstboot-graphical.service:14] Support for option SysVStartPriority= has been removed and it is ignored
Oct 21 19:42:14 localhost systemd: [/usr/lib/systemd/system/mdcheck_start.timer:12] Failed to parse calendar specification, ignoring: Sun *-*-1..7 1:00:00
Oct 21 19:42:14 localhost systemd: mdcheck_start.timer lacks value setting. Refusing.
Oct 21 19:42:28 localhost systemd: [/usr/lib/systemd/system/firstboot-graphical.service:14] Support for option SysVStartPriority= has been removed and it is ignored
Oct 21 19:42:28 localhost systemd: [/usr/lib/systemd/system/mdcheck_start.timer:12] Failed to parse calendar specification, ignoring: Sun *-*-1..7 1:00:00
Oct 21 19:42:28 localhost systemd: mdcheck_start.timer lacks value setting. Refusing.

7、使用者紀錄檔分析

暫無

8、程式紀錄檔分析

暫無

9、紀錄檔伺服器搭建

Linux紀錄檔伺服器搭建

10、補充

[root@localhost ~]# systemctl restart network       //重啟下網路    
[root@localhost ~]# tail -n 10 /var/log/messages | grep network    
//讀取最近10行訊息發現重啟網路卡記錄已經在紀錄檔檔案中當中存在(可用於網路服務的排錯) 
Oct 21 20:10:29 localhost systemd: Started LSB: Bring up/down networking.


檢索紀錄檔方法:
tail (預設檢視後10行)	【tail -f [路徑]】
	-n x:讀取最近x行訊息
	-Ax:關鍵詞所在行與其下x行訊息
	-Bx:關鍵詞所在行與其上x行訊息
tail -f file.log 	//持續輸出紀錄檔,可新增 | grep 「關鍵字」
tail -n 100 file.log | grep 「關鍵字」		//輸出檔案的後100行中包含的關鍵字的行(-n 100 即 –lines=100)
tail -n 100 file.log | grep 「關鍵字」 -A10		//輸出檔案的後100行中包含關鍵字的行和該行的後10行
tail -n 100 file.log | grep 「關鍵字」 -B10		//輸出檔案的後100行中包含關鍵字的行和該行的前10行
tail -n 100 file.log | grep 「關鍵字」 –B10-A10		//輸出檔案的後100行中包含關鍵字的行和該行的前後10行


[root@localhost ~]# systemctl list-unit-files | grep enabled	//顯示所有服務的列表,篩選出所有可用的服務


lastlog命令解讀:
[root@localhost ~]# lastlog -t 1000
Username         Port     From             Latest
root             :0                        Wed Sep 28 20:28:04 +0800 2022
gdm              :0                        Wed Sep 28 20:27:53 +0800 2022
xzm              :0                        Wed Sep 28 20:09:29 +0800 2022
reboot   system boot  3.10.0-1160.el7. Wed Sep 28 20:20 - 20:12 (1+23:51) 
①使用者名稱②終端③來源④開始時間⑤結束時間⑥持續時間
3.10.0-1160.el7.:核心版本
:0:本地登入
pts:是pty的實現方法/控制終端
tty:終端;虛擬終端pty(pseudo-tty)
lastb:登入失敗紀錄檔
last:登入成功紀錄檔 , 還可以檢視使用者線上狀態


[root@localhost ~]# lastlog -t 2	//最近兩天使用者登入訊息 
[root@localhost ~]# w		//顯示當前登入使用者及這些使用者正在做什麼的命令。它同時也能顯示系統執行時長,當前系統時間和系統平均負載情況。
[root@localhost ~]# lastb	//last與lastb命令用來列出目前與過去登入系統的使用者相關資訊。
[root@localhost ~]# ss      //ss是Socket Statistics的縮寫。顧名思義,ss命令可以用來獲取socket統計資訊,它可以顯示和netstat類似的內容。ss的優勢在於它能夠顯示更多更詳細的有關TCP和連線狀態的資訊,而且比netstat更快速更高效。
[root@localhost ~]# stat bbb  	//bbb為檔名(stat:時間命令)
Access: 2022-10-21 20:38:00.289546112 +0800	//最近一次存取
Modify: 2022-10-21 20:38:02.676545904 +0800	//最近一次修改
Change: 2022-10-21 20:38:02.676545904 +0800	//最近一次改變(chmod、chown)

16、Linux安全加固

安全加固思路

賬戶安全 -> 密碼策略 -> 當前開放的服務是否存在高危服務 -> 排查當前的系統中是否存在核心漏洞 -> 排查主機所在資訊系統所對應的管理制度是否恰當。

所有修改均需要root賬號下,修改前務必先備份,備份命名建議使⽤"⽂件名.日期.bak或⽂件名.bak"

1、賬號和口令

①禁用或刪除無用賬號
#目的:減少系統無用賬號,降低安全風險。
操作步驟:
使用命令 userdel <使用者名稱> 刪除不必要的賬號。
使用命令 passwd -l <使用者名稱> 鎖定不必要的賬號。
使用命令 passwd -u <使用者名稱> 解鎖必要的賬號。


②檢查特殊賬號
#目的:檢查是否存在空口令和root許可權的賬號。確認UID為零的賬號只有root賬號。
操作步驟:
檢視空口令和root許可權賬號,確認是否存在異常賬號:
使用命令 awk -F: '($2=="")' /etc/shadow 檢視空口令賬號。
使用命令 awk -F: '($3==0)' /etc/passwd 檢視UID為零的賬號。
加固空口令賬號:
使用命令 passwd <使用者名稱> 為空口令賬號設定密碼。


③新增口令策略
#目的:加強口令的複雜度等,降低被猜解的可能性。
1.使用命令 vim /etc/login.defs 修改密碼策略組態檔。
操作步驟:
cp /etc/login.defs /etc/login.defs.bak
PASS_MAX_DAYS 90 	#密碼最大使用期限	--等保要求密碼過期時間不能大於90天
PASS_MIN_DAYS 0  	#密碼最少使用天數 	--多少天后可以更改密碼,至少1天
PASS_MIN_LEN  5  	#密碼最小長度       --至少8位元,且必須包含字母,數位和字元中每樣至少一個
PASS_WARN_AGE 7 	#密碼到期前警告天數
以上密碼週期修改需要重啟系統才能⽣效,但不影響已建立的⽤戶。

2.使用chage命令修改使用者設定。
//例如,chage -m 0 -M 30 -E 2000-01-01 -W 7 <使用者名稱>表示將此使用者的密碼最長使用天數設為30,最短使用天數設為0,密碼2000年1月1日過期,過期前七天警告使用者。
//設定連續輸錯三次密碼,賬號鎖定五分鐘。使用命令vim /etc/pam.d/common-auth修改組態檔,在組態檔中新增 auth required pam_tally.so onerr=fail deny=3 unlock_time=300。
命令解讀:
cp /etc/pam.d/system-auth /etc/pam.d/system-auth.bak
vim /etc/pam.d/system-auth
password requisite pam_cracklib.so minlen=8 ucredit=-2 lcredit=-1 dcredit=-4 ocredit=-1 在pam_cracklib.so後⾯設定引數 如果原來就有設定,可以不⽤改
deny:允許輸錯密碼次數
unlock_time:解鎖時間,單位秒
account required pam_tally2.so deny=5 unlock_time=300

3.修改密碼複雜度設定
Debian/Ubuntu:修改⽂件vim /etc/pam.d/common-password
CentOS/RedHat/Fedora:修改⽂件vim /etc/pam.d/system-auth
password '[tab]' requisite '[tab]' pam_cracklib.so difok=3 minlen=8 ucredit=-1 lcredit=-1 dcredit=-1 
說明:
# difok=3 允許的新、舊密碼相同字元的個數為3
# minlen=8 最小長度為8
# ucredit=-1 限制新密碼中最少有1個大寫英文字元 負數表示最少,正數表示最多
# lcredit=-1 限制新密碼中最少有1個小寫英文字元
# dcredit=-1 限制新密碼中最少有1個數位字元
# ocredit=-1 限制新密碼中最少有1個標點字元
# 注:這個密碼強度的設定只對普通使用者有限制功能,root使用者無論修改root的密碼還是修改普通使用者的時候,不符合強度設定依然可以設定成功


④限制使用者su
#目的:限制能su到root的使用者。
操作步驟:
使用命令 vim /etc/pam.d/su修改組態檔,在組態檔中新增行。
例如,只允許test組使用者su到root,則新增 auth required pam_wheel.so group=test。


⑤禁止root使用者直接登入
#目的:限制root使用者直接登入。
操作步驟:
建立普通許可權賬號並設定密碼,防止無法遠端登入。
使用命令 vim /etc/ssh/sshd_config修改組態檔將PermitRootLogin的值改成no,並儲存,然後使用service sshd restart重啟服務。

2、服務、埠

①關閉/禁用不必要的服務
#目的:關閉不必要的服務(如普通服務和xinetd服務),降低風險。
1.操作步驟:
使用命令 systemctl disable <服務名> 設定服務在開機時不自動啟動。
說明:對於部分老版本的Linux作業系統(如CentOS 6),可以使用命令chkconfig --level <init級別> <服務名> off設定服務在指定init級別下開機時不自動啟動。需要關閉的服務有 cups, telnet, vsftpd, rlogin, rsh, printer, sendmail, ypbind, kshell, lpd, ident, tftp, time, ntalk, bootps, chargen, nfs, daytime, nfslock,echo, discard, klogin chkconfig --list

2.關閉服務
redhat 6.x 版本:service vsftpd stop
redhat 8.x 版本:systemctl stop vsftpd

3.關閉開機啟動
chkconfig vsftpd off


②SSH服務安全
#目的:對SSH服務進行安全加固,防止暴力破解成功。
操作步驟:
使用命令 vim /etc/ssh/sshd_config 編輯sshd伺服器端的組態檔。
1.不允許root賬號直接登入系統:設定PermitRootLogin的值為no。//禁止root賬戶登入
2.修改SSH使用的協定版本:設定Protocol的版本為 2。
3.修改允許密碼錯誤次數(預設6次):設定MaxAuthTries的值為 3。
4.組態檔修改完成後,重啟sshd服務生效。


③黑白名單檔案
遠端登入方式必須使用密文傳輸,遠端登入時不能使用預設管理員賬戶進行登入(如Linux系統的root,Windows系統的administrator)
SSH[密文-符合];Telnet[明文-不符合]
Liunx白名單檔案:/etc/hosts.allow
Liunx黑名單檔案:/etc/hosts.deny
相比於Linux的其他組態檔,改黑白名單檔案可以即時生效。且白名單的優先順序大於黑名單。
黑白名單新增格式:協定:地址


④關閉/禁用不必要的埠
1.需要禁⽤ 21 ftp 23 telnet 80:netstat -an | grep LISTEN
2.檢視端⼝使⽤的PID:lsof -i:21
3.關閉對應的服務:service vsftpd stop
4.直接殺死程序:kill -9 pid
5.關閉512、513、514端⼝
systemctl stop rsh.socket # 514 
systemctl stop rlogin.socket # 513
systemctl stop rexec.socket # 512
systemctl disable rsh.socket
systemctl disable rlogin.socket
systemctl disable rexec.socket
systemctl disable xinetd
systemctl stop xinetd
6.關閉53端⼝(DNS服務)
systemctl stop named.service
systemctl disable named.service
systemctl stop dnsmasq
systemctl disable dnsmasq
7.關閉25端⼝
systemctl disable postfix
systemctl stop postfix
gateway=`netstat -rn | grep 0.0.0.0 | awk '{ if($1=="0.0.0.0") {print $2} }'`

3、檔案系統

①設定umask值
#目的:設定預設的umask值,增強安全性。
操作步驟:
使用命令 vim /etc/profile 修改組態檔,新增行 umask 027, 即新建立的檔案屬主擁有讀寫執行許可權,同組使用者擁有讀和執行許可權,其他使用者無許可權。


②設定登入超時
#目的:設定系統登入後,連線超時時間,增強安全性。
操作步驟:
使用命令 vim /etc/profile 修改組態檔,將以 TMOUT= 開頭的行註釋,設定為TMOUT=180,即超時時間為三分鐘。


③三權分立
#目的:等保要求禁用預設賬戶和超級管理員賬戶,並設定三權分立賬戶
root超級管理員-->禁用
建立三權分⽴賬戶
useradd sysadmin(安全員--負責安全策略--sec)
useradd audadmin(系統管理員--系統設定--sys)
useradd secadmin(審計員--紀錄檔審查--audit)
設定密碼:密碼不得與⽤戶名⼀樣,需含⼤寫字⺟,特殊符號,數位。(設定了密碼,該賬戶才可正常登入)
passwd sysadmin
passwd audadmin
passwd secadmin

4、紀錄檔

①syslogd紀錄檔
#目的:啟用紀錄檔功能,並設定紀錄檔記錄。
操作步驟:
Linux系統預設啟用以下型別紀錄檔:
系統紀錄檔(預設)/var/log/messages
cron紀錄檔(預設)/var/log/cron
安全紀錄檔(預設)/var/log/secure
注意:部分系統可能使用syslog-ng紀錄檔,組態檔為:/etc/syslog-ng/syslog-ng.conf 可以根據需求設定詳細紀錄檔。


②記錄所有使用者的登入和操作紀錄檔
#目的:通過指令碼程式碼實現記錄所有使用者的登入操作紀錄檔,防止出現安全事件後無據可查。
操作步驟:
執行 [root@xxx /]# vim /etc/profile開啟組態檔。
在組態檔中輸入以下內容:
 history
 USER=`whoami`
 USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`
 if [ "$USER_IP" = "" ]; then
 USER_IP=`hostname`
 fi
 if [ ! -d /var/log/history ]; then
 mkdir /var/log/history
 chmod 777 /var/log/history
 fi
 if [ ! -d /var/log/history/${LOGNAME} ]; then
 mkdir /var/log/history/${LOGNAME}
 chmod 300 /var/log/history/${LOGNAME}
 fi
 export HISTSIZE=4096
 DT=`date +"%Y%m%d_%H:%M:%S"`
 export HISTFILE="/var/log/history/${LOGNAME}/${USER}@${USER_IP}_$DT"
 chmod 600 /var/log/history/${LOGNAME}/*history* 2>/dev/null
執行 [root@xxx /]# source /etc/profile 載入設定生效。
注意:/var/log/history是記錄紀錄檔的存放位置,可以自定義。
通過上述步驟,可以在/var/log/history目錄下以每個使用者為名新建一個資料夾,每次使用者退出後都會產生以使用者名稱、登入IP、時間的紀錄檔檔案,包含此使用者本次的所有操作(root使用者除外)。同時,建議使用OSS服務收集儲存紀錄檔。


③審計功能查詢:
service rsyslog status
service auditd status
審計功能如果想要符合等保需求如下:
1.審計記錄大於6個月
2.審計紀錄檔必須轉發到紀錄檔伺服器進行備份  [通過U盤進行備份也可以]
3.審計記錄必須包含重要的引數(時間,使用者,事件的成敗)
4.審計功能要保證除了審計員以外的賬戶無法關閉


④檢視⽇志記錄是否開啟,預設情況下系統開啟了syslogd和audit服務,可通過以下⽅法查詢:
ps -ef syslogd
ps -ef audit

5、核心漏洞

①系統漏洞
檢視系統漏洞是否存在,如果有是否有修補,是否定期掃描(不需要人為排查)
工具:nessus漏洞掃描工具對內網主機進行掃描


②殺軟
系統中是否存在可以防毒和防止入侵(入侵檢測)的軟體
windows----火絨/360/騰訊電腦管家/瑞星
Linux------ClamAV【開源】

6、其他

1、檢視核心版本
①[root@localhost ~]# cat /proc/version【CentOS7版本】
Linux version 3.10.0-1160.el7.x86_64 ([email protected]) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) ) #1 SMP Mon Oct 19 16:18:59 UTC 2020
②[root@localhost ~]# uname -a【CentOS7版本】
Linux localhost.localdomain 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux


2、檢視作業系統版本
lsb_release -a
cat /etc/issue
cat /etc/release


3、登入超時設定root下設定
cp /etc/profile /etc/profile.bak
vim /etc/profile
最後⾯新增⼀⾏TMOUT=600


4、⼿動鎖定和解鎖(passwd為小寫引數)
usermod -L ⽤戶名 鎖定
usermod -U ⽤戶名 解鎖


5、限源存取
cp /etc/hosts.allow /etc/hosts.allow.bak
cp /etc/hosts.deny /etc/hosts.deny.bak


6、檢視主機IP地址 ifconfig 只允許本⽹段存取
vim /etc/hosts.allow
sshd:192.168.1.0/24:allow
vim /etc/hosts.deny
sshd:all

7、等保測評Linux測評命令

①賬戶策略:
1.cat /etc/shadow檢視口令,檢視賬戶
2.cat /etc/ssh/ssh_config permitemptypasswords 註釋或者後面加no 不允許空口令遠端登入
3.cat /etc/pam.d/system-auth 檢視密碼複雜度
grep pam_cracklib.so模組檢視,centos7之後是pam_pwquality.so模組。限制root使用者,新增 enforce_for_root
4.cat /etc/login.defs 檢視口令更換週期。修改vi /etc/login.defs設定僅影響建立使用者,而不影響現有使用者。
或chage -l 使用者名稱 檢視口令修改週期。
設定:chage -M 天數 使用者名稱 —修改某使用者的最大修改期限
chage -m 最小期限 -w 到期前提醒。
設定與passwd和shadow有衝突時,以passwd和shadow檔案為準。
②登入策略:
5.cat /etc/pam.d/system-auth和/etc/pam.d/sshd 檢視登入失敗策略
在#%PAM-1.0下的前兩行是否有auth required pam_tally2.so onerr=fail deny=6 unlock_time=300 even_deny_root root_unlock_time=300
注意:必須是頭兩行。登入失敗設定詳解
6.cat /etc/profile 檢視登入超時是否自動退出
檢視是否有TMOUT=300
注意:必須是TMOUT,不能是timeout,TIMEOUT等。 登入超時策略設定
7.service --status-all | grep sshd 檢視是否採用ssh加密方式管理
centos7可用systemctl --type=service | grep sshd命令
8.netstat -an | grep 22 檢視ssh服務對應埠是否開啟
9.ps -e | grep sshd 檢視是否開啟ssh服務
10.systemctl is-enabled telnet.socket檢視telnet服務是否可用
11.ls -l /etc/passwd,檢視檔案的許可權值
12. id 0檢視uid=0的使用者有哪些
13. ps -ef | grep java 檢視中介軟體執行使用者,非root使用者執行
14. cat /etc/ssh/sshd_config 是否允許root遠端登入;檔案中的permitrootloginno 表示不允許root賬戶遠端登入
15. systemctl status rsyslog.service檢視服務是否開啟
16. cat /etc/audit/audit.rules對passwd等檔案地讀寫執行產生審計紀錄檔。
③設定策略:
17. cat /etc/rsyslog.conf,是否成功指向紀錄檔伺服器。
18. cat /etc/redhat-release 檢視Linux版本
19. uname -a 檢視核心版本
20. systemctl list-unit-files命令列出所有可用單元。檢視是否有多餘元件和應用程式。
21. yum list installed 檢視已安裝的rpm包
22. netstat -antpl | grep LISTEN 檢視有無多餘埠
23. cat /etc/hosts.at llow /etc/hosts.deny 是否合理限制存取地址 設定策略   

17、Linux應急響應

1、入侵排查思路

賬號安全 -> 歷史命令 -> 檢查異常埠 -> 檢查異常程序 -> 檢查開機啟動項 -> 檢查定時任務 -> 檢查服務 -> 檢查異常檔案。

2、操作步驟

1、賬戶安全

1、查詢特權使用者特權使用者(uid 為0)
①(以冒號為分隔符,列印檔案當中第三個內容(uid)為0的第一列資訊)
[root@localhost ~]# awk -F ":" '$3==0{print $1}' /etc/passwd
root
②(列印符合條件的整列)
[root@localhost ~]# awk -F ":" '$3==0{print $0}' /etc/passwd(補充)
root:x:0:0:root:/root:/bin/bash

2、查詢可以遠端登入的帳號資訊(除了root使用者外,其餘使用者沒有密碼就無法登入)
(當查詢的檔案當中密碼位出現$1或$6時(\$:跳脫成字串$;$6$:sha加密,$1$:md5加密),將改行全列印出來)
[root@localhost ~]# awk '/\$1|\$6/{print $1}' /etc/shadow
root:$6$gzV7F7XygZZLiLMs$q3xIpzL6.tLwg.PkqiIynm2gtkED2pu7oRLlUvfk516Pt/nVgnmISbMW0HOeHoQbjx1bcpD/xpKaL1xwT6dnx.::0:99999:7:::
xzm:$6$kC0HzY8pch7Wdaxx$8HOwj8.INvh8JF3bfrf/GUcWM8BkdDnJeZuSXXsbtb2vglnTTwW3AUWaZ4Ujih0qjlnzONkzQob/j1x4.zfXv0::0:99999:7:::

3、除root帳號外,其他帳號是否存在sudo許可權。如非管理需要,普通帳號應刪除sudo許可權
(是否存在使用者有sudo許可權;檢視檔案時過濾註釋和空行,且只看該字串ALL=(ALL))
[root@localhost ~]# more /etc/sudoers | grep -v "^#\|^$" | grep "ALL=(ALL)"
root	ALL=(ALL) 	ALL
%wheel	ALL=(ALL)	ALL
sudo命令:賦予一次root使用者命令的許可權。(暫時將該命令用root身份執行)
%wheel,是個組,該組成員具有sudo許可權。

4、禁用或刪除多餘及可疑的帳號(一般都是先禁用賬戶,而不直接刪除)
①usermod命令(大寫)
	-L(Lock):表示鎖定使用者(臨時鎖定使用者),被鎖定使用者的密碼前出現「!」表示無法登入(與passwd相似)
	-U(Unlock):表示解除對使用者的鎖定
usermod -L/U user:鎖定帳號(letc/shadow第二欄為!開頭)/解鎖賬號
userdel -r user:將刪除user使用者,並且將/home目錄下的user目錄一併刪除(userdel user 刪除user使用者)
②passwd命令(小寫)
	-l:暫時鎖定使用者(被鎖定的使用者不能使用密碼登入--密碼前加「!!」),但對root使用者無效,照樣可以登入。僅root使用者可用
	-u:解鎖使用者。僅root使用者可用
	-S:查詢使用者密碼的密碼狀態。僅root使用者可用
passwd -S user	檢視賬戶密碼狀態 

2、歷史命令

Linux當中以點開頭的都是隱藏檔案。使用命令:ls/ll -a:顯示所有資訊

1、(駭客一般只刪除自己操作的命令記錄)
[root@localhost ~]# history		//檢視歷史命令
[root@localhost ~]# history -c		//清空所有歷史命令(但這只是一個快取檔案)
//在每個使用者的家目錄下都會存放一個歷史命令的隱藏檔案。通過.bash_history檔案檢視當前帳號執行過的真正所有系統命令。
[root@localhost ~]# cd ~		//進入使用者的家目錄
[root@localhost ~]# ls -a		//顯示所有的隱藏檔案
.                .bash_logout   .config  Documents      initial-setup-ks.cfg  Public     .viminfo
..               .bash_profile  .cshrc   Downloads      .local                .tcshrc
anaconda-ks.cfg  .bashrc        .dbus    .esd_auth      Music                 Templates
.bash_history    .cache         Desktop  .ICEauthority  Pictures              Videos
[root@localhost ~]# less .bash_history		//檢視歷史命令
[root@localhost ~]# echo "" > .bash_history 	//使用重定向刪除所有的歷史命令(需要重新啟動該shell環境才生效)
環境檔案:
/etc/profile:全域性環境檔案(針對全體)
.bash_profile:個人的環境檔案(針對個人;在使用者的家目錄下的隱藏檔案)


2、為歷史的命令增加登入的IP地址、執行命令時間等資訊:
//1)儲存1萬條命令(在該檔案下將開頭是HISTSIZE行的資訊匹配上,將匹配上的所有訊息替換成HISTSIZE=10000)
sed -i 's/^HISTSIZE=1000/HISTSIZE=10000/g' /etc/profile	(安全加固檔案)
//2)在/etc/profile的檔案尾部新增如下行數設定資訊:
USER_IP=`who -u am i 2>/dev/null | awk '{print $NF}' | sed -e 's/[()]//g'`	//篩選該使用者是否為當前使用者
//3)source /etc/profile讓設定生效

命令解讀:
[root@localhost ~]# who
root     :0           2022-09-28 20:28 (:0)		#該行表示本地登入記錄(有登入都要該記錄)
root     pts/0        2022-10-20 14:56 (:0)		#pts/0:表示開啟第一個對談視窗
[root@localhost ~]# who -u	(顯示程序號)
root     :0           2022-09-28 20:28   ?          1873 (:0)
root     pts/0        2022-10-20 14:56   .         57402 (:0)
[root@localhost ~]# who -u am i		//鎖定當前使用者的登入資訊/只回顯了當前使用者的訊息
root     pts/0        2022-10-20 14:56   .         57402 (:0)
[root@localhost ~]# who -u am i 2>/dev/null		//'>'標準錯誤;出現錯誤時直接放到/dev/null檔案下,不回顯
root     pts/0        2022-10-20 14:56   .         57402 (:0)
[root@localhost ~]# who -u am i 2>/dev/null | awk '{print $NF}'
(:0)		//只回顯了最後一條資訊
[root@localhost ~]# who -u am i 2>/dev/null | awk '{print $NF}' | sed -e 's/[()]//g'
:0	//這裡的-e多點編輯和-i效果相同;[()]表示鎖定中括號當中的小括號內的內容;s/[()]//g表示將每行的小括號當中的的內容替換為一個空內容。「:0」表示本地登入
[root@localhost ~]# USER_IP=`who -u am i 2>/dev/null | awk '{print $NF}' | sed -e 's/[()]//g'`	//將反引號當中的內容解讀完成之後賦值給一個變數USER_IP

標準輸入與輸出

輸出:標準輸出、標準錯誤
[root@localhost Desktop]# cat awk.txt
123		//標準輸出(output)【1>常常將1省略只寫>】:一個命令字或者程式正常執行的結果
[root@localhost Desktop]# ca awk.txt
bash: ca: command not found...		//標準錯誤(error)【2>/dev/null(標準錯誤的2>後不能省略)】:一種狀態或者錯誤的資訊
Similar commands are::
'ac'
'sa'
輸入:
標準輸入(input)【0<】:連線至輸入裝置(鍵盤等)

使用方法:
1.標準輸出-1>常常省略(輸出)
2.標準錯誤-吃掉錯誤報告(標準錯誤使用--輸出)
[root@localhost Desktop]# who -u am i
root     pts/0        2022-10-20 14:56   .         57402 (:0)
[root@localhost Desktop]# wo -u am i 2>/dev/null
3.標準輸入(輸入)
[root@localhost Desktop]# cat awk.txt 		
123
[root@localhost Desktop]# cat 0< awk.txt 
123
//Linux當中cat定義為表示標準輸入命令字。當cat後面不加引數時為鍵盤輸入;cat後面加東西/檔案時為將檔案標準輸入後再標準輸出

cat建立新檔案:
[root@localhost Desktop]# cat > cat.txt
123132131
^C		//在另一行終止程序
[root@localhost Desktop]# cat cat.txt
123132131

3、檢查異常埠、程序

①使用netstat網路連線狀態命令,分析可疑埠、IP、PID
命令:netstat -antlp | more

②檢視下pid所對應的程序檔案路徑
命令:ls -l /proc/$PID/exe或file /proc/$PID/exe($PID 為對應的pid 號)

③檢查異常程序,使用ps命令,分析程序
命令:ps aux | grep pid

4、檢查開機啟動項

檢視執行級別命令runlevel
執行級別		含義	(七個執行模式)
0			關機
1			單使用者模式,可以想象為windows的安全模式,主要用於系統修復
2			不完全的命令列模式,不含NFS服務
3			完全的命令列模式,就是標準字元介面
4			系統保留
5			圖形模式/桌面模式(GUI介面)
6			重啟動

開機啟動組態檔:
/etc/rc.local
/etc/rc.d/rc[0~6].d

切換執行模式

臨時切換執行模式:(N 5--影象模式下的命令模式)
ctrl+alt=f3	//切換3級別執行模式
ctrl+alt=f1	//切換回來
永久切換執行模式:(5 3--圖形模式切換成永久命令模式)
init 3/5	//切換執行級別(在命令模式下輸入init 5--返回圖形化介面--命令模式更安全,可操作空間變少)

檢視預設允許模式:
[root@localhost ~]# systemctl get-default 
graphical.target		//g開頭表示桌面允許模式
systemctl set-default multi-user.target 	//設定預設執行級別(進入3模式)
systemctl:核心管理工具

5、入侵排查

重點關注以下目錄(計劃目錄)中是否存在惡意指令碼:
	/var/spool/cron/*
	/etc/crontab
	/etc/cron.d/*
	/etc/cron.daily/*
	/etc/cron.hourly/*
	/etc/cron.monthly/*
	/etc/cron.weekly/
	/etc/anacrontab
	/var/spool/anacron/*
小技巧:
more /etc/cron.daily/* 檢視目錄下所有檔案

6、查詢已安裝的服務

1、RPM包安裝的服務
chkconfig --list 檢視服務自啟動狀態,可以看到所有的RPM包安裝的服務
ps aux | grep crond 檢視當前服務
系統在3與5級別下的啟動項
chkconfig --list | grep "3:on\|5:on"

2、原始碼包安裝的服務
檢視服務安裝位置 ,一般是在/usr/local/
service httpd start
搜尋/etc/rc.d/init.d/ 檢視是否存在


 systemctl list-unit-files	//檢視所有服務與狀態

7、檢查異常檔案

1、檢視敏感目錄,如/tmp目錄下的檔案,同時注意隱藏資料夾,以「.」為名的資料夾具有隱藏屬性

2、得到發現WEBSHELL、遠控木馬的建立時間,如何找出同一時間範圍內建立的檔案?
可以使用find命令來查詢,如 find /opt -iname "*" -atime 1 -type f 找出 /opt 下一天前存取過的檔案

3、針對可疑檔案可以使用stat進行建立修改時間。

8、紀錄檔分析技巧

1、定位有多少IP在爆破主機的root帳號:
grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more

2、定位有哪些IP在爆破:
grep "Failed password" /var/log/secure|grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"|uniq -c

3、爆破使用者名稱字典是什麼?
grep "Failed password" /var/log/secure|perl -e 'while($_=<>){ /for(.*?) from/; print "$1\n";}'|uniq -c|sort -nr

4、登入成功的IP有哪些:
grep "Accepted " /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more

5、登入成功的日期、使用者名稱、IP:
grep "Accepted " /var/log/secure | awk '{print $1,$2,$3,$9,$11} ‘

6、增加使用者紀錄檔:
grep "useradd" /var/log/secure

7、刪除使用者kali紀錄檔:
grep "userdel" /var/log/secure

8、su切換使用者
more /var/log/secure | grep 'su:'

9、病毒查殺

①chkrootkit:
網址:http://www.chkrootkit.org
使用方法:
	wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz
	tar -zxf chkrootkit.tar.gz
	cd chkrootkit-0.55
	./chkrootkit

②Clamav:
ClamAV的官方下載地址為:http://www.clamav.net/download.html
使用方法:
yum -y install epel-release
yum install –y clamav clamav-update
freshclam
clamscan -r /home

③河馬webshell查殺
網址:https://www.shellpub.com/
使用方法:
	https://www.shellpub.com/doc/hm_linux_usage.html
深信服Webshell網站後門檢測工具
網址:https://edr.sangfor.com.cn/#/index/home


19、IPTABLES

網路裝置:交換機、路由器(網路層或者鏈路層)

安全裝置:不直接參與資料的傳輸、連通性,主要用於保護網路層或者鏈路層資料傳輸的安全性

1、防火牆介紹

防火牆作為內部網路與外部網之間的一種存取控制裝置(防火牆用於隔絕內外網的一種存取控制裝置),常常安裝在內部網路和外部網路的邊際上。防火牆具有很好的網路安全保護作用。入侵者必須首先穿越防火牆的安全防線,才能接觸目標計算機。你可以將防火牆設定成許多不同保護級別。高階別的保護(必須是存在與高階別的防火牆當中)可能會禁止一些服務,如視訊流等,但至少這是你自己的保護選擇。

防火牆分類

①硬體防火牆
將Linux系統、安全策略、規則全部都加入特定的硬性裝置
好處:響應快、耗資源少(減少伺服器資源消耗)、功能強大
壞處:價格巨高(一般用於國防),不常見
②軟體防火牆
最早期:具有ACL的路由器
所有防火牆的基礎功能:包過濾ACL(防火牆)

防火牆的主要作用

①Internet防火牆可以防止Internet上的危險傳播到網路內部;web防火牆(WAF)
②能強化安全策略(規則);
③能有效記錄Internet上的活動;

紀錄檔與防火牆的區別

紀錄檔:系統內部的事件監控

防火牆:內外網間(門口)的監控

2、資料傳輸

資料封裝與解封裝

資料封裝(從上往下)/資料解封裝(從上往下):
【應用層】上層資料
【傳輸層】TCP頭部		上層資料
【網路層】IP頭部  		TCP頭部  		上層資料
【資料鏈路層】MAC頭部  		IP頭部  		TCP頭部  		上層資料
【物理層】二進位制流

封裝資料:
真實應用資料從上層進入到傳輸層,加上源埠和目標埠成為資料段(TCP|UDP首部),接著進入網路層,加上源IP和目標IP成為封包,再進入鏈路層,加上源MAC地址和目標MAC地址成為資料框,形成一個完整的封包。
解封裝資料:
資料經過網路傳輸到達目標主機後,按照封裝的反順序逐層解包,最終得到真正的應用內容。

資料傳輸

資料傳輸:
主機間或者主機內部的服務程序可以通過多種方式進行資料傳輸,比如共用記憶體、通訊端、訊息佇列等。而我們常說的OS模型方式,就是一種網路方式的資料傳輸,而且是基於通訊端(ip+port)的。當封裝好的資料達到物理層後,會基於封包的網路層資訊來判斷,是直接流入本機,還是轉發給網路中的其他主機。
通訊端:IP地址:埠(一個埠對應一個服務)

程序間資料通訊

主機內的程序間資料通訊:
封裝好的資料,無需經過物理網路卡和路由,通過本機的迴環網路卡(LoopBack)即可實現從A通訊端流出,從B通訊端流入,由核心空間進入使用者空間,進而被程序所在的應用程式接收並處理,完成整套資料的傳輸效果。前提是Linux主機需要開啟ip_forward功能,否則導致封包轉發失敗,直接丟棄。

主機間的程序資料通訊:
封裝好的資料,在物理層進行路由決策,如果封包的目標地址是其他主機,封包從A網路卡流出,然後封包在網際網路上進行路由轉發,最終到達目標主機,從B網路卡流入,進入到指定的通訊端,被程序所在的應用程式接收並處理,完成整套資料的傳輸效果。

網路卡:實現上網的物理裝置

3、iptables前提-->路由小實驗

前提:三個主機(主機伺服器),兩個網段,只要中間的裝置的網路卡資訊相同,是可以實現通訊的。(通過網路卡地址)

路由小實驗

路由小實驗:(隔離多個網段而實現內外網通訊)
server1:1.1.1.1(內網)
server2:2.2.2.2/3.3.3.3(閘道器)
server3:4.4.4.4(外網)

server1當中的兩張網路卡可以通過server1的迴環介面來進行聯絡(在伺服器主機server1當中網路卡之間是可以進行通訊的)
路由器(網路裝置)當中的下一跳/(出)介面在主機伺服器當中叫網路卡/閘道器。
需求:實現server1與server3通訊(三個主機,四個網段實現通訊)

步驟:
①改網路卡(1.1.1.1與2.2.2.2所在網路卡同一張,實現2.2.2.2為1.1.1.1的閘道器;3.3.3.3與4.4.4.4所在網路卡同一張3.3.3.3為4.4.4.4的閘道器---->優化:保證實驗的流暢性將四個主機都設定成同一網路卡)
虛擬機器器-->硬體-->網路介面卡-->自定義模式選擇VMnet8(三臺主機同網路卡)(server2需要而外新增一張網路卡)-->確定
②給每個主機配上對應的IP地址/編輯網路卡(測試閘道器間是否能通訊)
server1:(閘道器為2.2.2.2)
[root@localhost network-scripts]# vim ifcfg-ens33 
[root@localhost network-scripts]# systemctl restart network
[root@localhost network-scripts]# ip a | grep inet | grep -v inet6
    inet 127.0.0.1/8 scope host lo
    inet 1.1.1.1/24 brd 1.1.1.255 scope global noprefixroute ens33
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
server2:(將2.2.2.2和3.3.3.3網路卡的閘道器設定為對方的閘道器)
[root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-ens37		//雙網路卡,前提是硬體裝置要新增
//ens37的網路卡名稱和裝置名稱都需要修改,不修改的話,系統無法識別該網路卡資訊。
[root@localhost network-scripts]# vim ifcfg-ens33
[root@localhost network-scripts]# vim ifcfg-ens37
[root@localhost network-scripts]# systemctl restart network
[root@localhost network-scripts]# ip a | grep inet | grep -v inet6
    inet 127.0.0.1/8 scope host lo
    inet 2.2.2.2/24 brd 2.2.2.255 scope global noprefixroute ens33
    inet 3.3.3.3/24 brd 3.3.3.255 scope global noprefixroute ens37
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
server3:(閘道器為3.3.3.3)
[root@localhost network-scripts]# vim ifcfg-ens33 
[root@localhost network-scripts]# systemctl restart network
[root@localhost network-scripts]# ip a | grep inet | grep -v inet6
    inet 127.0.0.1/8 scope host lo
    inet 4.4.4.4/24 brd 4.4.4.255 scope global noprefixroute ens33
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
③測試連通性(最終結果:1.1.1.1與4.4.4.4之間全互通)
檢視當前主機當中的路由表:
server1:
[root@localhost network-scripts]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         2.2.2.2         0.0.0.0         UG    100    0        0 ens33	//要發給任意的網段,其閘道器都為2.2.2.2(這一條就涵蓋了下面的所有資訊)(若缺少了這條訊息說明該裝置未設定閘道器)
1.1.1.0         0.0.0.0         255.255.255.0   U     100    0        0 ens33
2.2.2.2         0.0.0.0         255.255.255.255 UH    100    0        0 ens33
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
Destination:目標網段
Gateway:自己閘道器
Genmask:子網掩碼
Iface:裝置名
server2:
[root@localhost network-scripts]# route -n(2.2.2.2和3.3.3.3網路卡互為對方的閘道器)
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         3.3.3.3         0.0.0.0         UG    100    0        0 ens33
0.0.0.0         2.2.2.2         0.0.0.0         UG    101    0        0 ens37
2.2.2.0         0.0.0.0         255.255.255.0   U     100    0        0 ens33
2.2.2.2         0.0.0.0         255.255.255.255 UH    101    0        0 ens37
3.3.3.0         0.0.0.0         255.255.255.0   U     101    0        0 ens37
3.3.3.3         0.0.0.0         255.255.255.255 UH    100    0        0 ens33
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
//【略看】若在當時沒有在設定IP時新增上閘道器資訊的話,則之後可使用如下方法配上閘道器/閘道器:[root@Lin network-scripts]# route add -net 1.1.1.0/24 dev ens33
server3:
[root@localhost network-scripts]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         3.3.3.3         0.0.0.0         UG    100    0        0 ens33
3.3.3.3         0.0.0.0         255.255.255.255 UH    100    0        0 ens33
4.4.4.0         0.0.0.0         255.255.255.0   U     100    0        0 ens33
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0

測試一、完成1.1.1.1與2.2.2.2之間的通訊
//完成以上存在,此時server1還無法ping通server2的任意網路卡(假如說是路由裝置的話,則以上設定就已經可以實現通訊,但該裝置為主機伺服器)
##主機伺服器當中想要ping某個地址,則必須在該主機伺服器的路由表當中先有該地址網段(路由表想要通某個地址,必須要有該地址網段)
新增2.2.2.2到1.1.1.1的網段/閘道器資訊:【在server2上設定】
[root@Lin network-scripts]# route add -net 1.1.1.0/24 dev ens33
結果:則成功實現1.1.1.1與2.2.2.2通訊
測試二、實現3.3.3.3與4.4.4.4之間的通訊
新增3.3.3.3到4.4.4.4的網段/閘道器資訊:【在server2上設定】
[root@localhost network-scripts]# route add -net 4.4.4.0/24 dev ens37
結果:實現3.3.3.3與4.4.4.4之間的通訊
命令:
route add/del -net 網段/掩碼 dev 裝置名稱		//新增/刪除網段
route add/del default gw IP地址 dev 裝置名稱		//新增/刪除閘道器(前提要有該網段)
#以上兩個測試在2.2.2.2和3.3.3.3設定靜態IP資訊上都不寫網路卡資訊的情況下照樣可行

測試三、實現1.1.1.1與3.3.3.3之間的通訊
1.將2.2.2.2和3.3.3.3網路卡互為對方的閘道器(上邊的設定靜態IP地址的操作已經做了)
2.給server2配上1.1.1.0的閘道器、server2配上4.4.4.0的閘道器(這邊測試一二也完成了)
結果:實現1.1.1.1與3.3.3.3的通訊、4.4.4.4與2.2.2.2的通訊、但1.1.1.1與4.4.4.4還未能通訊

測試四、實現1.1.1.1與4.4.4.4之間的通訊
1.修改組態檔:開啟路由轉發功能
[root@localhost network-scripts]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@localhost network-scripts]# cat /proc/sys/net/ipv4/ip_forward
1		//1代表開啟;0代表未開啟
2.在server2上增加去往1.1.1.1和4.4.4.4的網段資訊
結果:實現1.1.1.1與4.4.4.4之間的通訊,且1.1.1.1沒有4.4.4.4的任何資訊(內網與外網的隔絕--實現內網的安全性)。

實現以上所有的路由小實驗結束後個主機伺服器的路由資訊如下:
server1:
[root@localhost network-scripts]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         2.2.2.2         0.0.0.0         UG    100    0        0 ens33
1.1.1.0         0.0.0.0         255.255.255.0   U     100    0        0 ens33
2.2.2.2         0.0.0.0         255.255.255.255 UH    100    0        0 ens33
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
server2:
[root@localhost network-scripts]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         3.3.3.3         0.0.0.0         UG    100    0        0 ens33
0.0.0.0         2.2.2.2         0.0.0.0         UG    101    0        0 ens37
1.1.1.0         0.0.0.0         255.255.255.0   U     0      0        0 ens33
2.2.2.0         0.0.0.0         255.255.255.0   U     100    0        0 ens33
2.2.2.2         0.0.0.0         255.255.255.255 UH    101    0        0 ens37
3.3.3.0         0.0.0.0         255.255.255.0   U     101    0        0 ens37
3.3.3.3         0.0.0.0         255.255.255.255 UH    100    0        0 ens33
4.4.4.0         0.0.0.0         255.255.255.0   U     0      0        0 ens37
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
server3:
[root@localhost network-scripts]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         3.3.3.3         0.0.0.0         UG    100    0        0 ens33
3.3.3.3         0.0.0.0         255.255.255.255 UH    100    0        0 ens33
4.4.4.0         0.0.0.0         255.255.255.0   U     100    0        0 ens33
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0



以上路由小實驗注意點:
以上所寫入的路由資訊都是屬於臨時的,當重啟網路服務時,該網路的路由就會恢復會最初的狀態。(只要重啟了網路,就需要重新設定路由資訊)

4、iptables介紹

iptables全稱叫:netfilter(核心)/iptables(工具)

iptables(難)& Firewalls(易)

在之前的linux系統中,預設的防火牆都是iptables,而隨著Redhat|Centos7系統的釋出,linux系統的防火牆默默的將iptables轉換成了Firewalls,由Firewalls編輯各種各樣的封包管理規則,然後藉助於netfilter模組來實現強大的防火牆功能,不過Firewalls的底層操作仍然是iptables,只不過它將繁雜的iptables的手工操作給封裝起來,以簡單易用的方式提供給大家。

Firewalld動態防火牆管理器服務(Dynamic Firewall Manager of Linux systems)是目前Centos7系統預設的防火牆管理工具,擁有命令列終端和圖形化介面的設定工具,firewalld跟iptables主要有以下區別:

1、firewalls的預設規則是拒絕,需要時設定開啟,iptables正好相反。

2、firewalls可以動態修改單條規則(iptables也行-立即生效),而且直接生效

3、firewalls簡單易用,即使不理解各種封包規則,也可以實現大部分功能。

4、想要真正學會防火牆規則,強烈推薦學習iptables。

5、iptables原理

iptables不是一個單一的軟體工具,而是一套C/S樣式的軟體組,它是由工作在使用者空間的iptables和工作在核心空間的Netfilter模組組成,一般統稱為Iptables。

使用者基於使用者空間的iptables軟體,來設定各種包過濾規則,藉助於後端核心空間的Netfilter模組實現非常強大的防火牆功能,Netfilter實現的功能主要體現在封包過濾、封包重定向、網路地址轉換等方面。

預設情況下,iptables主要工作在OSI模型中的的2~4層,我們還可以通過重編核心,讓iptables支援7層的封包管理。

規則優先順序:netfilter為了更高質量的進行表之間的規則執行,已經客製化好了這些表的優先順序,從高到底效果如下:security > raw > mangle > nat > filter

1.五條鏈

Netfilter 平臺中制定了封包的五個掛載點(Hook Point,我們可以理解為回撥函數點,封包到達這些位置的時候會主動呼叫我們的函數,使我們有機會能在封包路由的時候改變它們的方向、內容),這5個掛載點分別是PRE_ROUTINGINPUTOUTPUTFORWARDPOST_ROUTING

Linux核心中的專用封包處理模組netfilter的工作的地方,而且netfilter對這幾個地方分別定義了幾個名稱術語。在處理各種封包時,根據防火牆規則的不同介入時機,iptables供涉及5種預設規則鏈,從應用時間點的角度理解這些鏈:

1、INPUT鏈(進站):當接收到防火牆本機地址的封包(入站)時,應用此鏈中的規則。
2、OUTPUT鏈(上車):當防火牆本機向外傳送封包(出站)時,應用此鏈中的規則。
3、FORWARD鏈(轉車):當接收到需要通過防火牆傳送給其他地址的封包(轉發)時,應用此鏈中的規則。
4、PREROUTING鏈(下車):在對封包作路由選擇之前,應用此鏈中的規則,如DNAT。
5、POSTROUTING鏈(出站):在對封包作路由選擇之後,應用此鏈中的規則,如SNAT。

2.五個表

在netfilter的記憶體區域中,這五個表是security表、filter表、NAT表、mangle表和raw表,他們分別作用的物件是不一樣的:

1、security表: 主要針對的是資料鏈路層的管理規則組合,只不過它是基於target(目標)來做操作的。
2、filter表:是netfilter中最重要的表,也是預設的表,主要負責封包的過濾功能。(重要)
3、nat表:主要實現網路地址轉換的表。可以自由轉換資料包文中IP和PORT。
4、mangle表:主要實現封包的拆分-修改-封裝動作。
5、raw表:通過關閉nat表的追蹤功能,從而實現加速防火牆過濾的表。

3.表中鏈(重要)

	security表 :input 、output、forward
	filter過濾表 :input 、output、forward
	nat 轉換表 :postrouting、prerouting、input 、output
	mangle封裝表 :input、output、forward、prerouting、postrouting
	raw自定義表 :prerouting、output

4.鏈屬表

	prerouting :nat、mangle、raw
	postrouting :nat、mangle
	input :filter、mangle、security
	output :filter、nat、mangle、raw、security
	forward :filter、mangle、security

5.四表規則

filter表

主要用於對封包進行過濾,根據具體的規則決定是否放行該封包(如DROP、ACCEPT、REJECT、LOG)。filter 表對應的核心模組為iptable_filter,包含三個規則鏈:

INPUT鏈:INPUT針對那些目的地是原生的包

FORWARD鏈:FORWARD過濾所有不是本地產生的並且目的地不是本地(即本機只是負責轉發)的

OUTPUT鏈:OUTPUT是用來過濾所有本地生成的包

nat表

主要用於修改封包的IP地址、埠號等資訊(網路地址轉換,如SNAT、DNAT、MASQUERADE、REDIRECT)。屬於一個流的包(因為包的大小限制導致資料可能會被分成多個封包)只會經過這個表一次。如果第一個包被允許做NAT或Masqueraded,那麼餘下的包都會自動地被做相同的操作,也就是說,餘下的包不會再通過這個表。表對應的核心模組為 iptable_nat,包含三個鏈:

PREROUTING鏈:作用是在包剛剛到達防火牆時改變它的目的地址

OUTPUT鏈:改變本地產生的包的目的地址

POSTROUTING鏈:在包就要離開防火牆之前改變其源地址

mangle表

主要用於修改封包的TOS(Type Of Service,服務型別)、TTL(Time To Live,生存週期)指以及為封包設定Mark標記,以實現Qos(Quality Of Service,服務質量)調整以及策略路由等應用,由於需要相應的路由裝置支援,因此應用並不廣泛。包含五個規則鏈——PREROUTING,POSTROUTING,INPUT,OUTPUT,FORWARD。

raw表

是自1.2.9以後版本的iptables新增的表,主要用於決定封包是否被狀態跟蹤機制處理。在匹配封包時,raw表的規則要優先於其他表。包含兩條規則鏈——OUTPUT、PREROUTING。

6、補充

iptables中封包和4種被跟蹤連線的4種不同狀態:
1、NEW:該包想要開始一個連線(重新連線或將連線重定向)
2、RELATED:該包是屬於某個已經建立的連線所建立的新連線。例如:FTP的資料傳輸連線就是控制連線所 RELATED出來的連線。--icmp-type 0( ping 應答) 就是--icmp-type 8(ping 請求)所RELATED出來的。
3、ESTABLISHED :只要傳送並接到應答,一個資料連線從NEW變為ESTABLISHED,而且該狀態會繼續匹配這個連線的後續封包。
4、INVALID:封包不能被識別屬於哪個連線或沒有任何狀態比如記憶體溢位,收到不知屬於哪個連線的ICMP錯誤資訊,一般應該DROP這個狀態的任何資料。

6、iptables實驗

前提:保證1.1.1.1與2.2.2.2之間能通訊即可。

法一:如果使用上邊的路由小實驗的話則需要將server2上的互為閘道器給註釋掉,還要聯網下載iptables的相關工具-->比較麻煩。

法二:其次就是使用兩臺主機伺服器先下載iptables的相關工具,再重新設定上兩臺裝置之間的靜態IP和路由資訊(以下操作使用此方法)

①下載iptables的相關服務:【兩臺主機伺服器都可下載,重要任意指定一臺為伺服器端一臺為使用者端即可】
[root@localhost ~]# rm -f /var/run/yum.pid
[root@localhost ~]# yum -y install iptables
[root@localhost ~]# yum -y install iptables-services.x86_64
其餘命令:
下載:
1.永久關閉firewalld
	systemctl stop firewalld
	systemctl disable firewalld
2.檢視iptables軟體包
	 yum list | grep iptables
3.安裝iptables與iptables-services
	yum –y install iptables
	yum –y install iptables-services
服務相關命令:
[root@localhost ~]# systemctl start/stop iptables	// 開啟/關閉iptables
[root@localhost ~]# systemctl status iptables	// 檢視iptables狀態
[root@localhost ~]# systemctl enable/disable iptables	// 開機自啟/永久關閉iptables
[root@localhost ~]# iptables –help	// 檢視幫助檔案


②為了保證實驗與法一的高度相似性,這裡就不直接將2.2.2.2的閘道器資訊設定成1.1.1.1的了,而是將2的網段註釋掉,再配上2網段通往1網段的路由資訊。
[root@localhost network-scripts]# route add -net 1.1.1.0/24 dev ens33  //新增該條路由訊息1網段與2網段成功通訊
//這裡說下這一步都設定了說明:1.server1設定了1.1.1.1的靜態IP和2.2.2.2的閘道器資訊並重啟了網路。2.server2設定了2.2.2.2的靜態IP並重啟了網路和新增了一條通往1.1.1.0網段的路由資訊。從而實現1網段與2網段之間的通訊。


常用指令
iptables 
	-t 指定檢視表(不指定預設檢視filter)
		-L:檢視表中規則
		-vnL:檢視詳細規則
		-F:清空(不指定預設清空filter)
		-A:追加一條策略(預設放在最後開始執行)
		-l:插入一條策略(預設放在最前開始執行)
			-j:動作
				DROP:丟棄
			-p:指定協定	
iptables -L //檢視現有規則
iptables -t nat -L //檢視nat表的規則
iptables -F //清空表中規則
target 目標
ACCEPT 接受
REJECT 拒絕
DROP 丟棄


③測試規則有效性
//2.2.2.2的主機伺服器為server端;1.1.1.1的主機伺服器為client端
測試1、讓使用者端不能ping通伺服器端【使用iptables的規則來實現--源地址封殺、目的地址封殺】
法一:進站封殺/原地址封殺(無論使用者端傳送來的封包要去哪,全都拒絕)
[root@localhost network-scripts]# iptables -F		//策略一般是從上到下開始匹配,所以需要先清空原有的策略以保證實驗的準確性
[root@localhost network-scripts]# iptables -L		//檢視表,此時規則表當中沒有任何資料
[root@localhost network-scripts]# iptables -t filter -A INPUT -s 1.1.1.1 -j DROP //寫入規則
[root@localhost network-scripts]# iptables -nvL		//規則已成功寫入
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DROP       all  --  *      *       1.1.1.1              0.0.0.0/0         
//此時使用者端再次ping2.2.2.2伺服器則無法成功
 pkts bytes target     prot opt in     out     source               destination         
    5   420 DROP       all  --  *      *       1.1.1.1              0.0.0.0/0      //5個包被成功丟棄/攔截  
//現在再次清空剛剛寫入的規則,使用者端又一次ping通主機伺服器,說明上面寫入的策略生效。
法二:目的地址封殺
[root@localhost network-scripts]# iptables -F	//清空原有的規則
[root@localhost network-scripts]# iptables -t filter -A INPUT -d 2.2.2.2 -j DROP	//寫入目的地封殺規則
[root@localhost network-scripts]# iptables -nvL		//檢視規則發現使用者端已經無法與主機伺服器端ping通
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    2   168 DROP       all  --  *      *       0.0.0.0/0            2.2.2.2       


測試二、只允許伺服器端服務使用者端,使用者端不能存取伺服器端
法一:主機伺服器攔截使用者端的請求包,但伺服器端存取使用者端的請求包為被攔截
[root@localhost network-scripts]# iptables -F
[root@localhost network-scripts]# iptables -t filter -A INPUT -s 1.1.1.1 -p icmp --icmp-type 8 -j DROP
[root@localhost network-scripts]# iptables -nvL
Chain INPUT (policy ACCEPT 2 packets, 168 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    6   504 DROP       icmp --  *      *       1.1.1.1              0.0.0.0/0            icmptype 8
//此時伺服器端成功與使用者端通訊,但使用者端存取伺服器端被拒絕了。
法二:主機伺服器對迴應包進行攔截
[root@localhost network-scripts]# iptables -F
[root@localhost network-scripts]# iptables -t filter -A OUTPUT -d 1.1.1.1 -p icmp --icmp-type 0 -j DROP
[root@localhost network-scripts]# iptables -nvL
Chain OUTPUT (policy ACCEPT 2 packets, 168 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    3   252 DROP       icmp --  *      *       0.0.0.0/0            1.1.1.1              icmptype 0
//此時伺服器端成功與使用者端通訊,但使用者端存取伺服器端被拒絕了。
補充:
--icmp-type 8:請求包
--icmp-type 0:迴應包
【作業1】(注意閘道器是否需要寫入、路由策略是否需要新增)
法三:首先拒絕所有策略!!!然後開啟對應icmp的ping包(全部加入黑名單,開放對應白名單。iptables的策略預設是全接受/開啟的)
[root@localhost network-scripts]# iptables -F
[root@localhost network-scripts]# iptables -P INPUT DROP	 //修改filter表INPUT鏈的預設策略為拒絕
[root@localhost network-scripts]# iptables -t filter -A INPUT -s 1.1.1.1 -p icmp --icmp-type 0 -j ACCEPT
[root@localhost network-scripts]# iptables -t filter -A OUTPUT -d 1.1.1.1 -p icmp --icmp-type 8 -j ACCEPT
//此時伺服器端(2.2.2.2)成功與使用者端(1.1.1.1)通訊,但使用者端(1.1.1.1)存取伺服器端(2.2.2.2)被拒絕了(開放對應白名單)。





//設定了iptables的主機伺服器端無法遠端其他裝置
測試三、禁止使用者端通過遠端連線埠22來遠端連線上主機伺服器端。(使用iptables阻止一些埠服務)
法一:在主機伺服器上將該使用者端拉入遠端連線的黑名單即可。
法二:使用iptables服務禁止使用者端遠端連線上伺服器端
[root@localhost ~]# systemctl restart iptables.service 		//重啟下server2的iptables的服務
此時的server1可以成功遠端連線上server2(ssh 2.2.2.2),而server2無法遠端連線其他裝置(上面提到了)。
[root@localhost ~]# iptables -F
[root@localhost ~]# iptables -t filter -A INPUT -s 1.1.1.1 -p tcp --dport 22 -j DROP //伺服器端上寫入規則
[root@localhost ~]# iptables -nvL
Chain INPUT (policy ACCEPT 1 packets, 350 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   14  4820 DROP       tcp  --  *      *       1.1.1.1              0.0.0.0/0            tcp dpt:22
現在server1無法遠端連線上2.2.2.2這個主機伺服器。
補充:
--dport:目標埠
測試四、只寫一條規則就將22、80埠同時拒絕連線。(分開寫其實也是可行的,不過那樣的工作量太大了)
1.將22號埠到80號埠之間的服務全部拒絕(這樣肯定不行,假如說在22到80之間有我們需要的埠服務,那不就使用不了了)(範圍過於龐大)
[root@localhost ~]# iptables -F
[root@localhost ~]# iptables -t filter -A INPUT -s 1.1.1.1 -p tcp --dport 22:80 -j DROP 
[root@localhost ~]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DROP       tcp  --  *      *       1.1.1.1              0.0.0.0/0            multiport dports 22:80
2.精準定位到指定埠上
[root@localhost ~]# iptables -F
[root@localhost ~]# iptables -t filter -A INPUT -s 1.1.1.1 -p tcp -m multiport --dport 22,80 -j DROP
[root@localhost ~]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DROP       tcp  --  *      *       1.1.1.1              0.0.0.0/0            multiport dports 22,80
補充:
-m:引入模組
multiport:組合埠
測試五、禁用多個地址存取指定的埠(組合引數的運用)
[root@localhost ~]# iptables -F
[root@localhost ~]# iptables -t filter -A INPUT -m iprange --src-range "2.2.2.2-2.2.2.200" -p tcp -m multiport --dport 22,80,135 -j DROP 
[root@localhost ~]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            source IP range 2.2.2.2-2.2.2.200 multiport dports 22,80,135
--src-range:源範圍的意思

7、防火牆的備份與還原

預設的iptables防火牆規則會立刻生效,但如果不儲存,當計算機重啟後所有的規則都會丟失,所以對防火牆規則進行及時儲存的操作是非常必要的。
iptables軟體包提供了兩個非常有用的工具,我們可以使用這兩個工具處理大量的防火牆規則。這兩個工具分別是iptables-save和 iptables-restore,使用該工具可以實現防火牆規則的儲存與還原。這兩個工具的最大優勢是處理龐大的規則集時速度非常快。

CentOS 7 系統中防火牆規則預設儲存在/etc/sysconfig/iptables檔案中,使用iptables-save將規則儲存至該檔案中可以實現儲存防火牆規則的作用,計算機重啟後會自動載入該檔案中的規則。如果使用iptables-save將規則儲存至其他位置,可以實現備份防火牆規則的作用。當防火牆規則需要做還原操作時,可以使用iptables-restore將備份檔案直接匯入當前防火牆規則。

1、iptables-save命令
iptables-save 命令用來批次匯出 Linux 防火牆規則,語法介紹如下:
儲存在預設資料夾中(儲存防火牆規則): [root@liangxu ~]# iptables-save > /etc/sysconfig/iptables
儲存在其他位置(備份防火牆規則): [root@liangxu ~]# iptables-save > 檔名稱
直接執行 iptables-save 命令:顯示出當前啟用的所有規則,按照 raw、mangle、nat、filter 表的順序依次列出,如下所示:
[root@liangxu ~]# iptables-save # Generated by iptables-save v1.4.7 on Thu Aug 27 07:06:36 2020 *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [602:39026] ....... COMMIT # Completed on Thu Aug 27 07:06:36 2020
其中:
「#」號開頭的表示註釋;
「*filter」表示所在的表;
「:鏈名預設策略」表示相應的鏈及預設策略,具體的規則部分省略了命令名「iptables」;
在末尾處「COMMIT」表示提交前面的規則設定。
備份到其他檔案中。例如檔案:text,如下所示:
[root@liangxu ~]# iptables-save > test [root@liangxu ~]# ls test [root@bogon ~]# cat test # Generated by iptables-save v1.4.7 on Thu Aug 27 07:09:47 2020 *filter ......
列出nat表的規則內容,命令如下:
[root@liangxu ~]# iptables-save -t nat		//「-t表名」:表示列出某一個表。

2、iptables-restore命令
iptables-restore 命令可以批次匯入Linux防火牆規則,同時也需要結合重定向輸入來指定備份檔案的位置。命令如下:
[root@liangxu ~]# iptables-restore < 檔名稱
注意,匯入的檔案必須是使用 iptables-save工具匯出來的才可以。
先使用 iptables-restore 命令還原 text 檔案,然後使用 iptables -t nat -nvL 命令檢視清空的規則是否已經還原,如下所示:
[root@liangxu ~]# iptables-restore < test [root@liangxu ~]# iptables -t nat -nvL Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination

8、內、外網之間的需求存取

①SNAT
明確內使用者端地址是多少(1.1.1.1),外網web伺服器地址是多少(2.2.2.2)。(防火牆左埠為1.1.1.254,右埠為2.2.2.254)  
比如內網地址為1.1.1.1,外網伺服器地址為2.2.2.2
第一步:清空路由表(刪除我們不需要的地址,新增需要的地址)
第二步:把去2.2.2.0/24的閘道器設為1.1.1.254。(那麼只要是內網1.1.1.0網段的流量均通過nat轉換成2.2.2.254)
新增路由:route add -net 目標網段 gw 內網閘道器 dev 網路卡名稱
wget命令使用:wget ip地址
POSTROUTING:出站檢查/安檢
!:取反
--to-source:源地址的轉化
源地址轉換:私有地址 --> 公有地址
防火牆命令:iptables -t nat -A POSTROUTING -s 內網網段 -j SNAT --to 公網介面ip
過程:
server1:(內網1.1.1.1)
        ping測試
[ rootdlocalhost network-scripts]# ping 4.4.4.4
PING 4.4.4.4 (4.4.4.4)56(84) bytes of data.
64 bytes from 4.4.4.4: icmp_seq=1 ttl=63 time=0.376 ms
64 bytes from 4.4.4.4: icmp_seq=2 ttl=63 time=0.467 ms
^c
- - - 4.4.4.4 ping statistics ---
2 packets transmitted,2 received,0% packet loss,time 1002ms
        存取web伺服器
[ root@localhost network-scripts ]# wget 4.4.4.4
--2022-10-30 18:42:36-- http: // 4.4.4.4/
connecting to 4.4.4.4 :80. . . connected .
HTTP request sent,awaiting response. . . 403 Forbidden
2022-10-30 18:42:37 ERROR 403: Forbidden .
  
server2:(防火牆2.2.2.2/3.3.3.3)
        下載iptables
[ root@localhost network-scripts]# yum -y install iptables-services.x86 64
          實現通訊          
[ root@localhost network-scripts]# vim ifcfg-ens33
[ root@localhost network-scripts]# vim ifcfg-ens37
[ root@localhost network-scripts]# systemctl restart network
[ root@localhost network-scripts]# echo 1 > /proc/sys/net/ipv4/ip_forward
[ root@localhost network-scripts]# route add -net 1.1.1.0/24 dev ens33
[ root@localhost network-scripts]# route add -net 4.4.4.0/24 dev ens37
[root@localhost network-scripts]# systemctl stop firewalld.service
        實現通訊
[ root@localhost network-scripts]# iptables -t nat -A POSTROUTING -s 1.1.1.1 ! 1.1.1.0/24 -j SNAT --to- source 3.3.3.3

server3:(web伺服器--外網4.4.4.4)
        下載http服務
[root@localhost ~]#rm -rf /var / run/ yum. pid
[root@localhost ~]#yum -y install httpd.x86_64
        ping測試
[ root@localhost network-scripts]# ping 1.1.1.1
PING 1.1.1.1 ( 1.1.1.1)56(84) bytes of data.
64 bytes from 1.1.1.1: icmp_seq=3 ttl=63 time=0.926 ms
64 bytes from 1.1.1.1: icmp_seq=4 ttl=63 time=0.378 ms
64 bytes from 1.1.1.1: icmp_seq=5 ttl=63 time=0.292 ms
^c
        在http伺服器上寫入東西
補充:/var/www/html 	//http伺服器的登入頁面,可以不寫東西進去
[ root@localhost network-scripts]# cd /var/log/httpd
[ root@localhost httpd]#ll
total 0
[ root@localhost httpd]#ls
[ root@localhost httpd]# echo 123 > 1.txt
        啟動http服務並檢視http服務的狀態
[ root@localhost httpd]# systemctl restart httpd. service
[ root@localhost httpd]# systemctl status httpd.service
        結果:在未寫入規則時,外網上看到了內網伺服器的IP為1.1.1.1(這個不行);在寫入規則之後則內網存取外網時,會通過NAT轉換成公網IP為3.3.3.3進行對外網web伺服器的存取(實現了內網存取外網時,自身的IP不會暴露)
[ root@localhost httpd]# tail -f /var/log/httpd/access_log //記錄裡面是對外網地址去存取伺服器的則符合預期結果
1.1.1.1 - -[30/0ct/2022:18:42:37 +0800] "GET / HTTP/1.1403 4897「-" "Wget/1.14 ( linux-gnu ) "
3.3.3.3 -- [30/oct/2022:18:45:28 +0800] "GET / HTTP/1.1" 403 4897"-""wget/1.14 ( linux-gnu) "
---------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------
②DNAT
目標地址轉換: 公有地址 -- > 私有地址
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 內網地址
過程:
server1:(web伺服器--內網1.1.1.1)
        下載iptables
[ root@localhost network-scripts]# rm -rf /var/run/yum.pid
[root@localhost network-scripts]# yum -y install httpd.x86_64
        在http伺服器上寫入東西
[root@localhost network-scripts]# cd /var/log/httpd/
[ root@localhost httpd]# ls
[ root@localhost httpd]# echo 123 > 1.txt
[ root@localhost httpd]#ll
total 4
- rw-r--r--. 1 root root 4 oct 30 19:05 1.txt
        啟動http服務並檢視http服務的狀態
[ root@localhost httpd]# systemctl restart httpd.service
[root@localhost httpd]# systemctl status httpd.service
        結果:內網上http服務的紀錄檔中檢測到來自外網的http存取    
[ root@localhost httpd]# tail -f /var/log/httpd /access_log
4.4.4.4 - - [30/oct/2022:19:08:25+0800]"GET / HTTP/1.1403 4897「-" "Wget/1.14 ( linux-gnu ) "
4.4.4.4 -- [30/0ct/2022:19:10:59 +0800]「GET / HTTP/1.1" 403 4897 "." "wget/1.14 ( linux-gnu ) "

server2:(防火牆2.2.2.2/3.3.3.3)
        清空規則並寫入規則		/DNDT:凡是存取3.3.3.3/閘道器的全部轉化成1.1.1.1
[ root@localhost network-scripts]# iptables -F
[ root@localhost network-scripts]# iptables -t nat -A PREROUTING -p tcp --dport 8-jDNAT --to-destination 1.1.1.1

server3:(外網4.4.4.4)
        存取web伺服器
[ root@localhost httpd]# wget 1.1.1.1
--2022-10-30 19: 10:59-- http:/l1.1.1.1/
connecting to 1.1.1.1:80. . . connected .
HTTP request sent, awaiting response. . . 403 Forbidden
2022-10-30 19: 10:59 ERROR 403: Forbidden.