Windows系统的安全和权限系统整个设计非常庞大。也分为了很多情况,不同的情况下不同的机制会生效。以下打算从不同的角度来解释和理解Windows系统的安全和权限系统。最重要的是,我这里讲解这些知识不是为了理论,更多是了解理论后便于我们去应用理论,指导我们的实践。
该篇文章为原创,原文网址为:https://www.jianshu.com/p/a6c0d3558add
如需引用请联系作者。保护技术人员的分享热情,促进技术交流,作为搞技术的我们,应该担负这个责任。
在正式开始前,有必要介绍一下安全管理的一些概念。
1.认证和授权的区别
2.认证的几种方式
3.授权的实现方案
4.杂谈
1.认证和授权的区别
认证:是否是我系统中的合法用户,认证通过才有后续的授权访问资源的事情。如果认证都不通过,不说了,没有后续。举例:我系统中没有一个用户的名字叫dog,那么使用dog来登录系统,肯定是认证失败。我系统中有一个用户叫cat,但是我却使用错误的密码来登录,肯定认证还是失败!
授权:假设我cat认证通过,成功登录系统,但我由于是普通用户,我没有得到访问C:\Users\Administrator文件夹的授权,于是我无法打开那个文件夹。
至于Windows下是如何实现认证和授权两个功能的,使用了什么数据结构进行了支撑,我们后面会讲。
2.认证的几种方式
windows下的认证技术和手段有很多,建议文章:MSDN
涉及的几个概念:
SSP, SSPI,SID,ACCESS Token,Credential,privilege,ACL,ACE
接下来的一段内容,大部分的小伙伴看到就头大,想快速跳过。但我要说的是,必须认真的,仔细的一个字一个字的看过去,我已经省略了大部分内容,只把概念相关和精髓的内容提取了出来,我们必须通过这段文字去熟悉这些概念,这些英文,这些英文会在我们系统配置等等中多次出现,只有熟悉了概念,我们才会对看到的配置页面多一些明悟。因此,大家不要轻易随便跳过下面的字句,甚至,我建议大家应该拿笔和纸把下面的概念都写一下,不停地用自己的语言为这些概念下一个定义。只有这样,才会逐步清晰概念,看接下来的文章才不会晕乎。对重要概念,我故意不停地使用英文和中文的双语,就是为了大家能有更多感觉。
SSP(Security Support Provider), SSPI(Security Support Provider Interface):
The Windows operating systems implements a default set of authentication protocols—Kerberos, NTLM, TLS/SSL, Digest, and PKU2U—as part of an extensible architecture. In addition, some protocols are combined into authentication packages such as the Credential Security Support Provider (CredSSP), Negotiate, and Negotiate Extensions. These protocols and packages enable authentication of users, computers, and services; the authentication process, in turn, enables authorized users and services to access resources in a secure manner.
这里解释下:windows定义并实现了Kerberos,NTLM,SSL等一组用于认证的安全协议,他们的最终承载实体就是那些DLL文件,那些DLL文件和通过这些DLL运行起来的各种服务(功能),我们就称之为SSP。为了便于我们使用,定义了一些高层的API给我们用于使用这些服务(协议)来完成认证工作,这些API称之为SSPI(我们就不用自己去了解协议构造的细节,例如报文头部,长度等等,直接使用API的函数来完成认证)。
Microsoft Negotiate is an SSP that acts as an application layer between the Security Support Provider Interface (SSPI) and the other SSPs.(Negotiate充当了SSP和SSPI的中间层,在使用SSPI调用Negotiate的功能时,它会根据配置选择合适的SSP(协议)来实现认证功能)。 When an application calls into SSPI to log on to a network, it can specify an SSP to process the request. If the application specifies Negotiate, Negotiate analyzes the request and selects the best SSP to handle the request based on the configured security policy.
Currently, the Negotiate SSP selects either the Kerberos or NTLM protocol. Negotiate selects the Kerberos protocol unless it cannot be used by one of the systems involved in the authentication or if the client application did not provide a target name as a service principal name (SPN), a user principal name (UPN), or a NetBIOS account name. Otherwise, Negotiate will select the NTLM protocol.
A server that uses the Negotiate SSP can respond to client applications that specifically select either the Kerberos or NTLM protocol. However, a client application must first query the server to determine if it supports the Negotiate package before using Negotiate.
SID:
说到SID首先要解释一个概念sercurity principle(安全实体),一个用户,一个computer都被称之为一个安全实体,对应的安全实体就会在我们的AD中拥有一个account(账号)。一个Account就会分配有SID(理解为一个ID号吧),虽然我们的Account我们看起来是有name(名字)的,但实际系统使用的是我们的SID。
但我们登陆时(这里的登录分几种登录类型,最常见的就是interactive logon--交互登录 和network logon--网络登录),我们会提供我们的credential(用户名+密码)。系统会利用我们的用户名去配合对应的认证手段查找到我们的用户名,找到我们的Account,找到对应account所属的group,然后在认证端(如果Local登录,Local账号,则使用SAM数据库,如果是使用域账户登录,则会将Credential信息“发送”到DC进行认证)的LSA(本地组策略--DC的LSA会影响到整个域Account的特权(privilege))中把对应的account和group的特权(privilege)合并出来,和SID打包在一起,一同 构成该account的Access Token。并把这个access token放入登录成功后代表用户运行的第一个父进程中。从这个父进程开始,创建的所有子进程,默认是继承该access token的。从这个时刻起,认证端的工作就算完了。核心就在于:得到了Access Token,并放入了属于用户的进程中。
那特权(privilege)又是什么呢?我们从LSA(本地组策略)来看:
因此,一个token长下面这样:
当我们使用account(一个安全实体)登录(logon)成功后,LSA会对账户本身和其属于的group进行合并计算并给我们最终的privilege。该信息会在事件日志中记录:
注意上图中的privilege
3.授权的实现方案
但光有这个是不行的,还必须配合我们的另一端:系统上提供相应的功能,例如如何利用特权,利用account SID和组SID来对我们的安全对象进行权限控制(授权)。于是涉及了我们整个认证和权限控制的另一端:安全对象设计机制的配合。
sercurity object:安全对象。在windows系统中,一个文件夹,文件,进程,句柄。我们都称之为一个安全对象。当代表用户的进程(携带access token)打算访问安全对象时,会有一个流程进行授权。只有授权通过,用户进程才能正常访问安全对象。安全对象具有以下和认证相关的属性,用于和access token配合完成授权认证。这些属性我们称之为ACL(访问控制列表)。其中ACL分为DACL和SACL。DACL用于控制授权,SACL用于控制安全审计。一个ACL既然称之为列表,则它内部含有多个ACE(访问控制实体),一个ACE定义了一个SID(其实就是安全实体,可以是用户,可以是组等等)所拥有的操作权限(读,写,执行等)。这样说非常抽象,但是我们后面讲以文件夹的安全配置来理解这些概念。在那之前,我们用图的方式来看看Access Token和ACL的配合来实现授权验证。
上图显示了两个线程,拥有不同的access token,里面还有SID信息(这里使用名字来便于查看)。左侧为我们的安全对象,每个ACE配置了针对不同SID允许的操作。所以,线程B能操作该对象,但线程A就授权验证失败。
上图也是解释一样的概念。
然后继续来看看ACL如何通过我们图形界面来配置的:
上图这么来理解:配置ACE其实就是配置每一个SID(上图中的用户、组)拥有什么权限。这么多个ACE(例如上图有3个SID)就构成了DACL。下图是高级里面,更明细的方式,同时可以配置SACL。
上图可以看到,我们的每一个ACE都是针对每一个principal分配的(安全实体,SID)。同时有Type(这里为Allow),permission(这里为完全控制)。下面我们看看SACL的配置。
LSA:
LSA是一个子系统,用于认证用户,使其能登录到本地电脑,同时LSA维护该电脑上的所有本地安全策略(本地安全策略)。提供了用户名到SID的映射服务。如果本地电脑是一个DC(域控),则该电脑上的所有策略和域账户会保存在AD中。LSA提供了一系列服务用于认证对安全对象的访问、用户权限的确认,并且生成审计信息(事件查看器中)
In general, the LSA performs the following functions:
* Manages local security policy.
* Provides interactive user authentication services(提供各种交互式的认证功能).
* Generates tokens, which contain user and group information as well as information about the security**privileges**for that user. After the initial logon process is complete, all users are identified by their security identifier (SID) and the associated access tokens.
这里意味着两件事情:SID和ACCESS Token是两个不同的东西。同时ACCESS Token含有分离的两个内容:user和group的信息+用户的privileges
* Manages the Audit policy and settings. When an audit alert is generated by the Security Reference Monitor, the LSA is charged with writing that alert to the appropriate system log(事件查看器).
The local security policy identifies the following:
* The domains that are trusted to authenticate logon attempts.
* **Who can have access to the system and in what way (for example, interactively, over the network, or as a service)**.
* Who is assigned privileges.
* What security auditing is to be performed.
* Default memory quotas (paged and nonpaged memory pool usage).
从物理构成上,LSA由以下几个dll组件来提供各种功能:
The LSA has the following components:
- Netlogon.dll . The Net Logon service. Net Logon maintains the computer's secure channel to a domain controller. It passes the user's**credentials**through a secure channel to the domain controller and returns the domain security identifiers and user rights for the user. In Windows 2000, the Net Logon service uses DNS to resolve names to the Internet Protocol (IP) addresses of domain controllers. Net Logon is the replication protocol for Microsoft® Windows NT® version 4.0 primary domain controllers and backup domain controllers.
- Msv1_0.dll . The NTLM authentication protocol. This protocol authenticates clients that do not use Kerberos authentication.
- Schannel.dll . The Secure Sockets Layer (SSL) authentication protocol. This protocol provides authentication over an encrypted channel instead of a less-secure clear channel.
- Kerberos.dll . The Kerberos v5 authentication protocol.
- Kdcsvc.dll . The Kerberos Key Distribution Center (KDC) service, which is responsible for granting ticket-granting tickets to clients.
- Lsasrv.dll . The LSA server service, which enforces security policies.
- Samsrv.dll . The Security Accounts Manager (SAM), which stores local security accounts, enforces locally stored policies, and supports APIs.
- Ntdsa.dll . The directory service module, which supports the Windows 2000 replication protocol and Lightweight Directory Access Protocol (LDAP), and manages partitions of data.
- Secur32.dll . The multiple authentication provider that holds all of the components together.
4.杂谈
Windows下的各种认证方式,常用有两种手段:
1.通过使用SSPI API的方式,在编程中主动指定认证协议和方式,完成认证。--软件开发的角度
2.我们使用各种系统工具,服务的过程中,windows的这些工具和服务自行使用合适的协议完成的认证。--运维和使用的角度
这里从系统维护和使用的角度上讲,我们讲下第2点。
Windows NT下(建议大家了解下撒是Windows NT),当前使用较多的有NTML和Kerberos。NTML主要用于本地工作组的网络环境中(大部分小企业,几乎所有家庭局域网都是工作于该模式下)。而Kerberos主要用于域环境下。他们的主要区别在于,1.NTML要使用服务器的本地账号和密码登录。2.Kerberos使用域账号和密码登录。
我们的认证,一般都是发生在登录环节,而登录又有各种各样的类型。最主要的有两种:
1.interactive logon
2.network logon
Interactive logon:
称之为交互式登录,有物理机本地登录和telnet,RDP等远程登录。这里的交互式是指登录的过程中会需要我们显式地输入用户名和密码,完成登录的过程。注意,登录这个词要宏观来理解。例如,我在运行一个程序时,需要提权,会弹出一个对话框让我输入管理员用户名和密码,这就是一个交互式登录。又例如,我们使用runas运行程序,使用/user选项指定不同的用户名和密码来运行,这也会产生一个交互式登录。鉴于此,我自己理解的交互式,指获得登录后,程序的运行方式是交互式的,例如我们GUI就不说了,即使是telnet过去的命令行,如果我们在telnet连过去的命令行中运行一个程序,程序需要等待我们的输入(例如程序中有c语言的scanf语句),则我们还可以进行输入。可以和人产生交互。
network logon:
称之为网络登录,一般发生在我们访问某一种服务时(不管是本地还是网络上)。例如我们访问服务器的共享文件夹,则会产生一次network logon的事件。 一般来说,network logon不需要交互式输入credential,它会自己首先尝试从当前用户的credential或者凭据管理器(控制面板中有这个东东,大家自己找下,就叫凭据管理器)中找到合适的credential去自动到服务端创建一个network登录。但如果没有找到合适的凭据,则可能会弹出对话框让我们输入凭据。按我的理解,network logon后运行的进程是没有GUI界面的,是无法和用户交互的!!所有的service(服务类程序)都具有该特征。所以所有的客户端连接service应该都是network logon。
不管是interactive logon还是network logon,都会在事件管理器中留下审计信息!这里建议大家自行做一个测试。首先可以下载一个第三方的日志查看器(windows自带的日子查看器在做日志分析时不好用!!)。将windows日志导出后,使用第三方日志查看器查看。(例如导出最近1小时的)。
布置三个任务:
1.在本机,在登录页面登录后,查看日志中 security 部分的logon事件。查看登录类型。
2.通过RDP远程连接成功后,查看logon事件,查看登录类型。
3.服务器创建一个共享文件夹(share),客户端去访问,然后查看服务器的logon事件。
后面的文章,我会来讲讲这些理论如何与我们windows运维和管理进行结合。理解我们平时遇到的认证和权限问题背后的原理。