<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>audit | 伪架构师</title>
    <link>/tags/audit/</link>
      <atom:link href="/tags/audit/index.xml" rel="self" type="application/rss+xml" />
    <description>audit</description>
    <generator>Source Themes Academic (https://sourcethemes.com/academic/)</generator><language>zh</language><lastBuildDate>Thu, 31 Aug 2017 01:35:22 +0800</lastBuildDate>
    <image>
      <url>/img/logo-wide.png</url>
      <title>audit</title>
      <link>/tags/audit/</link>
    </image>
    
    <item>
      <title>Kubernetes 的审计日志和采集</title>
      <link>/post/auditlog-in-k8s/</link>
      <pubDate>Thu, 31 Aug 2017 01:35:22 +0800</pubDate>
      <guid>/post/auditlog-in-k8s/</guid>
      <description>

&lt;h2 id=&#34;基础操作&#34;&gt;基础操作&lt;/h2&gt;

&lt;p&gt;一个正常运行的 Kubernetes 集群，除了利用访问控制对集群操作的许可进行限制之外，对于操作过程的跟踪审计也是比不可少的，围绕不同的实体，例如用户、节点以及各种工作负载进行观测是很有必要的。Kubernetes 的 API Server 提供了审计日志支持，利用审计日志的方式对系统内的操作进行记录，这里我们可以沿用推荐的 Elastic Search + Fluentd 对审计日志进行采集存储，最终使用 Kibana 或者其他支持 ES 查询的工具对关键资源或用户进行访问跟踪。&lt;/p&gt;

&lt;p&gt;首先要启用 API Server 的审计功能。Kubernetes 提供了四个基础参数来定义审计功能：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;audit-log-path&lt;/strong&gt; 启用审计日志，并将日志内容写入指定文件，“-” 代表 stdout。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;audit-log-maxage&lt;/strong&gt; 日志文件的最大保存天数，根据文件名中的日期进行确定。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;audit-log-maxbackup&lt;/strong&gt; 最多保存日志文件的数量。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;audit-log-maxsize&lt;/strong&gt; 最大文件尺寸，超过尺寸会被翻转。单位是 MB，缺省为 100MB。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;例如：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;--audit-log-path=/var/log/kubernetes/kubernetes.audit \
--audit-log-maxage=7 \
--audit-log-maxbackup=4 \
--audit-log-maxsize=10
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;在 Kubernetes API Server 的启动参数中加入这些开关之后，重新启动服务。&lt;/p&gt;

&lt;p&gt;这时我们就可以看到文件&lt;code&gt;/var/log/kubernetes/kubernetes.audit&lt;/code&gt;已经生成。利用 tail 命令看看他的结构和内容，例如请求内容是这样的：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;2017-08-30T16:28:35.485818099+08:00 AUDIT: id=&amp;quot;ebc47b7b-c4fe-4a9a-861c-d9686903cec4&amp;quot; ip=&amp;quot;127.0.0.1&amp;quot; method=&amp;quot;GET&amp;quot; user=&amp;quot;system:apiserver&amp;quot; groups=&amp;quot;\&amp;quot;system:masters\&amp;quot;&amp;quot; as=&amp;quot;&amp;lt;self&amp;gt;&amp;quot; asgroups=&amp;quot;&amp;lt;lookup&amp;gt;&amp;quot; namespace=&amp;quot;&amp;lt;none&amp;gt;&amp;quot; uri=&amp;quot;/apis/admissionregistration.k8s.io/v1alpha1/initializerconfigurations&amp;quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;而响应内容格式如下：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;2017-08-30T16:28:35.486131325+08:00 AUDIT: id=&amp;quot;ebc47b7b-c4fe-4a9a-861c-d9686903cec4&amp;quot; response=&amp;quot;404&amp;quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;我们本文中暂时只对请求内容进行进一步解析，响应内容可以通过加入第二格式的方式进行采集。内容中的&lt;code&gt;id&lt;/code&gt;字段，可以看作是会话 id，用于连接请求和响应。&lt;/p&gt;

&lt;p&gt;根据上述文本内容，可以开始 Fluentd 文件的编写。请求和响应的内容都很规则，简单的正则表达式即可完成解析，例如我写的是这样的：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;&amp;lt;source&amp;gt;
  type tail
  format /^(?&amp;lt;time&amp;gt;\d.*?)\s+(?&amp;lt;action&amp;gt;\w+).\s+id=\&amp;quot;(?&amp;lt;id&amp;gt;.*?)\&amp;quot;\s+ip=\&amp;quot;(?&amp;lt;ip&amp;gt;.*?)\&amp;quot;\s+method=\&amp;quot;(?&amp;lt;method&amp;gt;.*?)\&amp;quot;\s+user=\&amp;quot;(?&amp;lt;user&amp;gt;.*?)\&amp;quot;\s+groups=(?&amp;lt;groups&amp;gt;.*?)\s+as=\&amp;quot;(?&amp;lt;as&amp;gt;.*?)\&amp;quot;\s+asgroups=\&amp;quot;(?&amp;lt;asgroups&amp;gt;.*?)\&amp;quot;\s+namespace=\&amp;quot;(?&amp;lt;namespace&amp;gt;.*?)\&amp;quot;\s+uri=\&amp;quot;(?&amp;lt;uri&amp;gt;.*?)\&amp;quot;$/
  path /var/log/kubernetes/kubernetes.audit
  pos_file /var/log/audit.pos
  time_format %Y-%m-%dT%H:%M:%S.%N%z
  tag audit.response
&amp;lt;/source&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;将这一部分内容加入到 Fluentd 配置之中去，启动抓取。日志入库之后，我们就可以对指定用户或者资源进行查询，获知他的黑历史了，例如我们要查找用户&lt;code&gt;admin&lt;/code&gt;的操作历史：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-json&#34;&gt;{
  &amp;quot;query&amp;quot;: {
    &amp;quot;match&amp;quot;: {
      &amp;quot;user&amp;quot;: {
        &amp;quot;query&amp;quot;: &amp;quot;admin&amp;quot;,
        &amp;quot;type&amp;quot;: &amp;quot;phrase&amp;quot;
      }
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;在 Kibana 中执行查询，会看到类似内容（如果所在集群没有该用户，可以替换为 &lt;code&gt;system:apiserver&lt;/code&gt;等内置用户进行测试）：&lt;/p&gt;

&lt;p&gt;利用解析出的各个字段，可以比较清楚的看到什么人，在什么时间，对什么对象进行了什么操作。&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;images/audit-screenshot.jpg&#34; alt=&#34;screenshot&#34; /&gt;&lt;/p&gt;

&lt;h2 id=&#34;高级审计&#34;&gt;高级审计&lt;/h2&gt;

&lt;p&gt;在 Kubernetes 1.7 中新增了 Advanced audit 特性（Alpha），可以对审计内容、以及后续处理进行定义。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;首先加入了审计策略的支持，可以使用行为，动作等条件进行限制，过滤掉无需考虑的审计内容。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;存储后端在日志之外，还增加了 Web Hook 的支持，可以直接将审计内容发布到指定的 Web 服务中。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
  </channel>
</rss>
