SELinux深入理解

来源:http://www.cnblogs.com/yaohong/archive/2017/08/11/7344343.html
-Advertisement-
Play Games

1. 簡介 SELinux帶給Linux的主要價值是:提供了一個靈活的,可配置的MAC機制。 Security-Enhanced linux (SELinux)由以下兩部分組成: 1) Kernel SELinux模塊(/kernel/security/selinux) 2) 用戶態工具 SELin ...


1. 簡介

    SELinux帶給Linux的主要價值是:提供了一個靈活的,可配置的MAC機制。

    Security-Enhanced linux (SELinux)由以下兩部分組成:

    1) Kernel SELinux模塊(/kernel/security/selinux)

    2) 用戶態工具

    SELinux是一個安全體繫結構,它通過LSM(Linux Security Modules)框架被集成到Linux Kernel 2.6.x中。它是NSA (United States National Security Agency)和SELinux社區的聯合項目。

    SELinux提供了一種靈活的強制訪問控制(MAC)系統,且內嵌於Linux Kernel中。SELinux定義了系統中每個【用戶】、【進程】、【應用】和【文件】的訪問和轉變的許可權,然後它使用一個安全策略來控制這些實體(用戶、進程、應用和文件)之間的交互,安全策略指定如何嚴格或寬鬆地進行檢查。

    SELinux對系統用戶(system users)是透明的,只有系統管理員需要考慮在他的伺服器中如何制定嚴格的策略。策略可以根據需要是嚴格的或寬鬆的。

    只有同時滿足了【標準Linux訪問控制】和【SELinux訪問控制】時,主體才能訪問客體。

 

1.1 DAC與MAC的關鍵區別(root用戶)

 

      安 全增強型Linux(SELinux)開始是由NSA(國家安全局)啟動並加入到Linux系統中的一套核心組件及用戶工具,可以讓應用程式運行在其所需的最低許可權上。未 經修改過的Linux系統是使用自主訪問控制的,用戶可以自己請求更高的許可權,由此惡意軟體幾乎可以訪問任何它想訪問的文件,而如果你授予其root權 限,那它就無所不能了。

      在SELinux中沒有root這個概念,安全策略是由管理員來定義的,任何軟體都無法取代它。這意味著那些潛在的惡意軟體所能造成的損害可以被控制在最小。一般情況下只有非常註重數據安全的企業級用戶才會使用SELinux。  

      操作系統有兩類訪問控制:自主訪問控制(DAC)和強制訪問控制(MAC)。標準Linux安全是一種DAC,SELinux為Linux增加了一個靈活的和可配置的的MAC。

      所有DAC機制都有一個共同的弱點,就是它們不能識別自然人與電腦程式之間最基本的區別。簡單點說就是,如果一個用戶被授權允許訪問,意味著程式也被授權訪問,如果程式被授權訪問,那麼惡意程式也將有同樣的訪問權。 DAC最根本的弱點是主體容易受到多種多樣的惡意軟體的攻擊,MAC就是避免這些攻擊的出路,大多數MAC特性組成了多層安全模型。

      SELinux實現了一個更靈活的MAC形式,叫做類型強制(Type Enforcement)和一個非強制的多層安全形式(Multi-Level Security)。

      在Android4.2中,SELinux是個可選項,谷歌並沒有直接取消root許可權或其他功能。這是一個為企業級用戶或是對隱私數據極為重視的用戶提供的選項,普通消費者則完全可以關閉它。   


2. SELinux的運行機制

    SELinux決策過程如下圖所示:



      當一個subject(如: 一個應用)試圖訪問一個object(如:一個文件),Kernel中的策略執行伺服器將檢查AVC (Access Vector Cache), 在AVC中,subject和object的許可權被緩存(cached)。如果基於AVC中的數據不能做出決定,則請求安全伺服器,安全伺服器在一個矩陣中查找“應用+文件”的安全環境。然後根據查詢結果允許或拒絕訪問,拒絕消息細節位於/var/log/messages中。

3. SELinux偽文件系統

    /selinux/偽文件系統kernel子系統通常使用的命令,它類似於/proc/偽文件系統。系統管理員和用戶不需要操作這部分。/selinux/目錄舉例如下:

 

[cpp] view plain copy  
  1. -rw-rw-rw-  1 root root 0 Sep 22 13:14 access  
  2. dr-xr-xr-x  1 root root 0 Sep 22 13:14 booleans  
  3. --w-------  1 root root 0 Sep 22 13:14 commit_pending_bools  
  4. -rw-rw-rw-  1 root root 0 Sep 22 13:14 context  
  5. -rw-rw-rw-  1 root root 0 Sep 22 13:14 create  
  6. --w-------  1 root root 0 Sep 22 13:14 disable  
  7. -rw-r--r--  1 root root 0 Sep 22 13:14 enforce  
  8. -rw-------  1 root root 0 Sep 22 13:14 load  
  9. -r--r--r--  1 root root 0 Sep 22 13:14 mls  
  10. -r--r--r--  1 root root 0 Sep 22 13:14 policyvers  
  11. -rw-rw-rw-  1 root root 0 Sep 22 13:14 relabel  
  12. -rw-rw-rw-  1 root root 0 Sep 22 13:14 user  


   如cat enforce其值可能如下:

 

   1: enforcing mode 

   0: permissive mode

4. SELinux配置文件

    SELinux配置文件(configuration)或策略文件(policy)位於/etc/目錄下。

4.1 /etc/sysconfig/selinux配置文件

     /etc/sysconfig/selinux是一個符號鏈接,真正的配置文件為:/etc/selinux/config 

     配置SELinux有如下兩種方式:

      1) 使用配置工具:Security Level Configuration Tool (system-config-selinux)

      2) 編輯配置文件 (/etc/sysconfig/selinux).

      /etc/sysconfig/selinux中包含如下配置選項:

     1) 打開或關閉SELinux

     2) 設置系統執行哪一個策略(policy)

     3) 設置系統如何執行策略(policy)

4.2 配置文件選項

4.2.1 SELINUX

        SELINUX=enforcing|permissive|disabled —定義SELinux的高級狀態
        • enforcing — The SELinux security policy is enforced.
        • permissive — The SELinux system prints warnings but does not enforce policy.
        • disabled — SELinux is fully disabled. SELinux hooks are disengaged from the kernel and the pseudo-file system is unregistered.

4.2.2 SELINUXTYPE(安全策略)

         SELINUXTYPE=targeted|strict — 指定SELinux執行哪一個策略
         • targeted — 只有目標網路daemons保護。每個daemon是否執行策略,可通過system-config-selinux進行配置。保護常見的網路服務,為SELinux預設值。
         可使用如下工具設置每個daemon的布爾值:

         1) getsebool -a: 列出SELinux的所有布爾值

         2) setsebool: 設置SELinux布爾值,如:setsebool -P dhcpd_disable_trans=0,-P表示即使用reboot之後,仍然有效。

         • strict — 對SELinux執行完全的保護。為所有的subjects和objects定義安全環境,且每一個Action由策略執行伺服器處理。提供符合Role-based-Access Control(RBAC)之policy,具備完整的保護功能,保護網路服務、一般指令及應用程式。

 

4.2.3 SETLOCALDEFS

         SETLOCALDEFS=0|1 — 控制如何設置本地定義(users and booleans)。

 

         • 1:這些定義由load_policy控制,load_policy來自於文件/etc/selinux/<policyname>

         • 0:由semanage控制

 

4.3 /etc/selinux/目錄

      /etc/selinux/是存放所有策略文件和主要配置文件的目錄。其例子如下:   

 

 

[cpp] view plain copy  
  1. -rw-r--r--  1 root root  448 Sep 22 17:34 config  
  2. drwxr-xr-x  5 root root 4096 Sep 22 17:27 strict  
  3. drwxr-xr-x  5 root root 4096 Sep 22 17:28 targeted  

 

5. SELinux工具

1) /usr/sbin/setenforce — 修改SELinux運行模式,例子如下:

         • setenforce 1 — SELinux以強制(enforcing)模式運行
         • setenforce 0 — SELinux以警告(permissive)模式運行

    為了關閉SELinux,你可以修改配置文件:/etc/selinux/config或/etc/sysconfig/selinux


2) /usr/sbin/sestatus -v — 顯示系統的詳細狀態,例子如下:

 

[cpp] view plain copy  
  1. SELinux status:                 enabled  
  2. SELinuxfs mount:                /selinux  
  3. Current mode:                   enforcing  
  4. Mode from config file:          enforcing  
  5. Policy version:                 21  
  6. Policy from config file:        targeted  
  7.   
  8. Process contexts:  
  9. Current context:                user_u:system_r:unconfined_t:s0  
  10. Init context:                   system_u:system_r:init_t:s0  
  11. /sbin/mingetty                  system_u:system_r:getty_t:s0  


3) /usr/bin/newrole — 在一個新的context或role中運行一個新的shell

 

4) /sbin/restorecon — 通過為適當的文件或安全環境標記擴展屬性,設置一個或多個文件的安全環境

5) /sbin/fixfiles — 檢查或校正文件系統中的安全環境資料庫

6) getsebool — getsebool -a:查看所有布爾值

7) setsebool — 參數-P,永久性設置

8) chcon 修改文件、目錄的安全上下文
      chcon –u[user]
      chcon –r[role]
      chcon –t[type] 
      chcon –R  遞歸

6. 類型強制的安全上下文(Type Enforcement Security Context)

    安全上下文是一個簡單的、一致的訪問控制屬性,在SELinux中,類型標識符是安全上下文的主要組成部分,由於歷史原因,一個進程的類型通常被稱為一個域(domain),"域"和"域類型"意思都一樣,我們不必苛刻地去區分或避免使用術語域,通常,我們認為【域】、【域類型】、【主體類型】和【進程類型】都是同義的,即都是安全上下文中的“TYPE”。

    SELinux對系統中的許多命令做了修改,通過添加一個-Z選項顯示客體和主體的安全上下文。

    1) 系統根據PAM子系統中的pam_selinux.so模塊設定登錄者運行程式的安全上下文;
    2) 文件的Security Contex規則如下:

        • rpm包安裝的:會根據rpm包內記錄來生成安全上下文;

        • 手動創建的文件:會根據policy中規定的來設置安全上下文;

        • cp:會重新生成安全上下文;

        • mv:安全上下文則不變。

    3) id -Z 
        顯示了你的shell的安全上下文;
    4) ps -Z

        檢查進程的安全上下文;
    5) ls -Z
        檢查文件、目錄的安全上下文;

6.1 安全上下文格式

      所有操作系統訪問控制都是以關聯的客體和主體的某種類型的訪問控制屬性為基礎的。在SELinux中,訪問控制屬性叫做安全上下文。所有客體(文件、進程間通訊通道、套接字、網路主機等)和主體(進程)都有與其關聯的安全上下文,一個安全上下文由三部分組成:用戶、角色和類型標識符。常常用下麵的格式指定或顯示安全上下文:

      USER:ROLE:TYPE[LEVEL[:CATEGORY]]

      安全上下文中的用戶和角色標識符除了對強制有一點約束之外對類型強制訪問控制策略沒什麼影響,對於進程,用戶和角色標識符顯得更有意義,因為它們是用於控制類型和用戶標識符的聯合體,這樣就會與Linux用戶賬號關聯起來;然而,對於客體,用戶和角色標識符幾乎很少使用,為了規範管理,客體的角色常常是object_r,客體的用戶常常是創建客體的進程的用戶標識符,它們在訪問控制上沒什麼作用。

      標準Linux安全中的用戶ID和安全上下文中的用戶標識符之間的區別,就技術而論,它們是正交標識符,分別用於標準的和安全增強的訪問控制機制,這兩者之間的任一相互關聯都是通過登陸進程按照規範嚴格規定的,而不是通過SELinux策略直接強制實施的。

6.1.1 USER

 

         1) user identity:類似Linux系統中的UID,提供身份識別,用來記錄身份;安全上下文的一部分;
         2) 三種常見的 user:

              • user_u :普通用戶登錄系統後的預設;
             • system_u :開機過程中系統進程的預設;
             • root :root 登錄後的預設;

        3) 在 targeted policy 中 users 不是很重要;
        4) 在strict policy 中比較重要,所有預設的 SELinux Users 都是以 “_u” 結尾的,root 除外。

6.1.2 ROLE

        1) 文件、目錄和設備的role:通常是 object_r;
        2) 程式的role:通常是 system_r;
        3) 用戶的role:targeted policy為system_r; strict policy為sysadm_r、staff_r、user_r;用戶的role,類似系統中的GID,不同角色具備不同的的許可權;用戶可以具備多個role;但是同一時間內只能使用一個role;        

        4) 使用基於RBAC(Roles Based Access Control) 的strict和mls策略中,用來存儲角色信息

6.1.3 TYPE

 

        1) type:用來將主體(subject)和客體(object)劃分為不同的組,給每個主體和系統中的客體定義了一個類型;為進程運行提供最低的許可權環境;
        2) 當一個類型與執行中的進程相關聯時,其type也稱為domain;
        3) type是SElinux security context 中最重要的部位,是 SELinux Type Enforcement 的心臟,預設值以_t結尾;

        LEVEL和CATEGORY:定義層次和分類,只用於mls策略中
             • LEVEL:代表安全等級,目前已經定義的安全等級為s0-s15,等級越來越高
             • CATEGORY:代表分類,目前已經定義的分類為c0-c1023

6.2 對比SELinux和標準Linux的訪問控制屬性

      在標準Linux中,主體的訪問控制屬性是與進程通過在內核中的進程結構關聯的真實有效的用戶和組ID,這些屬性通過內核利用大量工具進行保護,包括登陸進程和setuid程式,對於客體(如文件),文件的inode包括一套訪問模式位、文件用戶和組ID。以前的訪問控制基於讀/寫/執行這三個控制位,文件所有者、文件所有者所屬組、其他人各一套。

      在SELinux中,訪問控制屬性總是安全上下文三人組(用戶:角色:類型)形式,所有客體和主體都有一個關聯的安全上下文。需要特別指出的是,因為SELinux的主要訪問控制特性是類型強制,安全上下文中的類型標識符決定了訪問權。

      註意:SELinux是在標準Linux基礎上增加了類型強制(TE: Type Enforcement),這就意味著標準Linux和SELinux訪問控制都必須滿足先要能訪問一個客體,例如:如果我們對某個文件有SELinux寫入許可權,但我們沒有該文件的w許可,那麼我們也不能寫該文件。下表總結了標準Linux和SELinux之間訪問控制屬性的對比:     

 

  標準Linux SELInux
進程安全屬性 真實有效的用戶和組ID 安全上下文
客體安全屬性 訪問模式、文件用戶和組ID 安全上下文
訪問控制基礎 進程用戶/組ID和文件的訪問模式,
此訪問模式基於文件的用戶/組ID
在進程類型和文件類型
之間允許的許可

 

 


6.3 小結

      1) 系統中每個文件、目錄、網路埠等都被指定一個安全上下文,policy 則給出各安全上下文之間的作用規則。
      2) SELinux根據policy及security context規則來決定存取行為是否可執行;
      3) Subject(主體):系統進程,比如/usr/sbin/httpd;
      4) Object(客體):被存取的項目,比如File、Directory、IP、Socket等;

 

7. 類型強制(TE)訪問控制

     在SELinux中,所有訪問都必須明確授權,SELinux預設不允許任何訪問,不管Linux用戶/組ID是什麼。這就意味著在SELinux中,沒有預設的超級用戶了,與標準Linux中的root不一樣,通過指定主體類型(即域)和客體類型使用allow規則授予訪問許可權,allow規則由四部分組成:

 

     • 源類型(Source type(s) ) 通常是嘗試訪問的進程的域類型
     • 目標類型(Target type(s) ) 被進程訪問的客體的類型
     • 客體類別(Object class(es)) 指定允許訪問的客體的類型
     • 許可(Permission(s)) 象徵目標類型允許源類型訪問客體類型的訪問種類
     舉例如下:

 

[cpp] view plain copy  
  1. allow user_t bin_t : file {read execute getattr};  

     這個例子顯示了TE allow規則的基礎語法,這個規則包含了兩個類型標識符:源類型(或主體類型或域)user_t,目標類型(或客體類型)bin_t。標識符file是定義在策略中的客體類別名稱(在這裡,表示一個普通的文件),大括弧中包括的許可是文件客體類別有效許可的一個子集,這個規則解釋如下:

     擁有域類型user_t的進程可以讀/執行或獲取具有bin_t類型的文件客體的屬性。

     SELinux allow規則如之前的例子在SELinux中實際上都是授予訪問權的,真正的挑戰是如何保證數以萬計的訪問正確授權,只授予必須的許可權,實現儘可能的安全。

7.1 標準Linux安全中的setuid程式

      精通用戶joe想安全地修改現有的密碼問題,Linux解決這個問題的方法是通過給passwd賦一個setuid值,使其執行時具有root許可權,如果你在一個普通Linux系統上列出密碼文件,你看到的會是:

[cpp] view plain copy  
  1. # ls -l /usr/bin/passwd  
  2. -rwsr-xr-x. 1 root root 41292 Sep  7  2012 /usr/bin/passwd  

       這裡註意兩件事,第一個是在所有者許可權的x位置被設置為s了,這就是所謂的setuid位,意思是任何執行這個文件的進程,它的有效UID(即用戶ID)將會被改為文件所有者。這裡,root是文件所有者,因此當執行密碼程式時實際上將會以root用戶的ID運行。其執行過程如下圖所示:

       從上面的分析中可以看出,passwd以root許可權的身份運行, 它可以訪問系統的任何資源,這給系統帶來了安全問題,其實它只需要訪問shadow及其相關的文件就可以了。而且shadow只需要接受passwd的訪問即可。這在標準Linux中是無法做到的,而TE(類型強制)可實現此功能。

 

8. 基於角色的訪問控制

    SELinux也提供了一種基於角色的訪問控制(RBAC),SELinux的RBAC特性是依靠類型強制建立的,SELinux中的訪問控制主要是通過類型實現的,角色基於進程安全上下文中的角色標識符限制進程可以轉變的類型,如此,策略編寫器可以創建一個角色,允許它轉變為一套域類型(假設類型強制規則允許轉變),從而定義角色的限制。

 

9. SELinux中的多級安全(Multi-Level Security)

    類型強制(Type Enforcement)無疑是SELinux引入的最重要的強制訪問控制(MAC)機制,然而,在某些情況下,主要是保密控制應用程式的一個子集,傳統的多級安全(MLS)MAC與類型強制一起使用顯得更有價值,在這些情況下,SELinux總是包括某種格式的MLS功能,MLS特性是可選的,在SELinux的兩個MAC機制中,它通常不是最重要的那個,對大多數安全應用程式而言,包括許多非保密數據應用程式,類型強制是最適合的安全增強的機制,儘管如此,MLS對部分應用程式還是增強了安全性。

     在大多數SELinux策略中,敏感度(s0,s1,...)和範疇(c0,c1,...)使用通配名,將它留給用戶空間程式和程式庫,以指定有意義的用戶名。(例如:s0可能與UNCLASSIFIED 關聯,s1可能與SECRET關聯)
     為了支持MLS,安全上下文被擴展了,包括了安全級別,如:

 

[cpp] view plain copy  
  1. user:role:type:sensitivity[:category,...] [-sensitivity[:category,...]]  


     例子如下所示:

 

 

[cpp] view plain copy  
  1. root@luohj-virtual-machine:~# ps -aZ  
  2. LABEL                                        PID   TTY   TIME    CMD  
  3. unconfined_u:system_r:insmod_t:s0-s0:c0.c255 4940 pts/0 00:00:00 passwd  

 

     註意MLS安全上下文至少必須有一個安全級別(它由單個敏感度和0個或多個範疇組成),但可以包括兩個安全級別,這兩個安全級別分別被叫做低(或進程趨勢)和高(或進程間隙),如果高安全級別丟失,它會被認為與低安全級別的值是相同的(最常見的情況),實際上,對於客體和進程而言,低和高安全級別通常都是相同的,通常用於進程的級別範圍被認為是受信任的主體(即進程信任降級信息)或多層客體,如一個目錄,它又包括了不同安全級別的客體。為了使描述簡單,假設所有的進程和客體都只有一個安全級別。

10. 策略分析工具apol

      apol(即analyze policy【分析策略】)工具是一個成熟的SELinux策略分析工具,它位於setools工具包中。使用它打開policy.xx文件即可分析所有的相關策略。xx為策略編譯器(checkpolicy)的版本號。


 

11. 小結

      SELinux訪問控制是基於與所有系統資源(包括進程)關聯的安全上下文的,安全上下文包括三個組件:用戶、角色和類型標識符。類型標識符是訪問控制的主要基礎。

      在SELinux中,訪問控制的主要特性是類型強制,在主體(即進程)與客體之間通過指定allow規則(主體的類型【也叫做域類型】是源,客體的類型是目標)進行訪問授權,訪問被授予特定的客體類別,為每個客體類別設置細粒度的許可。

      類型強制的一個關鍵優勢是它可以控制哪個程式可能運行在給定的域類型上,因此,它允許對單個程式進行訪問控制(比起用戶級的安全控制要安全得多了),使程式進入另一個域(即以一個給定的進程類型運行)叫做域轉變,它是通過SELinux的allow規則緊密控制的,SELinux也允許通過type_transition 文件使域轉變自動發生。

      SELinux在訪問控制安全上下文中不直接使用角色標識符,相反,所有的訪問都是基於類型的,角色用於關聯允許的域類型,這樣可以設置類型強制允許的功能組合到一起,將用戶作為一個角色進行認證。

      SELinux提供了一個可選的MLS訪問控制機制,它提供了更多的訪問限制,MLS特性依靠TE機制建立起來的,MLS擴展了安全上下文的內容,包括了一個當前的(或低)安全級別和一個可選的高安全級別。












參考:http://www.centos.org/docs/5/html/Deployment_Guide-en-US/selg-overview.html

            http://wenku.baidu.com/view/df89fe235901020207409c49.html

            http://wenku.baidu.com/view/fed9abb569dc5022aaea002d.html

            http://selinux.sourceforge.net Homepage for the SELinux community.

            http://www.nsa.gov/selinux/ Homepage for the NSA SELinux development team. Many resources are available in HTML and PDF formats. Although many of these links are not SELinux specific, some concepts may apply. 

            http://fedora.redhat.com/docs/ Homepage for the Fedora documentation project, which contains Fedora Core specific materials that may be more timely, since the release cycle is much shorter.

         http://wenku.baidu.com/view/4d26594fc850ad02de804189.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Desktop:基本的桌面系統,包括常用的桌面軟體,如文檔查看工具;Minimal Desktop:基本的桌面系統,包含的軟體更少;Minimal:基本的系統,不包含任何可選的軟體包;Basic Server:安裝的基本系統的平臺支持,不包含桌面;Database Server:基本系統平臺,加上M... ...
  • 1.1 wrap簡介 wrap工作在內核空間和應用程式中間的庫層次中。在內核接受到數據包准備傳送到用戶空間時都會經過庫層次,對於部分(只是部分)應用程式會在經過庫層次時會被wrap庫文件阻擋下來檢查一番,如果允許通過則交給應用程式。 1.2 查看是否支持wrapper wrap只會檢查tcp數據包, ...
  • 本文目錄: 1.1 pxe安裝系統 1.2 cobbler基本介紹 1.3 安裝和配置cobbler 1.3.1 安裝cobbler 1.3.2 配置dhcp和tftp 1.4 cobbler從本地光碟安裝系統 1.4.1 生成distro 1.4.2 提供kickstart文件 1.4.3 提供p ...
  • 一、概述 Linux 組配置(/etc/group)文件分為4個欄位,分別為: 組名、組密碼、GID和組成員。 二、示例 [root@titan ~]# cat /etc/group | grep fruit fruit:x:1001: 其中,fruit為組名,x為組密碼,1001為GID,組成員字 ...
  • #include<stdio.h> #include<string.h> #define N 100 int main(int argc, const char *argv[]) { char str1[N]; char str2[N]; ①scanf("%s",str1); ②gets(str1) ...
  • chenwx@chenwx-virtual-machine:~$ su Password: su: Authentication failure //切換失敗 chenwx@chenwx-virtual-machine:~$ sudo passwd root //修改密碼 [sudo] passwo ...
  • 1.打開終端 cd /java/tomcat 2.執行 bin/startup.sh 啟動tomcat bin/shutdown.sh 停止tomcat tail f logs/catalina.out 看tomcat的控制台輸出; 3.看是否已經有tomcat在運行了 ps ef |grep to ...
  • 今天碰到了功能變數名稱被惡意指向的情況,一個垃圾功能變數名稱指向了伺服器的ip,還被人投訴。網上找了一下,原來是nginx的預設空主機頭的問題,nginx的預設配置中的虛擬主機允許用戶通過IP訪問,或者通過未設置的功能變數名稱訪問,這就會被人惡意指向。 編輯conf/nginx.conf文件,加上或者修改預設設置 serv ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...