bees' blog


  • 首页

  • 归档

  • 分类

  • 标签

  • 关于

【note】Terraform

发表于 2020-04-02 | 分类于 note

Terraform

Terraform 是什么

Terraform 是一种安全有效地构建、更改和版本控制基础设施的工具(基础架构自动化的编排工具)。它的目标是 “Write, Plan, and create Infrastructure as Code”, 基础架构即代码。

通俗的讲,Terraform是一个运行在客户端的开源的用于资源编排的自动化运维工具。通过代码的形式将所要管理的资源定义在模板中,解析并执行模板来自动化完成资源的创建、变更和管理,进而达到自动化运维的目标。

Terraform是由Hashicorp公司推出的一个开源项目,使用Go语言编写。目前主流的云厂商如AWS、GCP、腾讯云、阿里云等都支持使用Terraform进行云上资源的自动编排管理。

阅读全文 »

【k8s】K8S卷挂载引发的Pod逃逸问题

发表于 2019-11-26 | 分类于 k8s

卷挂载/var/log可导致pod逃逸

k8s查看容器日志

kubectl提供kebectl logs <pod_name>命令查看pod容器的日志,实现原理如下图所示:

k8s api server 对外提供api /logs 查看pod日志,实际是由kubelet提供的服务,kubelet在node上启动一个文件服务器提供日志查询服务,目录为/var/log,查询api为/logs。如下,访问node(10.0.0.76)上kubelet api /logs 可以列出node主机上/var/log目录下的所有目录和文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
ubuntu@VM-0-76-ubuntu:~$ curl -H 'Authorization: Bearer ihZppLLOVDSCRZS1zFPSwSLHk5odz8zg' -k https://10.0.0.76:10250/logs/
<pre>
<a href="alternatives.log">alternatives.log</a>
<a href="apt/">apt/</a>
<a href="auth.log">auth.log</a>
<a href="bootstrap.log">bootstrap.log</a>
<a href="btmp">btmp</a>
<a href="cloud-init-output.log">cloud-init-output.log</a>
<a href="cloud-init.log">cloud-init.log</a>
<a href="containers/">containers/</a>
<a href="dist-upgrade/">dist-upgrade/</a>
<a href="dmesg">dmesg</a>
<a href="dpkg.log">dpkg.log</a>
<a href="faillog">faillog</a>
<a href="fsck/">fsck/</a>
<a href="installer/">installer/</a>
<a href="journal/">journal/</a>
<a href="kern.log">kern.log</a>
<a href="lxd/">lxd/</a>
<a href="ntpstats/">ntpstats/</a>
<a href="pods/">pods/</a>
<a href="qcloud_action.log">qcloud_action.log</a>
<a href="syslog">syslog</a>
<a href="unattended-upgrades/">unattended-upgrades/</a>
<a href="wtmp">wtmp</a>
</pre>

kubelet查询相应pod的日志,实际是访问/var/log/目录下对应容器目录下的0.log文件(见上图),该文件本质上是一个符号链接,目标日志文件在/var/lib/docker/containers目录下。

1
2
#ls -alh 0.log
0.log -> /var/lib/docker/containers/2acb7d007fad51be32c467fd61639d25b3d04918b26a535735f4fb547d6e1b9d/2acb7d007fad51be32c467fd61639d25b3d04918b26a535735f4fb547d6e1b9d-json.log

pod逃逸

kubelet查看日志文件支持文符号链接。如果容器内挂载了主机/var/log目录,可以通过在容器内创建符号链接到/,再利用/logs可以访问node主机上的任意文件,造成pod逃逸问题。文章Kubernetes Pod Escape Using Log Mounts针对该问题进行了pod逃逸的实验,容器内创建符号链接到/,通过logsapi获取宿主机的token或SSH私钥文件实现pod逃逸。

容器内符号链接到/实现pod逃逸,需要满足如下条件:

  • root用户运行容器
  • 主机/var/log目录挂载到容器内,且可写;
  • pod内角色有访问kubeletlogs api的权限。

kubelet 10250端口未设置匿名访问选项,是需要认证授权才能访问logsapi接口,而kubelet 10255只读端口,可以不用验证和授权机制,直接访问,但是对下列api做了限制,默认禁止访问,这里面就包括/logsapi,因此不能通过10255端口绕过logsapi访问授权问题。

1
"/run/", "/exec/", "/attach/", "/portForward/", "/containerLogs/", "/runningpods/", "/logs/"

Subpath Volume Vulnerability in Kubernetes(CVE-2017-1002101)

kubernetes官方博客对subpath volume漏洞的原因做了深入分析,具体细节在这里不做过多描述,可查看文章了解。

利用subpath volume漏洞可以逃逸容器内的文件系统访问主机上的任何文件。 容器运行时挂载volume需要知道容器内的路径及对应的主机路径,kubernetes将subpath volume 和base volume同等对待,并没有对subpath volume的路径进行有效性校验,例如子路径(symlink跳转解析后的真实路径)是否在父路径范围下,导致可以利用symlink等特性将主机的根路径(/)挂载到容器内。

Ref

  • Kubernetes中的Volume介绍
  • 详解 Kubernetes Volume 的实现原理
  • subpath volume fixes(github pr)

【k8s】Kubeadm安装k8s支持secret加密

发表于 2019-10-15 | 分类于 k8s
  • 增加k8s yum源,编辑/etc/yum.repos.d/kubernetes.repo

    1
    2
    3
    4
    5
    [kubernetes]
    name=Kubernetes Repository
    baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
    enable=1
    gpgcheck=0
  • 安装kubeadm和相关工具

    1
    yum install -y kubelet kubeadm kubectl --disbaleexcludes=kubernetes
  • 启动docker和kubelet

    1
    2
    systemctl enable docker && systemctl staart docker
    systemctl enable kubelet && systemctl staart kubelet
  • 编辑kubeadm init配置文件

    1
    kubeadm config print init-defaults > init.default.yaml

    参考init.defaukt.yaml文件编辑配置文件init.config.yaml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    apiVersion: kubeadm.k8s.io/v1beta1
    imageRepository: gcr.akscn.io/google_containers
    kind: ClusterConfiguration
    kubernetesVersion: v1.14.0
    networking:
    dnsDomain: cluster.local
    podSubnet: ""
    serviceSubnet: 10.96.0.0/12
    apiServer:
    extraArgs:
    anonymous-auth: "false"
    encryption-provider-config: /etc/kubernetes/pki/kube-secret.yaml
    • k8s版本14, api-server支持secret加密参数为encryption-provider-config,参考:https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/#before-you-begin

    • kube-secret.yaml文件

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      apiVersion: apiserver.config.k8s.io/v1
      kind: EncryptionConfiguration
      resources:
      - resources:
      - secrets
      providers:
      - aescbc:
      keys:
      - name: key1
      secret: BhgJ6ldAAvHHdOkE9gGmMQj5seDc3nHeyQ+NOpZjeyY=
      - identity: {}
    • kube-secret.yaml路径选择

      kube-secret.yaml需要mount到api-server pod可访问的路径,这样api-server才能访问,这里选择默认会mount的路径/etc/kubernetes/pki

  • 拉取相关镜像

    1
    kubeadm config images pull --config=init-config.yaml
  • 安装master

    1
    kubeadm init --config=init-config.yaml
  • 验证aescbc加密

    • 安装etcdctl

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      #!/bin/bash
      ETCD_VER=v3.3.10
      ETCD_DIR=etcd-download
      DOWNLOAD_URL=https://github.com/coreos/etcd/releases/download

      # Download
      mkdir ${ETCD_DIR}
      cd ${ETCD_DIR}
      wget ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz
      tar -xzvf etcd-${ETCD_VER}-linux-amd64.tar.gz

      # install
      cd etcd-${ETCD_VER}-linux-amd64
      cp etcdctl /usr/local/bin/
    • 验证

      1
      ETCDCTL_API=3 etcdctl get /registry/secrets/default/default-token-6q4bn --cacert="/etc/kubernetes/pki/etcd/ca.crt" --cert="/etc/kubernetes/pki/apiserver-etcd-client.crt" --key="/etc/kubernetes/pki/apiserver-etcd-client.key" --endpoints=127.0.0.1:2379

【k8s】源码调试k8s

发表于 2019-09-24 | 分类于 k8s

虚拟机搭建k8s源码编译调试环境,宿主机使用golang IDE远程连接进行调试。

阅读全文 »

【note】mac外接屏幕旋转设置

发表于 2019-09-06

maxOS 10.13.6版本中系统偏好设置的显示器默认不显示屏幕旋转的选项,需要特定操作打开

  • 首先关闭已经打开的系统偏好设置窗口
  • 按住Option键再打开系统偏好设置
  • 按住Option+Command,再点一下“显示器”,这样就可以看到多了一个“旋转”的选项
  • 之后就可以选择90° 180° 270°的旋转设置

【pwn】IDA远程调试方法

发表于 2019-02-22 | 分类于 pwn

环境准备

  • 宿主机
    • 操作系统:OSX 10.13
    • IDA PRO: 7.0
  • 虚拟机
    • 操作系统: ubuntu 16.04
  1. 拷贝IDA文件到虚拟机中,

    /Applications/IDA Pro 7.0/ida.app/Contents/MacOS/dbgsrv/linux_server64

    拷贝linux_server64到虚拟机,则宿主机打开IDA64版本,要求版本一致。

  2. 虚拟机执行监听

    1
    2
    3
    4
    5
    #/home/xxx/Desktop/linux_server64
    $chmod +x /home/xxx/Desktop/linux_server64

    # 待分析的二进制文件 /home/xxx/Desktop/pwne
    $chmod +x /home/xxx/Desktop/pwne
阅读全文 »

【data】入门Flink scala编程

发表于 2019-01-14 | 分类于 data

flink scala编程入门的教程网上有一些,看着步骤相对比较简单,但是实践起来还是遇到不少的坑,这里记录下过程,供日后查阅,备注附录了遇到的一些问题。至于代码解释可自行查阅网上其他资料,这里不再赘述。

阅读全文 »

【源码阅读】psutil

发表于 2019-01-04 | 分类于 source code

psutil(Python system and process utilities)是一个跨平台的进程管理和系统工具的python库,
可以获取进程、系统CPU,memory,disks,network等信息。psutil主要用于系统资源的监控,分析,以及对进程进行一定的管理。支持的系统有Linux, Windows, OSX, FreeBSD and Sun Solaris,32和64位系统都支持。

阅读全文 »

【note】前后端分离跨域问题

发表于 2018-10-10 | 分类于 note

使用React开发可以轻松将前后端分离开来,当前端需要后端提供数据时,可能需要解决跨域问题。这里简单记录下解决跨域问题的一些方法。

  • React构建页面,axios请求数据
  • Flask提供数据

开发环境

使用create-react-app构建的React项目,可以直接在package.json添加代理配置。

1
"proxy": "http://localhost:8000/"

通过添加代理配置,不需要额外的代码适配。

阅读全文 »

【develop】React开发者的6个tips

发表于 2018-09-28 | 分类于 develop

Tips

  • 使用函数式组件
  • 保持组件尽量小
  • 合适处理”this”
  • “setState”中使用函数,而不是对象
  • 使用”prop-types”
  • 浏览器安装”React Developer Tools”
阅读全文 »
12…7
bees

bees

personal blog :)

63 日志
17 分类
71 标签
GitHub
友链
  • badcode
  • wupco
  • danlei
© 2017 — 2020 bees 渝ICP备18007542号
由 Hexo 强力驱动
|
主题 — NexT.Pisces v5.1.4