精华内容
下载资源
问答
  • 2014-08-13 20:27:11

    针对单线程服务器模型的特点,我们可以对其进行改进,使之能对多个客户端同时进行响应。最简单的改进即是使用多线程(或多进程)服务器模型,在应用层级别,我们一般采用多线程模式。多线程能让多个客户端同时请求,并能几乎同时对这些请求进行响应,而不用排队一个一个处理,能同时为多个客户端提供一问一答的服务。

    图2-6-1-2 多线程阻塞服务器模型

     

    多线程服务器模型核心就是利用多线程机制,为每个客户端分配一个线程。如图2-6-1-2,服务器初始化一个Serversocket实例,绑定某个端口号,并使之监听客户端的访问。两个客户端几乎同时过来请求,服务器在接收到客户端请求后,创建两条线程进行处理,直到响应完成。在这过程中,服务器只是简单的负责接收消息,然后交给处理者线程来处理,服务器能在短时间内接收多个客户端的请求。

    这种模型也是阻塞式的,因为每个线程向客户端写入消息并不是马上返回的,图2-6-1-2中黑块这段时间片就是阻塞时间。但这种模式比单线程处理性能明显高了,不用等到第一个请求处理完才处理第二个。对于多线程,如果线程数大于CPU数量,那么操作系统将会在多个线程之间调度,从而使其他线程能使用CPUÿ

    更多相关内容
  • 分布式系统(2)系统模型

    千次阅读 2019-01-23 08:57:25
    一、系统模型引言 这篇文章描述系统模型。我们知道在上一篇博客当中主要介绍了分布式系统的概念、前景和挑战。这篇文章主要介绍系统模型。什么是系统模型呢?系统模型也就是分布式系统是如何设计的、整体的架构是...

    一、系统模型引言

    这篇文章描述系统模型。我们知道在上一篇博客当中主要介绍了分布式系统的概念、前景和挑战。这篇文章主要介绍系统模型。什么是系统模型呢?系统模型也就是分布式系统是如何设计的、整体的架构是什么?在这里从三个方面来介绍,物理模型、体系结构模型、基础模型。下面先看一下这三个模型的介绍以便在下面详细介绍时有更加深刻的认识。

    1. 物理模型:考虑分布式系统中计算机是如何互联的,以及这些设备的类型,不考虑特定的技术细节(也就是从硬件方面来看如何组成分布式系统的)
    2. 体系结构模型:他是从系统的计算元素执行的计算和通信任务来描述分布式系统的。这里的计算元素指的是网络上互联的计算机集合。C-S模型和对等模型是最常见的体系结构模型。
    3. 基础模型:采用了抽象的观点描述了分布式系统中单个问题的解决方案,他通过三个模型来讨论
    • 交互模型:处理分布式系统中的性能问题和设置时间约束的困难(在系统元素之间通信的结构与顺序)
    • 故障模型:他定义了可靠地通信和正确的进程(考虑分布式系统正确操作的方式)
    • 安全模型:讨论对进程和通信通道的各种可能的危险(考虑不被干扰或者是不被窃取数据)

    二、物理模型

    1、基线物理模型

    在上一篇博客当中我们介绍了分布式系统的概念,被定义为位于联网计算机上的硬件或者是软件组织通过消息传递进行通信和协调的系统。这引出了分布式系统中的最小的物理模型,也就是可以扩展的计算机节点,这些节点通过网络进行消息传递。

    2、三代分布式系统

    由基线物理模型,引出下面三代分布式系统。

    1. 早期的分布式系统:这样的系统在70年代中期到80年代早期,随着局域网的出现而出现,这时候一般由10到100各节点组成,他们与互联网链接有限只支持少量的服务,比如本地打印机还有电子邮件等等。此时的系统是同构的,开放性不是主要的问题。
    2. 互联网规模的分布式系统:实在90年代早期开始出现,此时底层的物理础设施是如下图所示的。这些节点是可扩展的,通过互联网连接。在这样的系统中,其异构性其异构性是非常突出的, 这使得开放标准和中间件技术的不断增加。在这样的全球化系统中采用了额外的服务来提供端到端的服务质量特性。
    3. 当代的分布式系统:在上面的系统中通常是台式机,因此是相对静态的、分立的(没有嵌入到其他物理实体内)、自治的。第一、但是当前笔记本电脑和智能手机这样的节点可以从一个位置移动到另外一个位置,第二、并且无处不在计算的出现导致了体系结构从分立节点型开始转变,开始转变到计算机被切入到日常物品和周围环境当中(比如智能家居)。第三、云计算的出现导致了之前是一个自治节点完成一个任务,现在是一柱节点完成一个任务。这些原因最终导致了异构性得到很大增加的物理体系结构。

    系统的系统:超大规模的分布式系统,其子系统也是一个系统,他们一起完成一个或者是多个任务。举一个例子考虑一个洪水预测的环境管理系统,传感器收集洪水状态的系统与预测洪水可能性的系统耦合在一起为民众提供早期的洪水报警。

    最后对这三代系统做出一个总结:

    三、体系结构模型

    一个系统的体系结构是这样一种结构,用独立的组件以及这些组件之间的关系来表示的结构。整体的目标是满足现在和将来可能的需求。主要关系的是系统的可靠性、可管理性、适应性和性价比。比如说设计一个建筑物,不仅要决定它的外观,还决定其总体结构和体系结构风格(哥特式、现代是),并设计一个参考框架。

    1、体系结构元素

    为了理解一个分布式系统的基础构建块,现在考虑下面四个问题:

    • 分布式系统中通信的实体是什么
    • 分布式系统如何通信?使用什么通讯范型?
    • 这些实体在整个系统中扮演什么角色?承担什么责任?
    • 他们被放置到哪里?

    下面来一个一个看这些问题:

    第一:通信实体

    通常情况下,通信的实体被认为是进程,这导致普遍的认为分布式系统其实就是,带有恰当进程间通信范型的多个进程。但是在一些情况下不是这样的,比如说在传感器网络当中,操作系统中可能不支持进程抽象,这时候系统通信的实体是节点。还有一些系统中,使用线程而不是进程,所以严格的来讲,通信的末端是线程。我们已经抽象出了进程和线程的概念,然而从编程的观点来看,这还不够,更多问题的抽象已经被提出:

    • 对象:在分布式面向对象的方法中,一个计算由若干相互交互的对象组成,并通过结构访问这些对象。
    • 组件:组件类似于对象,也是通过结构访问,关键的区别在于组件不仅给出接口,而且给出其他组件/接口的假设。他为系统提供了一个更加完成的合约。类似于Android中的组件,当然这里只是类比其实完全不一样,在这里姑且这样理解。我们通过接口使用Android中的组件,并且可以通过这些组件开发其他组件(自定义View的实现)。
    • web服务:web服务与对象和组件紧密相关,也是采用基于行为封装和通过接口访问的方法。W3C联盟把web服务定义成如下的概念:

    第二:通信范型

    在上面已经看到分布式系统中通信的实体很多,有进程、线程、对象、组件等等。在这里开始讨论这些实体如何进行通信。

    我们考虑三种通信范型:

    1. 进程间通信
    2. 远程调用
    3. 间接通信

    (1)进程间通信

    进程间通信指的是用于分布式系统之间通信的相对底层的支持,包括消息传递原语、直接访问由互联网协议提供的API和对多播的支持.以后再详细介绍。

    (2)远程调用

           远程调用时分布式系统中最常见的通信范型,覆盖一系列分布式系统中通信实体之间基于双向交换的技术。请求应答协议是一个有效地模式,他加在一个底层消息传递服务之上,用于支持客户-服务器计算。比如请求一个网页,第一个消息包含在服务器端执行操作的编码,第二个消息包含操作的结果。这种范型相对原始。

          远程过程调用(RPC)的出现是一个突破,在RPC中,远程计算机上的进程能够被调用,好像在本地调用一样。就好像在QQ里面的远程控制一样,我们可以控制别人的电脑,此时我们的电脑(服务器)通过一个服务接口提供一套操作,当这些操作在本地可用时候,我们可以直接调用这些操作(在别人电脑上操作)。因此RPC系统提供访问和位置透明性。

          远程方法调用(RMI)类似于远程过程调用,用这种方法,一个对象可以调用远程对象中的方法。与RPC一样,底层的细节都对用户隐藏。我对此的理解就好比WebService。

          上面这些方法都有一个共同点:通信代表了发送者和接受者之间的双向关系,在大多数情况之下,双方必须同时存在。相比之下,开始出现一些新的技术,这些技术支持间接通信。他们通过第三个实体之间进行通信,实现了发送者与接受者之间的解耦合。

    (3)间接通信

    为什么要使用间接通信呢?先看一下下面这两个问题:

    • 发送者不需要知道他们发给谁
    • 发送者和接受者不需要同时存在

    这时候发送者和接受者如何进行通信呢?就是刚刚提到的使用第三个实体进行通信。下面是一些实现的技术。

    1. 组通信:组通信指的是消息传递给若干接受者,是一对多的通信。一个组在系统中用一个组标识符来表示,接受者通过加入这个组,有选择性的接收到组内的消息。此时发送者只需要通过组标识符发送消息,而不需要知道消息的接受者。
    2. 发布-订阅系统:类似于报纸系统,报社发报纸,用户订报纸。ROS的发布-订阅系统和这个原理是一样的。
    3. 消息队列:消息队列提供了一种点到点的服务,其中生产者进程发送消息到一个指定的队列,消费者从队列中接收消息,因此,队列是生产者和消费者进程之间的中介。
    4. 元组空间:进程能把任意的结构化数据项(元祖)放到一个持久的元祖空间,其他进程可以指定感兴趣的模式,从而可以在元组空间读或者是删除元组。因为元组空间是持久的,因此不需读写操作同时存在。这也被称之为生成通信。
    5. 分布式共享内存(DSM):它提供了一种抽象,用于支持在不共享物理内存的进程之间共享数据,程序员在使用这些数据时候,就好像这些数据在本地一样。

    现在总结一下到目前为止说的体系结构:

    第三:承担的角色与责任

    在这里我们考察两种起源于单个进程角色的体系结构风格:客户-服务器风格和对等风格。

    (1)客户-服务器风格

    这是分布式系统中最常用的体系结构,下面给出一个简单的结构,其中进程扮演服务器和客户的角色。

    如图所示,一台服务器也可以是其他服务器的客户。比如web服务器和大多数其他互联网服务是DNS服务的客户,DNS服务用于将互联网域名翻译成网络地址。

    (2)对等体系结构

    在这种体系结构中,设计意向任务或者是活动的所有进程都扮演这相同的角色,作为对等关系进行交互,没有客户与服务器的关系。使用这种体系结构是因为客户-服务器模型虽然为数据和其他资源提供了一个直接和相对简单的方法,但是他的伸缩性比较差,比如我们把一个服务放在同一个地址,此时意味着集中化的管理这个服务,当我们集中的去使用这个服务时候,就会出现问题。因为我们的电脑提供服务的能力和这个计算机所在的网络连接的带宽是有限的。他的伸缩性会受限。

    针对这个问题,就促使了对等系统的发展,这是因为在对等系统中,一个用户使用一个服务时,自己的计算机所拥有的网络和计算资源也能被投入使用,以支持哪个服务。这会产生一个非常好的效果,当我们的用户数量增加时候,此时可用于运行的服务也会随之增加。

    第四:实体被放置在哪?

    这是最后一个要考虑的问题,也就是对象、组件、进程这样的实体是怎么映射到底层的物理设施之上的。物理分布式基础设施由大量的机器组成,这些机器通过一个任意复杂的网络互联。放置是一个很重要的操作,因为它会影响分布式系统的性能、安全等特性。我们主要关注下面的这些放置策略:

    • 将服务映射到多个服务器
    • 缓存
    • 移动代码
    • 移动代理

    (1)将服务映射到多个服务器

    意思是服务器将服务所基于的对象集分区,然后将这些分区分布到各个服务器上,或者是服务器可以在几个主机上维护复制的对象集。这两种选择可以用下面例子说明

    web是一个常见的将数据分区的例子。一个基于复制数据的服务是Sun网络信息服务。

    (2)缓存

    它类似于我们手机中的缓存,缓存用于存储最近使用的数据对象,当服务器接受一个新对象时候,就将他存入缓存,必要的时候会替换掉那些对象。比如我们的浏览器,当我们访问一个界面时候,浏览器会在本地的文件系统中寻找是否含有我们访问的那个界面,如果有就直接拿出来使用。web代理服务器为一个或者是多个地点的客户机提供共享的存放web资源的缓存。代理服务器的目的是通过减少广域网和web服务器的负载,提供服务的可用性和性能。

    (3)移动代码

    applet是一个广泛使用的移动代码的例子,也就是运行浏览器的用户选择了一个到applet的链接,applet的代码存储在web服务器上将applet的代码下载到浏览器并在浏览器端运行。

    (4)移动代理

    移动代理可以通过安装和维护一个组织内部的计算机软件,或者是通过访问每个销售商的站点并执行一些列数据库操作,来比较多个销售商的产品价格。和移动代码一样,移动代理对所访问的计算机上的资源而言是一个潜在的安全威胁,另外移动代理自身是脆弱的,如果他们访问所需要信息的要求被拒绝时候,那么他们可能完成不了任务。

    2、体系结构模式

    在上述的体系结构元素中都是单个的,而这里的体系结构模式是组合重复出现的结构。在本节中给出几个关键的体系结构模型,包括分层体系结构、层次化体系结构、瘦客户。

    (1)分层

    在分层方法中,一个系统被分成若干层,每一层利用下一层提供的服务。因此,一个给定的层提供了一个软件抽象,更高层次的层不清楚其下面的层的实现细节。他只使用下层提供的服务。

    举一个例子,在互联网上基于网络时间协议可以实现一个网络时间服务,意思是服务器在互联网的主机上,给请求的用户提供当前的时间。下面是其分层的体系结构。

    在这里提到了两个概念:平台和中间件,下面看看其概念

    平台:

    中间件

    中间件表示成计算机上的集成或者是对象,这些进程或者是对象相互交互,实现分布式系统应用的通信和资源共享支持。特别的,他提供多个协作的计算机上的分布,放置和检索、共享数据对象的复制以及多媒体数据的实时传送,提升应用程序通信活动的层次。其实就是把一些底层抽象,来提供两个计算机的通信。

    (2)层次化体系结构

    分层将服务垂直组织成抽象层,而层次化是一项组织给顶层功能的技术。他把这个功能放在合适的服务器上,或者作为第二选择放在物理节点上。我们先看二层和三层体系的结构概念:

    • 表示逻辑:设计用户交互和修改呈献给用户的应用试图。
    • 应用逻辑:涉及与应用相关的详细的应用特定处理。
    • 数据逻辑:涉及应用的持久性存储,通常放在一个数据库管理系统中。

    下图分别给出了两层和三层体系结构给出的解决方案:

    二层和三层的对比
     二层三层
    优点

    1、具有交互的低延迟

    2、仅有调节信息的消息交换

    1、提高软件的可维护性
    缺点1、将应用逻辑分离到不同的进程,带来的后果是一部分应用逻辑不能被另一部分直接调用

    1、增加了管理三个服务器的复杂性

    2、增加了与每个操作相关的网络流量和延迟

    下面举一个例子来说明分层体系结构的好处:

    以维基百科为例,它采用了多层体系结构(大于三层)来处理大量的web请求(每秒高达60000页)。我们知道浏览器发送了一个请求web网页的http请求,用户不能与该页面进行交互,一直到新的HTML内容被浏览器收到并呈现,这个时间间隔是不固定的,因为他受限于网络以及服务器延迟。此时便有了ajax。ajax能够有效地处理这种问题,他能局部的更新整个页面,就像我们浏览器中的时钟一样,我们的时间在一秒一秒的更新(更新时间需要请求服务器),此时我们的浏览器依然可以做其他事情。

    专业一点的术语是:AJAX提供一套通信机制,使运行在一个浏览器中的前端组件能够发送请求,并从运行在服务器上后端的组件接受结果。

    比如我们的地图,当地图被移动时候,浏览器中的Javascript代码重定位可见的图片,需要填充可见区域的额外的图片,可以通过AJAX调用Google服务器去获得。图片一旦收到就会被展示,但浏览器在等待的时候可以继续应答用户的交互。

    (3)瘦客户

    术语瘦客户指的是一个软件层,在执行一个应用程序或者访问远程计算机上的服务时候,由该软件层提供一个基于窗口的本地用户界面。他减少了用户的硬件要求,各种复杂的服务,通过云来解决。它的缺点是,因为各种复杂的服务都是通过云来解决,此时会有网络延时。

    比如,QQ的远程桌面控制。

    (4)其他经常出现的模式

    1. 代理:支持远程过程调用或者是远程方法调用的位置透明性
    2. web服务中的业务代理:在一个可能很复杂的分布式基础设施中支持互操作性的体系结构模式。
    3. 反射

    3、相关的中间件解决方案

    先看中间件的分类

    四:基础模型

    在上述完全不同的系统模型中,都有一个共同点,也就是所有的进程都由若干进程组成,这些进程通过在计算机网络上发送消息而相互通信,但是所有的模型都没有达到下列需求:实现进城以及网络的性能和可靠性特征,确保系统中资源的安全性。

    因此,我们希望在我们的基本模型中提取的分布式系统情况能解决下列问题

    • 交互:计算在进程中发生,进程通过传递消息交互,并引发进程之间的通信和协调。交互模型必须反映通信带来的延迟,这些延迟的持续时间会比较长。并且,交互模型必须反映独立进程相互配合的准确性受限于这些延迟,受限于在分布式系统中很难跨所有计算机维护同一时间概念。
    • 故障:只要分布式系统出现故障,我们的模型将对这些故障进行定义和分类。
    • 安全:分布式系统暴露在外部代理和内部代理的攻击之下。我们的安全模型对这些攻击进行定义和分类。

    1、交互模型

    首先看影响进程交互的两个条件:

    • 通信性能经常是一个限制特性
    • 不可能维护一个全局时间概念

    2、故障模型

    3、安全模型

    展开全文
  • 我们知道,在开发一个应用的过程中,需要涉及代码、操作系统、网络和数据库等个方面。所以,只是了解代码安全肯定是不够的,我们还需要了解常见的基础环境和工具中的安全机制,学会通过正确地配置这些安全机制,来...

    在这里插入图片描述

    从这一讲开始,我们讨论 Linux 系统和应用安全。我们知道,在开发一个应用的过程中,需要涉及代码、操作系统、网络和数据库等多个方面。所以,只是了解代码安全肯定是不够的,我们还需要了解常见的基础环境和工具中的安全机制,学会通过正确地配置这些安全机制,来提升安全保障。

    谈到 Linux,我相信你每天都在使用 Linux 进行各种开发和运维操作。但是,大多数情况下,公司不会给每一个员工分配专有的 Linux 服务器,而是多个开发和运维共用一台 Linux 服务器。那么,其他员工在使用 Linux 服务器的时候,会不会对我们自己的数据和进程产生影响呢?另外,我在 Web 安全中讲过,黑客可以通过很多漏洞控制 Linux 服务器,那我们又该如何避免和控制黑客的破坏呢?

    如何理解 Linux 中的安全模型?

    要解决这些安全问题,我们首先要了解一个安全模型,Linux 的安全模型。

    我们先来看一下 Linux 的构成,Linux 可以分为内核层和用户层。用户层通过内核层提供的操作接口来执行各类任务。

    内核层提供的权限划分、进程隔离和内存保护的安全功能,是用户层的安全基础。一旦内核安全被突破(比如黑客能够修改内核逻辑),黑客就可以任意地变更权限、操作进程和获取内存了。这个时候,任何用户层的安全措施都是没有意义的。

    既然 Linux 的内核安全这么重要,那我们是不是要在防护上付出大量的精力呢?事实上,正如我们不需要在开发应用时(尤其是使用 Java 这类相对高层的语言时),过多地关心操作系统相关的内容一样,我们在考虑 Linux 安全时,也不需要过多地考虑内核的安全,更多的是要考虑用户层的安全。所以,对于 Linux 内核层的安全,我们只需要按照插件漏洞的防护方法,确保使用官方的镜像并保持更新就足够了。

    既然,使用最多的是用户层,那我们就来看一下,用户层的操作都有什么。

    在 Linux 中,用户层的所有操作,都可以抽象为“主体 -> 请求 -> 客体”这么一个流程。比如,“打开 /etc/passwd”这一操作的主体是实际的用户,请求是读,客体是 /etc/passwd 这个文件。
    在这里插入图片描述

    在这个过程中,Linux 内核安全提供了基于权限的访问控制,确保数据不被其他操作获取。Linux 用户层则需要确保权限的正确配置,这就是我开篇提到的,如何保证多人安全地共用服务器的关键,也是我们这节课需要关注的重点内容。

    黄金法则是如何在 Linux 系统中应用的?

    现在我们知道了,Linux 系统安全防护的核心是正确配置用户层权限。那接下来,我们就从黄金法则的认证、授权和审计这三个方面来看一下,Linux 系统是如何进行权限配置的,这其中,又有哪些值得我们重点关注的安全选项。

    1.Linux 中的认证机制

    Linux 系统是一个支持多用户的操作系统,它通过普通的文本文件来保存和管理用户信息。这其中,有两个比较关键的文件:/etc/passwd和/etc/shadow。

    我们知道,在 Linux 中,/etc/passwd是全局可读的,不具备保密性。因此,/etc/passwd不会直接存储密码,而是用 x 来进行占位。那实际的用户密码信息,就会存储到仅 ROOT 可读的/etc/shadow中。

    在/etc/shadow中,除了加密后的密码,也保存了诸如密码有效天数、失效多少天告警之类的密码管理策略。我们可以通过 Chage 命令来对密码管理策略进行修改,比如,通过下面的 Chage 命令,就可以强制 Test 用户在 60 天内必须对密码进行修改。通过这样的方式,就可以降低密码泄露的可能性了。

    chage -M 60 test
    

    因为认证这个功能是由 Linux 内核来提供的,所以在用户层,我们需要关心的安全问题,就是弱密码导致的身份信息泄露。为了解决这个问题,在/etc/shadow中,我们可以制定适当的密码策略。除此之外,我们也可以通过John the Ripper,使用已知的弱密码库,来对 Linux 中的弱密码进行检测。下面的命令,就是使用 John the Ripper 检测弱密码。

    unshadow /etc/passwd /etc/shadow > mypasswd
    john mypasswd
    john --show mypassw
    

    2.Linux 中的授权机制

    在“黄金法则”中,认证只是第一步,它提供了一个可信的身份标识。有了这个身份标识之后,就需要通过授权来限制用户能够发起的请求了。

    在 Linux 中,客体只有文件和目录两种,针对这两种类型的客体,Linux 都定义了读、写和执行这三种权限。你可以通过我总结的这张对比表格看到,文件和目录在这三种权限上的区别。
    在这里插入图片描述

    除此之外,Linux 还提供了一些额外的权限标签,来进行更细粒度的权限控制。

    比如,Linux 提供了文件属性的概念,来对文件设置更多的保护。通过chattr +i /etc/passwd可以防止文件被任何用户修改。想要了解更多的文件属性,你可以参考Wikipedia。

    Linux 还提供了“粘滞位”的功能,主要用来防止用户随意操作其他用户的文件。比如chmod +t /tmp可以阻止删除 /tmp 目录下其他用户的文件。

    这些都是 Linux 在授权中的自我保护机制,那我们能在这个过程中进行怎样的防护呢?

    前面,我们一直在强调,Linux 系统面临的安全威胁其实就是权限问题。也就是说,要么就是敏感文件的权限配置不当,导致这些文件可以被额外的用户访问或执行;要么就是应用存在漏洞或密码泄露,导致低权限用户可以获得更高的权限。

    要解决权限问题,我们就要实践最小权限原则。

    我们先来看一个 Linux 系统安全中最普遍的问题:滥用 ROOT。很多人在登录 Linux 系统后,第一个命令就是通过 su 来获取 ROOT 的 Shell 环境,这样我们就不需要在每次操作的时候,通过 sudo 来临时提升至 ROOT 权限。

    但是,这里你需要注意一点,在 ROOT 的 Shell 环境中启动的所有进程也都具备 ROOT 权限。如果启动的是一个立即返回的进程,如 CAT,不会有太多问题,但如果是一个长期运行的进程,就很容易产生权限的滥用。

    比如,当你以 ROOT 的身份启动 Redis 或者 MySQL 等存储工具时,如果这时有其他用户连入 Redis 或者 MySQL,那他们也能间接地获取 ROOT 的权限。在大部分服务器入侵的场景中,黑客都是通过这些具备 ROOT 权限的进程漏洞,来实现权限提升的。

    因此,在运行任何长驻进程时,我们都需要谨记“最小权限”原则。也就是说,我们可以根据要执行的操作等级,配置“最小权限”来启动常驻进程。比如,如果只是在 Redis 和 MySQL 这样的数据库中进行文件读写操作,根本不需要 ROOT 这种最高等级的权限。

    因此,“最小权限”原则在 Linux 系统中的应用是非常重要的。那你可能会问了,Linux 系统中的操作那么多,每个操作都需要自己进行权限配置吗?当然不是,我们常常会使用一些已知的工具,来实现“最小权限”启动长驻进程的功能,而你需要做的,就是正确地启动或者配置这些工具。

    比如说,我们可以通过 mysqld 启动 MySQL 服务,mysqld 会将 MySQL 的进程分配到“mysql”这个用户,并在 ROOT 下建立守护进程。具体的效果如下:

    root 2973530.00.01154321360 ? S Aug12 0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/var/lib/mysql --pid-file=/var/lib/mysql/mysql.pid
    mysql 29755331.34.3112827565729572 ? Sl Aug12 22593:40 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/var/lib/mysql --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/lib/mysql/mysql.pid --socket=/var/lib/mysql/mysql.sock
    

    类似地,当启动 Nginx 时,Nginx 会将 Worker 节点以 nobody 的用户身份来执行。具体的效果如下:

    root 7083 0.0 0.0 61032 5324 ? Ss Aug12 0:01 nginx: master process nginx
    nobody 331122 0.0 0.0 90768 31776 ? S 11:44 0:00 nginx: worker process
    nobody 331123 0.0 0.0 90768 32720 ? S 11:44 0:00 nginx: worker process
    nobody 331124 0.0 0.0 90768 31776 ? S 11:44 0:00 nginx: worker process
    

    当然,也有一些工具不提供这类最小权限切换的功能,比如,在直接执行redis-server启动 Redis 的时候,就需要我们自己来对用户身份进行切换。那用户身份切换怎么做呢?

    我们首先来看 Nginx 的例子,在启动 Nginx 的时候,Linux 提供了 nobody 这么一个用户的身份。实际上,任何人进入 Linux 系统首先获得的用户身份就是 nobody,然后再从 nobody 进行登录,切换到其他正常用户身份上。

    因此,nobody 通常拥有整个操作系统中最小的权限。所以,对于不提供最小权限切换功能的工具,我们就可以使用 nobody 的用户身份,来进行主动切换了。

    在执行redis-server启动 Redis 的时候,我们就可以通过以下命令,以 nobody 的身份执行redis-server了(前提是,我们需要对日志和 PID 等目录进行适当配置,确保能够以 nobody 身份写入):

    su -s /bin/redis-server nobody
    这样一来,我们就能通过“最小权限”原则,提升 Linux 系统授权的安全性了。

    3.Linux 中的审计机制

    我们在前面的课程中说过,“黄金法则”中的审计主要就是日志记录和分析。那么,Linux 系统中的日志都有哪些呢?在 Linux 系统中,系统的日志信息通常存储在 /var/log 目录下,部分应用程序也会把相关日志记录到这个目录中。系统日志主要分为 3 类,用户登录日志、特殊事件日志和进程日志。

    用户登录日志主要是/var/log/wtmp和/var/run/utmp,用来保存用户登录相关的信息。用户登录日志本身为二进制文件,我们无法直接通过文本方式查看,但是可以配合who/users/ac/last/lastlog这样的命令来获取。

    特殊事件日志主要包括/var/log/secure和/var/log/message。其中,/var/log/secure主要记录认证和授权相关的记录,如果有人试图爆破 SSH,我们就可以从这个日志中观察出来。/var/log/message由 syslogd 来维护,syslogd 这个守护进程提供了一个记录特殊事件和消息的标准机制,其他应用可以通过这个守护进程来报告特殊的事件。

    进程日志:当通过 accton 来进行系统进程管理时,会生成记录用户执行命令的 pacct 文件。

    默认情况下,Linux 会通过 logrotate 对日志执行相应的保留策略(比如日志切割和旧日志删除等)。通过配置/etc/logrotate.conf可以对不同日志的保留策略进行修改。

    那如何对日志进行监控呢?这里,我向你推荐 2 种常见的日志分析工具 ELK 和 Zabbix,你可以利用这些工具来监控 Linux 的安全日志。也就是说,我们可以通过在这些分析平台配置恰当的规则(如 SSH 登录尝试失败 3 次以上),来及时发现黑客的部分入侵尝试,迅速产生报警。然后,我们就可以针对具体的问题,进行人工复查了。

    总结

    好了,今天的内容讲完了。我们来一起总结回顾一下,你需要掌握的重点内容。

    Linux 系统安全可以说是“最小权限”原则的最佳实践平台,尤其是当存在多用户共同维护和使用一台服务器的时候,正确的配置权限将是一件很有挑战的工作。为此,我们必须严格限制 ROOT 权限的使用。同时,为了避免进程漏洞,适当地通过 iptables 进行访问限制,也能够起到不错的保护效果。

    在 Linux 系统的自我保护基础之上,也有一些安全工具能够为系统提供额外的保护功能(如杀毒软件、HIDS 等),在后续的内容中,我们会深入讲解这些工具。

    最后,我把这一讲的重点内容梳理了一个脑图。你可以用它来查漏补缺,也可以自己来梳理看看,加深印象。

    在这里插入图片描述

    思考题

    最后给你留一个思考题。

    检查一下你的 Linux 服务器,看一下哪些用户具备 ROOT 权限?那些进程具备 ROOT 权限?这些用户和进程,真的需要 ROOT 权限吗?我们是否可以利用今天学到的知识,对这些 ROOT 权限进行限制呢?

    欢迎留言和我分享你的思考和疑惑,也欢迎你把文章分享给你的朋友。我们下一讲再见!

    下一讲

    网络安全:和别人共用Wi-Fi时,你的信息会被窃取吗?

    展开全文
  • 【操作系统】进程/线程模型

    万次阅读 2020-02-04 19:53:22
    在早期没有道程序设计之前,操作系统只有一个物理程序计数器,这样个程序只能串行执行,在引入道程序之后,一个物理程序计数器可以被拆分成个逻辑程序计数器,每个程序都有其独有的程序计数器,从而实现程序...

    1. 进程的基本概念

    1.1 多道程序设计(Multi-Programming)

    首先从多道程序设计开始,以便更好的理解进程的必要性。
    在早期没有多道程序设计之前,操作系统只有一个物理程序计数器,这样多个程序只能串行执行,在引入多道程序之后,一个物理程序计数器可以被拆分成多个逻辑程序计数器每个程序都有其独有的程序计数器,从而实现程序的并发执行。
    所谓的多道程序设计,是指允许多个程序同时进入内存并运行,目的在于提高系统效率。

    1.2 并发环境与并发程序

    并发环境:一段时间间隔内,单处理器上有两个或两个以上的程序同时处于开始运行但尚未结束的状态,并且运行次序不是事先确定的。
    并发程序:在并发环境中执行的程序。

    在并发环境下,每个程序的运行状态应该怎样去刻画呢?这个时候进程就应运而生了。

    1.3 进程的定义

    Process:进程是具有独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和CPU调度的独立单位。进程又称任务(Task or Job)。

    进程可以理解为程序的一次执行过程,操作系统为每个进程分配了一独立的地址空间。
    操作系统为了统一管理所有进程,需要一个专门的数据结构——进程控制块。

    1.4 进程控制块PCB(Process Control Block)

    又称为进程描述符、进程属性,是操作系统用于管理进程的专门的数据结构。PCB记录了进程的各种属性。是系统感知进程存在的唯一标识,和进程是一一对应的关系。
    进程表:操作系统中所有进程的PCB集合。
    PCB应该包含哪些内容呢?如下表:
    表1-1 PCB模块及内容

    模块内容
    进程描述信息进程唯一标识符(Process ID);进程名,用户标识符(User ID)等
    进程控制信息当前进程状态,优先级,代码执行入口地址,进程间同步和通信,进程的队列指针
    所拥有的资源信息和使用情况虚拟地址空间状况,打开的文件列表
    CPU现场信息寄存器值(通用寄存器,程序计数器PC、程序状态字PSW、栈指针);指向该进程页表的指针

    1.5 例子:SOLARIS的进程控制块和进程表简介

    在这里插入图片描述

    2. 进程的状态及状态转换

    2.1 进程的三种基本状态及状态转换

    2.1.1进程是三种基本状态

    表2-1进程的三种基本状态

    进程状态特点
    运行态(Running)占有CPU并在CPU上运行
    就绪态(Ready)已经具备运行条件,但是由于没有空闲的CPU而暂时不能运行
    等待态(Waiting/Blocked)也叫阻塞态、封锁态、睡眠态;是指程序因为等待某一事件(如等待磁盘I/O读取结果)而不能运行
    2.1.2 进程的三状态模型及状态转换

    在这里插入图片描述

    2.2 进程的其他状态及复杂的状态模型

    2.2.1 进程的其他状态
    进程状态特点
    创建(new)已完成创建一个进程所必要的工作但由于资源有限操作系统尚未同意执行该进程
    终止(terminated)进程终止执行后的状态,此时可完成一些统计工作和资源回收工作
    挂起(suspend)用于负载调节,该状态下的进程不占用内存空间,把进程相关内容保存到本地磁盘上,激活时需要从磁盘中读取

    在引入进程这三种状态之后,进程的状态模型可能会变得复杂。

    2.2.2 五状态进程模型

    在这里插入图片描述

    2.2.3 七状态进程模型

    在这里插入图片描述

    2.3 Linux的状态模型

    在这里插入图片描述

    2.4 进程队列

    2.4.1 概念

    进程的状态是如何进行控制的呢?事实上操作系统为每一类状态的进程建立了一个或多个队列,队列元素为PCB,进程状态的改变本质上就是进程对应的PCB从一个队列进入到另一个队列

    多个等待队列表示每个队列等待的事件不同,同一个等待队列中所有的PCB等待的是相同的事件。

    2.4.2 五状态进程模型的队列模型

    在这里插入图片描述

    3 进程控制

    进程控制操作完成进程各状态之间的转换,由具有特定功能的原语完成。如进程创建原语、阻塞原语、唤醒原语等。

    原语(primitive):完成某种特定功能的一段程序,具有不可分割性和不可中断性,是原子操作。

    3.1 进程的创建

    • 给新进程分配一个唯一标识和进程控制块PCB
    • 分配地址空间
    • 初始化进程控制块,设置默认值
    • 设置相应的队列指针,如把新进程加到就绪队列中
      在UNIX系统中通过fork/exec组合指令完成

    3.2 进程的撤销

    • 回收进程所占有的资源,如关闭打开的文件、断开网络连接等
    • 撤销该进程的PCB
      在UNIX系统中通过exit指令完成

    3.3 进程的阻塞

    处于运行状态的进程,在其运行过程等待某一事件发生,如等待键盘录入、等待磁盘I/O等,由进程自己执行阻塞原语从而进入阻塞态。
    在UNIX系统中通过wait指令完成

    3.4 UNIX系统中的几个进程控制操作

    3.4.1 概述
    • fork():通过复制调用进程来建立新的进程,是最基本的进程创建过程
    • exec():包括一系列系统调用,它们都是通过用一段新的程序代码覆盖原来的地址空间,实现进程执行代码的转换
    • wait():初级进程同步操作,使得一个进程能够等待另外一个进程的结束
    • exit():用来终止一个进程的运行
    3.4.2 UNIX的fork()实现
    • 为子进程分配一个空间的进程描述符PCB proc结构
    • 分配给子进程唯一标识pid
    • 以一次一页的方式复制父进程地址空间(此乃UNIX系统fork较慢的主要原因)
    • 从父进程处继承共享资源,如打开的文件和当前工作目录等
    • 将子进程的状态设置为就绪,插入到就绪队列
    • 向子进程返回标识符0
    • 向父进程返回子进程的pid
      注意:UNIX下的fork()把父进程的所有地址空间都拷贝给了子进程,但实际上子进程根本用不到这些内容,所以在Linux下利用写时复制Copy-On-Write(COW)技术加快了创建进程。

    4 进程相关概念

    4.1 进程地址空间

    我们知道**,操作系统给每个进程都分配了一个独有的地址空间**。但这个地址空间不是物理内存位置,而是相对的地址空间。

    4.2 进程映像(Image)

    是对进程执行活动全过程的静态描述,可以理解为进程快照。由进程地址空间内容、硬件寄存器内容及与该进程相关的内核数据结构、内核栈组成。

    • 用户相关:进程地址空间(包含代码段、数据段、堆和栈)
    • 寄存器相关:程序计数器、指令寄存器、程序状态字、栈指针
    • 内核相关:
      ①、静态部分:PCB及各种资源数据结构
      ②、动态部分:内核栈(不同进程拥有独立的内核栈)

    4.3 上下文(Context)切换

    将CPU硬件状态从一个进程切换到另一个进程的过程称为上下文切换。

    • 程序运行时,硬件状态保存在CPU上的寄存器中,寄存器包括:程序计数器、程序状态字寄存器、栈指针、通用寄存器以及其它控制寄存器的值
    • 程序运行时,这些寄存器的值保存在进程控制块PCB中,当操作系统要运行一个新的进程时,将PCB中相关的值送到对应的寄存器中。

    5 线程的引入

    我们知道,进程已经可以实现并发程序运行,那么为什么还要再派生线程呢?

    表5-1 线程的必要性

    必要性说明
    应用的需要如Web服务器,从客户端接收网页请求,从磁盘检索相关网页并读入内存,然后将网页返回给客户端,当然,为了提高效率,Web服务器都有网页缓存(Web page cache)。如果没有线程,只能有一个服务进程(不可以有多个服务进程,因为每个进程都有自己的内存地址,这样就不能共享信息),这个时候只能是顺序编程,服务进程在搜索网页的时候就不能接受新的客户端请求,性能较差
    开销的考虑线程的开销比进程小很多,创建、撤销线程花费时间较短;两个线程切换花费的时间少;线程之间的通信无需调用内核(同一进程内的线程共享内存和文件
    性能的考虑当有多个处理器的时候,一个进程内有多个线程就可以实现线程的分工合作(有的计算、有的处理I/O等),则能提高性能

    5.1 线程的基本概念

    先来回顾一下上面说的:进程的两个属性是:资源的拥有者和CPU调度单位。引入线程之后,CPU调度单位就不再是进程,转而变成了线程。但进程依然是资源的拥有者。

    线程是进程的一个运行实体,是CPU的调度单位,有时将线程称为轻量级进程。事实上线程的出现可以理解为是进程中增加了多个执行序列。

    5.2 线程的属性

    • 唯一标识符
    • 有状态的转换
    • 有上下文环境:程序计数器等寄存器
    • 有自己的栈和栈指针
    • 共享所在进程的地址空间和其他资源
    • 可以创建、撤销另一个线程,实际上程序开始时是以一个单线程进程方式进行的

    6 线程实现机制

    主要有三种:用户级线程(User Level Thread)、内核级线程(Kernel Level Thread)及混合型。
    表6-1 线程模型及典型应用

    线程模型特征典型应用优缺点
    用户级线程在用户空间创建线程库。由运行时系统完成线程的管理,内核管理的是进程,并不清楚线程的存在,线程的切换不需要内核态特权UNIX优点:线程切换快,可运行在任何操作系统上;缺点:内核只将CPU分配给进程,同一个进程中的两个线程不能同时运行在两个处理器上(即便有多个CPU),大多数系统调用是阻塞的,由于内核阻塞进程,故进程中的所有线程都会被阻塞。
    内核级线程内核管理所有线程,内核既管理进程也管理了线程,线程的切换需要内核支持,以线程为基础进行调度Windows
    混合模型线程的创建是在用户空间完成的,调度等是在内核空间完成的,多路复用Solaris

    小结

    在介绍了进程和线程之后,还要引入一个重要概念:
    可再入程序(可重入)
    被多个进程同时调用的程序,具有如下性质:

    • 是纯代码的,即在执行过程中自身不改变
    • 调用的它的进程应该提供数据区,改变只能在数据区改变。
    展开全文
  • 服务器模型

    千次阅读 2018-09-14 14:19:26
    服务器模型  硬件服务器:主机 集群  硬件厂商: IBM HP 联想 浪潮    软件服务器:编写的服务端应用程序,在硬件服务器上运行,一般依托于操作系统,给用户提供一套完整的服务  httpserver-->处理...
  • 系统架构之服务器架构图

    万次阅读 多人点赞 2019-10-09 14:46:46
    服务器架构图以物理视图呈现,物理视图用于描述系统软件到物理硬件的映射关系,反映出系统的组件是如何部署到一组可计算机器节点上,用于指导系统的部署实施过程。受众多为运维和实施人员。 其实服务器架构如何...
  • 导读高吞吐、高并发、低延迟和负载均衡(大量用户访问同一个互联网业务)分布式系统提高承载量的基本手段(分层模型、并发模型)硬件故障率资源利用率(集群系统的扩充和缩容)消息队列服务(两个进程间的通信摒弃...
  • 开放系统互连参考模型

    千次阅读 2020-12-25 14:21:14
    开放系统互连参考模型分七层,从低到高分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。 1、物理层 物理层的数据单位是比特,即一个二进制位。物理层位于OSI/RM参考模型的最底层,为数据链路层...
  • C/S模型(客户/服务器模型

    千次阅读 2020-07-17 23:46:14
    C/S模型即客户(client)/服务器(server)模型。 1.特点 服务器提供服务,客户请求服务。 2.客户端和服务器之间连接的数量对应关系 个客户进程可以同时访问一个服务进程,一个客户进程可以同时访问服务器进程...
  • 文章目录1.DNS系统2.域名 1.DNS系统 域名系统(Domain Name System, DNS)是因特网使用的命名系统,用来把便于人们记忆的具有特定含义的...DNS系统采用客户/服务器模型,其协议运行在UDP之上,使用53号端口。 从概念...
  • 服务器模型——C/S模型和P2P模型

    千次阅读 2017-09-03 21:26:08
    呦呦切克闹,煎饼果子来一套本篇学习两种服务器模型~~ TCP/IP协议在设计和实现上并没有客户端和服务器的概念,在通信过程中所有机器都是对等的。但由于资源都被数据提供者所垄断,所以几乎所有的网络应用程序都...
  • 一,OSI七层模型 1.物理层--物理介质(双绞线/光纤)/比特流 2.数据链路层--MAC地址/字节流(帧) 3.网络层--ARP(address resolution protocol)/IP/路由协议(动态,静态) 4.传输层--TCP/UDP/端口 5....
  • windows下并发I/O服务器模型对比 windows下有5种并发I/O服务器模型,罗列他们,并简述其优缺点。每一种更高级的模型,都是基于解决它的前一种模型的不足而诞生的。只有了解了他们之间的差别,才能理解他们的优缺点...
  • 系统管理的三维模型及实例分析

    千次阅读 2020-05-06 00:23:37
    业务、组织、技术三维模型1.1 系统方法1.2 系统管理的三维模型2. 校园IT项目可行性分析2.1 项目概述2.2 业务分析2.2.1 成本与收益2.2.2 影响成本与收益的要素2.2.3 软件开发与购置等的决策2.3 组织分析2.3.1 用户...
  • 模型1:线程模型 每来一个连接,服务器就会新建一个线程来处理该连接的读写事件。 特点: 1)采用阻塞式 I/O 模型读取数据; 2)每个连接都需要独立的线程完成数据读取,业务处理,数据返回的完整操作。 存在问题...
  • 利用远程云服务器跑深度学习模型

    千次阅读 2020-03-16 18:06:47
    利用远程云服务器跑深度学习模型主要有三个问题需要解决。 一是深度学习环境的搭建,二是已搭建环境的保存,三是远程数据的传输。 深度学习环境的搭建 以阿里云为例,在购买服务器创建实例时,可以在镜像市场选择...
  • 浏览器/服务器模型

    千次阅读 2016-11-21 21:48:49
    一、浏览器/服务器模型的概念 浏览器/服务器模型(B/S模型)是一种对C/S模型的变化和改进,在这种模型中,用户界面完全通过WWW浏览器实现,一部分事务逻辑在浏览器实现,大部分事务逻辑在服务器中实现,它是一种特殊...
  • 与传统的存储设备相比,云存储不仅仅是一个硬件,而是一个网络设备、存储设备、服务器、应用软件、公用访问接口、接入网、和客户端程序等个部分组成的复杂系统。各部分以存储设备为核心。通过应用软件来对外提供...
  • 工控系统概述

    千次阅读 2020-01-13 16:54:58
    工业控制系统安全-工控系统概述 简短介绍工控系统架构、组成部分、功能以及术语等方面,掌握基本工控系统知识。工控系统指的是工业自动化...普渡参考模型 普渡企业参考架构(Purdue Enterprise Reference Archi...
  • 一、数据库系统、数据库、数据库管理系统 DBS包括DB和DBMS。 1、DBS是Database System的缩写,数据库系统。 2、DB是database的缩写,数据库。 3、DBMS是Database Management System的缩写,数据库管理系统。 ...
  • 前言的前言 服务器模型涉及到线程模式和IO模式,搞清楚这些就能针对各种场景有的放矢。该系列分成三部分: ...从不同维度可以有不同的分类,这里从I/O的阻塞与非阻塞、I/O处理的单线程与线程角度探讨服务器模型
  • 服务器系统对比、数据库对比、后台开发语言对比
  • 本文提出一种分布式机器学习模型在线推理系统的完整技术方案,该系统主要采用CPU/GPU 计算节点来提供推理任务的基础算力,通过Docker容器技术封装、打包模型推理任务,将不同服务的运行环境完全隔离,并借助...
  • 5G系统——系统架构模型(1)

    万次阅读 多人点赞 2018-08-02 11:51:49
    图4.2.3-1是非漫游时的5G系统架构参考模型,采用的是基于业务接口(service-based)的表现形式,也叫SBA架构。图中的Nxxx就是基于业务的接口。另外还有一种基于参考点(reference point)的表示形式,如下图4.2.3-2所示...
  • 将tensorflow模型部署到服务器

    万次阅读 2019-08-17 19:09:09
    一、服务器环境选择 首先肯定要去租一个服务器,例如阿里云。一开始选了window server2012,结果很坑,装不了docker。上网想查解决方法,发现别人也遇到过这个问题。 了解的原因大概是:docker需要在linux的环境下...
  • 将情感倾向性分析模型部署至华为云服务器一、前言二、云服务器基本介绍三、购买云服务器1....未来已来,如今,很高校都开设了人工智能相关课程,本科生甚至高中生也可以自己开发一些机器学习模型,但
  • 软件或计算机系统的软件架构是该系统的一个(或个)结构,而结构由软件元素、元素的外部可见属性及它们之间的关系组成。 软件架构为软件系统提供了一个结构、行为和属性的高级抽象,由构成系统的元素的描述、...
  • 物联网系统的四种物理模型

    万次阅读 2018-05-18 22:47:10
    物联网的三层概念模型影响广泛,这对于理解物联网与互联网的不同之处很有帮助,不过具体到开发的时候,从物理视图看物联网的架构,更容易看到组成物联网系统的软件模块,硬件模块,更容易理解如何架构和开发物联网...
  • 现代操作系统第三版高清

    千次下载 热门讨论 2015-06-16 22:20:01
    1.4.3处理器的操作系统 34 1.4.4个人电脑操作系统 35 1.4.5掌上电脑操作系统 35 1.4.6 嵌入式操作系统. 35 1.4.7 传感器节点的操作系统 36 1.4.8 实时操作系统 36 1.4.9 智能卡操作系统 37 ...
  • 模型并行( **model parallelism** ):分布式系统中的不同机器(GPU/CPU等)负责网络模型的不同部分 —— 例如,神经网络模型的不同网络层被分配到不同的机器,或者同一层内部的不同参数被分配到不同机器;...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 569,308
精华内容 227,723
关键字:

多服务器系统的系统模型