2013年12月9日星期一

05-Windows Server 2012 R2 会话远程桌面-标准部署-RD连接代理高可用性(RemoteApp)

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
05-Windows Server 2012 R2 会话远程桌面-标准部署-RD连接代理高可用性(RemoteApp)  阅读原文»

每日博报 精彩不止一点关闭
05-Windows Server 2012 R2 会话远程桌面-标准部署-RD连接代理高可用性(RemoteApp)

马博峰

在之前的文章中,我们以快速的部署方式和标准部署的方式完成了RemoteApp的部署,如果在企业正式环境中需要部署基于会话的远程桌面,那么最好采用标准部署。在标准的部署中,有一个重要的功能角色服务,那就是RD连接代理,RD连接代理是负载平衡RD会话主机服务器场中的会话负载平衡和会话重连。还可使用 RD 连接代理并通过 RemoteApp 和桌面连接让用户访问RemoteApp程序和虚拟机,所以他在整体会话远程桌面中起到重要的作用,从部署架构中可以看到,RD连接代理处于中间的位置,起到连接前端和后端应用或者桌面的连接,所以,当RD连接代理出现故障时,整个会话远程就全部中断了,无法使用。

clip_image001

在我们要考虑增加安全性和可用性的同时,也要同时考虑其中的某些服务的高可用性,可以使用多台服务器或者虚拟机为RD连接代理进行服务,远程桌面连接代理(RD连接代理)支持负载平衡和会话重新连接到新的会话主机场, RD连接代理也用来提供用户通过RemoteApp和桌面的连接,如果启用了RD连接代理的均衡负载,则RD连接代理还会在每个RD会话主机或者RD会话场跟踪用户会话的数量。下图就是RD连接代理的高可用性设计图

clip_image002

Active/Active的RD连接代理模式是Windows Server 2012 R2是一个完整的高可用性部署,每个RD接代理服务器都是活跃的,提供共享负载。它提供了高可用性和高可用伸缩性,适合更大规模的部署。设置RD接代理服务高可用性需要SQL数据库的支持,SQL数据库用于存储RD连接代理服务器运行时的情况和配置数据,这种Active/Active的RD代理为管理员提供一个轻松部署高可用性和可伸缩性RD连接代理服务器的解决方案。

一、部署的前提条件:

1、 至少需要2台windows server 2012 R2安装RD连接代理服务。

2、 需要特定的数据库服务器或SQL数据库实例,SQL服务器版本为2008 R2标准版或更高版本。

3、 所有RD连接代理服务器都必须安装SQL客户端。

4、 RD代理服务器拥有完全权限的SQL数据库和SQL文件夹。

5、 至少需要一台会话主机服务器。

6、 确保网络中的防火墙没有阻拦服务器的通信。

设置RD连接代理高可用性至少需要4台服务器,其中1台为域控制器,并设置了DNS服务器,一台为SQL服务器,支持SQL server 2008 R2和SQL server 2012,剩下2台服务器中,其中有一台必须安装了RD连接代理,并且这些服务器都加入了域环境,以域管理员的身份进行登陆。

服务器名称

操作系统

IP设置

功能

AD-DC.mabofeng.com

Windows Server 2012 R2

192.168.1.100

域控制器

RDCB01.mabofeng.com

Windows Server 2012 R2

192.168.1.110

远程桌面连接代理01

RDCB02.mabofeng.com

从NDK在非Root手机上的调试原理探讨Android的安全机制  阅读原文»

从NDK在非Root手机上的调试原理探讨Android的安全机制

最近都在忙着研究Android的安全攻防技术,好长一段时间没有写博客了,准备回归老本行中--Readthefunckingandroidsourcecode。这两天在看NDK文档的时候,看到一句话"Nativedebugging...doesnotrequirerootorprivilegedaccess,aslongasyourapplicationisdebuggable"。咦,NDK调试不就是通过ptrace来实现调试的么?在非Root的手机上是怎么进行ptrace的呢?借这两个问题正好可以介绍一下Android的安全机制。

老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注!

Android是一个基于Linux内核的移动操作系统。Linux是一个支持多用户的系统,系统中的文件的访问权限是通过用户ID(UID)和用户组ID(GID)来控制的。换句话说,就是Linux的安全机制是基于UID和GID来实现的。Android在Linux内核提供的基于UID和GID的安全机制的基础上,又实现了一套称为Permission的安全机制,如图1所示:

105632116.png

图1Linux的UID/GID安全机制与Android的Permission安全机制

那么,这两个安全机制是如何对应起来的呢?

我们首先看一下Linux基于UID和GID的安全机制,它包含三个基本角色:用户、进程和文件,如图2所示:

105655515.png

图2Linux基于UID/GID的安全机制的三个角色

Linux中的每一个用户都分配有一个UID,然后所有的用户又按组来进划分,每一个用户组都分配有一个GID。注意,一个用户可以属于多个用户组,也就是说,一个UID可以对应多个GID。在一个用户所对应的用户组中,其中有一个称为主用户组,其它的称为补充用户组。

Linux中的每一个文件都具有三种权限:Read、Write和Execute。这三种权限又按照用户属性划分为三组:Owner、Group和Other。如图3所示:

105737691.png

图3Linux的文件权限划分

从图3就可以看出文件acct:1.所有者为root,可读可写可执行;2.所有者所属的主用户组为root,在这个组中的其它用户可读可执行;3.其余的用户可读可执行。

Linux中的每一个进程都关联有一个用户,也就是对应有一个UID,如图4所示:

105801887.png

图4Linux的进程

由于每一个用户都对应有一个主用户组,以及若干个补充用户组,因此,每一个进程除了有一个对应的UID之外,还对应有一个主GID,以及若干个SupplementaryGIDs。这些UID和GID就决定了一个进程所能访问的文件或者所能调用的系统API。例如,在图4中,PID为340的进程一般来说,就只能访问所有者为u0_a19的文件。

一个进程的UID是怎么来的呢?在默认情况下,就等于创建它的进程的UID,也就是它的父进程的UID。Linux的第一个进程是init进程,它是由内核在启动完成后创建的,它的UID是root。然后系统中的所有其它进程都是直接由init进程或者间接由init进程的子进程来创建。所以默认情况下,系统的所有进程的UID都应该是root。但是实际情况并非如此,因为父进程在创建子进程之后,也就是在fork之后,可以调用setuid来改变它的UID。例如,在PC中,init进程启动之后,会先让用户登录。用户登录成功后,就对应有一个shell进程。该shell进程的UID就会被setuid修改为所登录的用户。之后系统中创建的其余进程的UID为所登录的用户。

进程的UID除了来自于父进程之外,还有另外一种途径。上面我们说到,Linux的文件有三种权限,分别是Read、Wirte和Execute。其实还有另外一个种权限,叫做SUID。例如,我们对Android手机进行root的过程中,会在里面放置一个su文件。这个su文件就具有SUID权限,如图5所示:

105819596.png

图5su的SUID和SGID

一个可执行文件一旦被设置了SUID位,那么当它被一个进程通过exec加载之后,该进程的UID就会变成该可执行文件的所有者的UID。也就是说,当上述的su被执行的时候,它所运行在的进程的UID是root,于是它就具有最高级别的权限,想干什么就干什么。

与SUI类似,文件还有另外一个称为SGID的权限,不过它描述的是用户组。也就是说,一个可执行文件一旦被设置了GUID位,么当它被一个进程通过exec加载之后,该进程的主UID就会变成该可执行文件的所有者的主UID。

现在,小伙伴们应该可以理解Android手机的root原理了吧:一个普通的进程通过执行su,从而获得一个具有root权限的进程。有了这个具有root权限的进程之后,就可以想干什么就干什么了。su所做的事情其实很简单,它再fork另外一个子进程来做真正的事情,也就是我们在执行su的时候,后面所跟的那些参数。由于su所运行在的进程的UID是root,因此由它fork出来的子进程的UID也是root。于是,子进程也可以想干什么就干什么了。

不过呢,用来root手机的su还会配合另外一个称为superuser的app来使用。su在fork子进程来做真正的事情之前,会将superuser启动起来,询问用户是否允许fork一个UID是root的子进程。这样就可以对root权限进行控制,避免被恶意应用偷偷地使用。

这里是su的源代码,小伙伴们可以根据上面所讲的知识读一读:https://code.google.com/p/superuser/source/browse/trunk/su/su.c?r=2

在传统的UNIX以及类UNIX系统中,进程的权限只划分两种:特权和非特权。UID等于0的进程就是特权进程,它们可以通过一切的权限检查。UID不等于0的进程就非特权进程,它们在访问一些敏感资源或者调用一个敏感API时,需要进行权限检查。这种纯粹通过UID来做权限检查的安全机制来粗放了。于是,Linux从2.2开始,从进程的权限进行了细分,称为Capabilities。一个进程所具有Capabilities可以通过capset和prctl等系统API来设置。也就是说,当一个进程调用一个敏感的系统API时,Linux内核除了考虑它的UID之外,还会考虑它是否具有对应的Capability。

这里就是Linux所设计的Capabilities列表,有兴趣的小伙伴可以再读一读:http://man7.org/linux/man-pages/man7/capabilities.7.html

以上就是Linux基于UID/GID的安全机制的核心内容。接下来我们再看Android基于Permission的安全机制,它也有三个角色:apk、signature和permission,如图6所示:

105841690.png

图6Android的Permission安全机制

Android的APK经过PackageManagerService安装之后,就相当于Linux里面的User,它们都会被分配到一个UID和一个主GID,而APK所申请的Permission就相当于是Linux里面的SupplementaryGID。

我们知道,Android的APK都是运行在独立的应用程序进程里面的,并且这些应用程序进程都是Zygote进程fork出来的。Zygote进程又是由init进程fork出来的,并且它被init进程fork出来后,没有被setuid降权,也就是它的uid仍然是root。按照我们前面所说的,应用程序进程被Zygote进程fork出来的时候,它的UID也应当是root。但是,它们的UID会被setuid修改为所加载的APK被分配的UID。

参照Android应用程序进程启动过程的源代码分析一文的分析,ActivityManagerService在请求Zygote创建应用程序进程的时候,会将这个应用程序所加载的APK所分配得到的UID和GID(包括主GID和SupplementaryGID)都收集起来,并且将它们作为参数传递给Zygote进程。Zygote进程通过执行函数来fork应用程序进程:

  /*   * Utility routine to fork zygote and specialize the child process.   */  static pid_t forkAndSpecializeCommon(const u4* args, bool isSystemServer)  {      pid_t pid;      uid_t uid = (uid_t) args[0];      gid_t gid = (gid_t) args[1];      ArrayObject* gids = (ArrayObject *)args[2];      ......      pid = fork();  if (pid == 0) {          ......          err = setgroupsIntarray(gids);          ......          err = setgid(gid);          ......          err = setuid(uid);          ......      }      .....  return pid;  }  

参数args[0]、args[1]和args[]保存的就是APK分配到的UID、主GID和SupplementaryGID,它们分别通过setuid、setgid和setgroupsIntarray设置给当前fork出来的应用程序进程,于是应用程序进程就不再具有root权限了。

那么,Signature又充当什么作用呢?两个作用:1.控制哪些APK可以共享同一个UID;2.控制哪些APK可以申请哪些Permission。

我们知道,如果要让两个APK共享同一个UID,那么就

阅读更多内容

没有评论:

发表评论