在这个 AI 爆发的时代,我做了些什么

楔子

《列子·汤问》里有个叫偃师的工匠,给周穆王献过一个"倡者"——一个会唱歌跳舞的人偶。

表演快结束的时候,这个人偶朝穆王的姬妾抛了个媚眼。穆王大怒,要当场杀了偃师。偃师没辩解,只是把人偶拆开给他看:里面全是皮革、木头、胶漆和颜料,五脏六腑一应俱全,但都是假的。拆掉心脏,它就不能说话;拆掉肝脏,它就不能看东西;拆掉肾脏,它就不能走路。

阿里云K8s集群部署cert-manager

基础环境

Kubenetes版本: v1.22.3
cert-manager版本: v1.8.1
注意事项: Kubenetes版本必须大于等于v1.19.0

安装cert-manager

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.8.1/cert-manager.yaml
检查是否安装成功:

K3s环境下如何启用traefik的dashboard

前言

没得前言,就一个简单记录

配置

master机器上添加文件/var/lib/rancher/k3s/server/manifests/traefik-config.yaml,内容如下:

Nginx配置resolver

前言

没得前言,就一个简单记录

配置

次该nginx配置文件,格式如下:

http {  
resolver X.X.X.X valid=5s;

server {

    server_name www.example.com;
    set $dn "foo.dnsalias.net"; 

    location / {
        proxy_pass http://$dn;
        ...
    }

}

}

Redis未授权访问漏洞利用小结

Redis因配置不当可以未授权访问。攻击者无需认证访问到内部数据,可导致敏感信息泄露,也可以恶意执行flushall来清空所有数据。  
攻击者可通过EVAL执行lua代码,或通过数据备份功能往磁盘写入后门文件。  
如果Redis以root身份运行,可以给root账户写入SSH公钥文件,直接通过SSH登录受害服务器。  

目标:

利用Redis未授权访问漏洞获取root权限

使用Docker一键搭建MQTT服务器(EMQ X)

这是个草稿,后面再完善

1883:MQTT 协议端口
8883:MQTT/SSL 端口
8083:MQTT/WebSocket 端口
8080:HTTP API 端口
18083:Dashboard 管理控制台端口

启动命令:docker run -itd --restart=always --name mqtt-server -p 18083:18083 -p 1883:1883 -p 8084:8084 -p 8883:8883 -p 8083:8083 emqx/emqx

【设计模式系列】策略模式

什么是策略模式

定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
主要是为了解决在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。

场景

假设我们现在有一群鸭子,有橡皮鸭和丑小鸭,橡皮鸭不能飞不能叫,丑小鸭能飞能叫,它们都可以游泳。 我们可以先把飞行这两个行为抽象出两个接口,然后再去实现这两个接口。

Drone 自动构建 Hugo 并推送到阿里云服务器

准备条件

  1. Git 仓库(推荐自建,我是用的 Gitea,和 Drone 比较契合),将hugo new site生成的文件全部推到仓库里
  2. Drone 环境,前文已经写过,不再赘述

编写 Drone 配置文件

kind: pipeline
name: default

steps:
  - name: 生成静态资源
    image: hypervtechnics/drone-hugo
    settings:
      # 指定hugo版本
      hugo_version: 0.70.0
      # 是否校验配置文件是否合法
      validate: true
      # 指定配置文件
      config: config.yaml
      # 指定文章目录
      content: content
      # 指定生成的静态资源路径
      output: ./hugo

  - name: 推送到服务器
    image: appleboy/drone-scp
    settings:
      # 服务器IP
      host: 10.0.0.1
      # 需要替换的服务器的路径,我的是服务器的`/data/hugo`目录,由于打包的文件的路径就是`hugo`,所以这儿只需要写`/data`即可
      target: /data
      # 本地生成的静态资源的路径
      source: hugo/*
      # 服务器账号
      username: root
      # 服务器登录密码
      password: password
      # 服务器端口
      port: 22
    when:
      # 当仓库的 master 分支收到 push 事件,并且前一步构建成功的时候触发当前步骤
      event: push
      branch: master
      status: success

  - name: 发送电报通知消息
    image: appleboy/drone-telegram
    settings:
      token: 机器人Token
      to: 收信人用户ID
      message: >
        {{#success build.status}}
          博客更新成功
        {{else}}
          博客更新失败
        {{/success}}
        更新记录:{{commit.author}} - {{commit.message}}

Drone 启用自动化

Drone管理界面点开仓库,然后点一下ACTIVATE REPOSITORY按钮即可

Watchtower - 自动更新 Docker 镜像与容器

前言

在服务器上部署 Docker 容器有一种在手机上装 APP 的感觉,但 Docker 容器并不会像手机 APP 那样会自动更新,而如果我们需要更新容器一般需要以下三个步骤:

  1. 停止并删除容器:docker rm -f <CONTAINER>
  2. 更新镜像:docker pull <IMAGE>
  3. 启动容器:docker run <ARG> ... <IMAGE>

如果部署了大量的容器需要更新使用这种传统的方式工作量是巨大的。

使用Drone构建Docker镜像一键发布并推送电报通知

书接上回,上文已经搭建好了Drone CI环境,本文就搭建一个Golang + Docker的Demo。
具体代码见:示例代码

准备工作

  1. 一个电报机器人,文档请点我查看(需要一把梯子)
  2. 一个项目,可以直接用上文的实例Demo

食用方式

  1. Gitea创建一个空项目,本过程不赘述。
  2. 打开Drone CI后台,点击右上角SYNC按钮更新项目目录,更新完毕之后点击项目右侧ACTIVAVE按钮,然后点击ACTIVATE REPOSITORY按钮启用自动化
  3. 初始化项目
# clone项目,我这只是个例子
git clone https://gitee.ltd/lxh/drone-ci-golang
# 初始化
cd drone-ci-golang
go mod init drone-ci-golang
// 创建 main.go 文件
package main

import (
  "net/http"

  "github.com/gin-gonic/gin"
  "github.com/sirupsen/logrus"
)

func main() {
  r := gin.Default()

  r.GET("/health", func(c *gin.Context) {
    c.JSON(http.StatusOK, gin.H {
      "health": true,
    })
  })

  if err := r.Run(":8080"); err != nil {
    logrus.WithError(err).Fatal("Couldn't listen")
  }

}
  1. 编写.drone.yml文件,可参考下文
kind: pipeline
name: golang-docker-ci

steps:
  - name: 执行代码检查
    image: golang:latest
    commands:
      - go get -u github.com/golangci/golangci-lint/cmd/golangci-lint
      - golangci-lint run

  - name: 编译二进制文件
    image: golang:latest
    environment:
      GOOS: linux
      GOARCH: amd64
      CGO_ENABLED: 0
    # 编译生成二进制文件,我这儿叫 go-app,酌情修改
    commands:
      - go build -o go-app

  - name: 打包Docker镜像并推送
    image: plugins/docker
    settings:
      registry: 需要推送的Docker私服服务器地址
      repo: 需要打包的镜像名称
      use_cache: true
      username: 私服登录用户名
      password: 私服登录密码
      auto_tag: true # 自动打tag
      # 也可以用下面这个手动指定
      # tags:
        # - latest
        # - 0.0.1
    when:
      event: push
      branch: master

  - name: 发送电报通知消息
    image: appleboy/drone-telegram
    settings:
      token: 电报机器人的token
      to: 需要接收的用户的userid,可在电报机器人 `@userinfobot`得到
      message: >
        {{#success build.status}}
          第 {{build.number}} 次构建已完成,状态:构建成功
        {{else}}
          第 {{build.number}} 次构建已完成,状态:构建失败
        {{/success}}
        提交记录:{{commit.author}} - {{commit.message}}
  1. 编写Dockerfile文件
FROM alpine
MAINTAINER LiXunHuan([email protected])

创建工作目录,修改alpine源为中科大的源,安装必要工具

RUN mkdir -p /app && sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories &&
apk update &&
apk upgrade &&
apk add ca-certificates && update-ca-certificates &&
apk add –update tzdata &&
rm -rf /var/cache/apk/*

WORKDIR /app

这个go-app 是上面.drone.yml里面编译生成的文件,酌情修改

COPY go-app ./ ENV TZ=Asia/Shanghai

EXPOSE 8080

ENTRYPOINT ./go-app

  1. 推送项目到Gitea私服,Drone会自动处理
  2. 打包完成之后,随便找个服务器pull镜像,然后运行测试效果

效果预览

  • Drone运行截图1 l6t37V.png