分类 工作日志 下的文章

上次的数据库故障余波未平。老服务整改周期内仍有可能增高,有没什么方法限制单个pod只能建立一定数量的数据库连接,把事故控制在一定范围内

  • 首先是数据库层面,可以在配置文件中限制连接数,但基于容器的环境IP会有变化 pass
  • 其次想到的是服务网格,因为是业务标配+出色的流量控制,应该可以从这里入手。看了圈文档,Istio更多关注的是进方向
  • 再次想到kubernetes本身的网络插件也有限流的功能,calico具备对进出方向端口的限制,但没找到连接数的

陷入僵局,最笨用iptables限制,但还能实时发现pod的重启更换IP,难道要复杂化,监控结合脚本的方式吗?忽然灵光一闪,initContainers阶段不是可以做很多事情嘛

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  initContainers:
  - name: init-iptables
    image: my-iptables-image
    command: ['sh', '-c', 'iptables -A OUTPUT -p tcp --dport 3306 -m connlimit --connlimit-above 20 -j REJECT']
  containers:
  - name: my-container
    image: my-image

😅未验证,原理可行- -

在对内部OS部门优化的过程中发现,服务器整体利用率很好,编译时可以将服务器所有线程打满,唯一掉链子的时候是解压缩unzip环节,只有单线程升高。简单了解了下,原来已经有了多线程的pigz工具,格式做一些微调即可。详细评测https://zhuanlan.zhihu.com/p/389817246
在翻看docker源码时,发现也会将pigz等压缩工具优先docker_source_code.jpg

chatGPT火爆IT圈已经几个星期了,仿佛没用过就被时代所抛弃。了解后发现,使用门槛还是挺高,需要使用海外的手机号注册openai,常见的“机场”都会被屏蔽。偶然发现接口在国内是可以访问的
testchatgpt.jpg

接下来的事就很简单了,使用django起了个页面,调用接口就可以了,供内网体验wangyechat.jpg

有效代码12行

import openai

openai.api_key = "sk-od9TZTgXar70JLTxf4K1T3BlbkFJlcQjxxxxx"

response = openai.Completion.create(
    engine="text-davinci-003",  # select model
    prompt="人生的意义何在?",
    max_tokens=512,  # response tokens
    temperature=1,  # diversity related
    top_p=0.75,  # diversity related
    n=1,  # num of response
)

completed_text = response["choices"][0]["text"]
print(completed_text)

需求描述:对某一地址,公司网络解析至172.16.1.1,外部解析到1.1.1.1
现状:公司内无单独的DNS服务器,DHCP分配上海公共DNS 202.96.209.5/133
过程:

  1. 内部搭建DNSmasq,DHCP更改配置。稍繁琐,所有DNS流量都走DNSmasq,单点且没必要
  2. 智能DNS解析中的自定义线路解析,实现原理

云解析是通过识别LOCALDNS的出口IP,来判断访问者来源。
如客户端LOCALDNS支持EDNS
因为云解析DNS支持 edns-client-subnet,所以在获取访问者来源IP时,优先获取 edns-client-subnet 扩展里携带的IP ,如果edns-client-subnet 扩展里存在IP,云解析DNS会以该IP来判断访问者的地理位置 ;如果不存在,则以LocalDNS出口ip来判断访问者的地理位置。

dig +short TXT whoami.ds.akahelp.net 

不错的办法,但我的DNS出口IP带ipv6,测试下来不生效
自定义线路解析.jpg

  1. 偶然发现华为防火墙有DNS透明代理功能,可以把特定解析指定DNS服务器,配合DNSmasq,测试下来效果逆天。不管设置何DNS,都受影响

一、一直自诩是柔性的管理者,讲情怀、谈感情、不涉及原则问题都是友善提醒。谈谈近期遇到的一位伙伴小王,他是一个月前加入,原本负责网络的同学匆忙离开。积压的问题越来越多,小王在上手之后不太能搞定,我经常提醒不要成为“沟通黑洞”,发包过去一声不吭。无奈,离开

二、会议效率降低怪象

  1. 靠会议推动,会议过多
  2. 不参会被定责,各类事故复盘会中,未参会部门会被定责。质量部门亦或是质量人员不够专业

对待故障要敬畏,要追根因。惩罚机制要恰到好处,避免大家不敢动,更应该把故障看成一份宝贵的经验包;对待历史问题不逃避。我反对把责任甩的一干二净。
正因为我这种“大包大揽”的责任感,质量部门经常莫名其妙定责给我。前天一次故障,其部门自行维护的服务单点宕机,事故前多次反复提醒仍不整改。坑惨一波又一波接任者

三、越来越像项目经理,技术上已得不到成长,离我的“专家”目标渐远
qunshan.jpg

遇到一种场景,某前端服务部署在kubernetes中,有偶发的服务故障。想着健康探针重启就行,忽然想到,如果是重要的线上服务宕机,不查出来心里憋得慌,怎么让服务恢复的同时又能保留现场呢
改当前pod的标签,这样deployment会认为副本消失,自动创建。完美实现老容器保留,业务也及时恢复
截图.jpg

kong中默认有安全插件,黑白名单限流等,限制UA暂时没找到。可以自己开发一个

-- handler.lua
local BasePlugin = require "kong.plugins.base_plugin"
local MyPluginHandler = BasePlugin:extend()

MyPluginHandler.VERSION = "1.0.0"
MyPluginHandler.PRIORITY = 10

function MyPluginHandler:new()
  MyPluginHandler.super.new(self, "block-user-agent")
end

function MyPluginHandler:access(conf)
  MyPluginHandler.super.access(self)
  
  -- 检查 User-Agent 请求头
  local user_agent = kong.request.get_header("User-Agent")
  for i, ua in ipairs(conf.blocked_user_agents) do
    if user_agent == ua then
      -- 如果 User-Agent 被阻止,使用 kong.response.exit 返回响应并停止处理
      return kong.response.exit(conf.response_code, { message = conf.response_message })
    end
  end
end
-- schema.lua
local typedefs = require "kong.db.schema.typedefs"

return {
  name = "block-user-agent",
  fields = {
    { consumer = typedefs.no_consumer },
    { config = {
        type = "record",
        fields = {
          { blocked_user_agents = { type = "array", default = {}, elements = { type = "string", }, }, },
          { response_code = { type = "number", default = 403 }, },
          { response_message = { type = "string", default = "Forbidden" }, },
        },
      },
    },
  },
}

docker启动时注意修改kong/constants.lua,在插件底部加入UA_block

docker stop kong-gateway
docker rm kong-gateway  
docker run -d --name kong-gateway \
 --network=kong-net \
 -e "KONG_DATABASE=postgres" \
 -e "KONG_PG_HOST=kong-database" \
 -e "KONG_PG_USER=kong" \
 -e "KONG_PG_PASSWORD=kongpass" \
 -e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \
 -e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \
 -e "KONG_PROXY_ERROR_LOG=/dev/stderr" \
 -e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \
 -e "KONG_ADMIN_LISTEN=0.0.0.0:8001" \
 -e "KONG_ADMIN_GUI_URL=http://localhost:8002" \
 -v /data/UA-block:/usr/local/share/lua/5.1/kong/plugins/UA-block \
 -v /data/constants.lua:/usr/local/share/lua/5.1/kong/constants.lua \
 -p 8000:8000 \
 -p 8443:8443 \
 -p 8001:8001 \
 -p 8444:8444 \
 -p 8002:8002 \
 -p 8445:8445 \
 -p 8003:8003 \
 -p 8004:8004 \
 kong/kong-gateway:2.6.1.0-alpine

UA-ill.jpg

近一周安全问题频发,明显是针对性的精准渗透行为,钓鱼邮件、ERP服务器被拿下、线上kubernetes集群被拿到部分权限成功部署反弹shell。从入侵轨迹来看,未做破坏但有明显的扫描内网行为,对方对安全、运维都有比较深入的了解。与政府组织的“磐石行动”时间点吻合,推测是对我们的白帽行为
云安全中心提醒还是很精准的,以容器中被运行反弹shell为例。从kubernetes审计日志,“黑客”使用被泄露账号通过暴露在公网的k8s api server进来,在进行了一系列尝试后发现有A命名空间的管理权限,具有onl的namespace 权限,查看了cm发现免密登陆,推送镜像,创建deployment ,镜像中传输数据。已关服务,wifi api server取消外网监听

过程中用到的命令
pstree -p -a #查看
docker inspect #查看pod信息
docker run -it --entrypoint /bin/sh xxxxx #启动疑似容器
查看kubernetes 审计日志
kubernetes get rolebinding -n xxx -o yaml

最新战报:
内部员工已中招,对方社工客服运行了可执行文件,导致在OA内向其他用户发送病毒文件
ERP服务器沦陷,有扫描内网的行为
CRM服务器中毒
🏳️

在家隔离的2个多月,重新捡起了运维开发工作

已实现or改进:

  1. 物理资产自动采集,通过DRF上报
  2. 通知功能*
  3. 长周期任务异步
  4. 密码管理
  5. 密码操作审计
  6. 使用了新的前端模板,耳目一新

待实现or改进

  1. 异步任务通知
  2. DASHBOARD功能
  3. 资产要关联应用,应用管理
  4. kubernetes的报表功能
  5. 权限管理

附几张效果图
资产管理.png审计管理.png模态对话框js.png

今天在排错时遇到个奇怪的现象,相同名称添加多条A记录超过512字节时,就会影响部分递归DNS的记录同步。
测试域名 liyang.sunmi.com 添加了36条A记录,大小610字节
A记录.jpg

必现部分递归DNS无法更新、解析失败
解析失败.jpg

1.查阅了DNS的RFC1035,udp包有512字节的长度限制,超出部份会被截断 原文
2.超过限制后使用tcp协议进行解析
3.公共DNS中,只有114.114.114.114会把超长结果截断在509字节,其他DNS都会原样返回

近期接到个古怪需求,历史原因有部分设备在代码中访问废弃接口uat.api.xxx.com,现有接口为 api.uat.xxx.com(顺序变化)。老设备升级rom版本较繁琐,网关不想动了,在外侧加了台nginx转发

# 通过rewrite301跳转
server {
    listen 80;
    server_name uat.api.xxx.com;

    location / {
        root /usr/share/nginx/html;
        if ( $host ~* uat.api.xxx.com ){
            rewrite .* http://api.uat.xxx.com$request_uri permanent;
        }

    }

}

# 方法2
在location中加,更优
    proxy_set_header Host api.uat.xxx.com;
    proxy_pass https://api.uat.xxx.com;

背景:海外用户投诉我们一个边缘功能失效,定位到程序假死。随着各种复盘会,把这件小事无限放大。
难点:探针改造复杂,尽管已经有了基础的http接口检测,但针对服务连接各种中间件等场景无法一一覆盖
在研发根治此问题前,使用“熔断”来降低此类故障的影响

熔断,是创建弹性微服务应用程序的重要模式。熔断能够使您的应用程序具备应对来自故障、潜在峰值和其他未知网络因素影响的能力

中间方案,通过网关日志,假死会有504超时的信息,SLS已支持触发各种钩子,逐个重启故障服务的pod

  • 优点:配置相对简单,覆盖面广
  • 缺点:按照监控的频率间隔,有几分钟延迟

更优istio方案,使用VirtualService配合DestinationRule对超时或者错误重试,并将故障pod踢出

  • 优点:侦测更快,发现故障后立即生效
  • 缺点:局部配置,所有服务都要写一遍

环境:

  • kubernetes v1.18.20
  • istio 1.10.3
  • 后端服务flask,代码如下,sleep5秒用于模拟超时
from flask import Flask
import time

app = Flask(__name__)


@app.route("/", methods=["GET"])
def index():
    time.sleep(5)
    return "Hello World Pyvo 2!"

istio中配置如下

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: backend-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"

---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: vs-backend-flask
spec:
  hosts:
  - "*"
  gateways:
  - backend-gateway
  http:
  - match:
    - uri:
        prefix: /flask
    rewrite:
      uri: /
    route:
    - destination:
        host: backend-flask
        port:
          number: 80
    retries:
      attempts: 3
      perTryTimeout: 2s

---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: dr-backend-flask
spec:
  host: backend-flask
  trafficPolicy:
    outlierDetection:
      consecutive5xxErrors: 1
      interval: 10s
      baseEjectionTime: 30s

熔断.jpg
效果如图,访问出现上游服务超时错误后,在30秒内不会再调度到故障节点

网购、中介、挪车等不想留真实号码的场景,可以用阿里小号。通过软件方法绑定一个真实号码,可以呼入呼出收发短信。以往的¥40/年,忽然涨价到¥120/年。
咸鱼买到个方法分享出来

【淘宝】https://m.tb.cn/h.fn38Yzz?sm=250fe0?tk=XfzD24SBX0s「阿里小号.普通小号卡券(仅供已有联通小号用户充值使用)」
点击链接直接打开,反馈后就能以20每年的价格购买5年了

401647496361_.pic.jpg

水一篇,公司从前年上thoughts后,编辑md文档还是很爽的,但也仅限于标题、分割、缩进、引用,今天花了点时间尝试了所有md支持的格式,原来各个编辑器还是有差异,常用的typora居然收费了。
有道云笔记默认的md格式就很好用了。
花10分钟学习工具使用,方便一生 :smile:

一键三连1,我们再测一个2
把大象放冰箱

  1. 打开冰箱
  2. 塞进去大象
  3. 关上冰箱门

- 阅读剩余部分 -

又到年底,回顾一下今年的身边事

  1. 初衷很好的分享制度,平日里见不到一篇,最近被密集刷榜。虽然是公司内部的贴吧,大家的帖子质量属实不高。上来没头没尾直接贴代码片段,上下文、解决什么问题都不写清
  2. 内部贴吧逐渐沦为吐槽办
  3. 正式承接了IT部门,以往的管理水平实在太低。供应商价格不合理,等保做了100多W,服务器、网络设备平均高15%;维保厂商屌的一笔。两个月内全部换掉,拉内审、采购的兄弟与我们制约,防大家碰红线。内部系统完全依赖供应商、缺乏监控,owner连服务宕机的处理规则都不清楚,2个月内梳理个大概,让问题能先于用户报出来- -,虚拟化也启动了
    当然也有IT兄弟们不理解离开了,可能是我的管理风格,对以往的“遗产”深恶痛绝,明明能通过公网解析,非要买两台硬件服务器搭建DNS,关键还要线上每一次域名更改手动告诉他,他再手动加到公司内的DNS服务器。这不纯纯脱裤子放屁行为!这类例子不胜枚举!

    其次我把采购这肥差变成清水衙门,让大家把自己的供应商都晒出来,同质价低者得。想起某部门要做ISO认证,明明3W能做的事情硬是整成10W+,本来我不想参与的,毕竟没花我部门预算,可IT并过来之后我就必须管:)

  4. 每天的时间被各种管理任务、绩效、安全、审计、提供资料等等填满。需求必须经过我,觉得合理之后才会路由给小伙伴,这也是我比较累的根因
  5. 近段时间有某网站的编辑付费邀约我录制课程,赶巧嗓子咳嗽,多次拉扯后以5000/2小时成交。每天晚上下班后等小孩睡了才能录,经常搞到1点以后。被这编辑的彩虹屁吹的头晕

下班途中刷手机,看到抖音有晒淘宝人生,算是淘宝第一批用户了。回想起首次购物在易趣,全程无担保买过mp4,2004年的1500块,大家都说我上当了,直到两周后收到来自广州的邮政快件^_^
ACA9C4E3-A782-40A6-BC6F-A5EA40BB93B0.jpeg

我的海外主机悉数被墙,每次连接异常麻烦,中转多次才能连接。
在使用finalshell过程中,忽然发现有这个设置,勾选即可连接。分享一下!这种没重点宣传却被用户发现的功能让人印象深刻!
snap.png

经常检查DAG复制是Exchange邮箱管理员日常任务之一,以前每天上去看也挺烦的,尤其数据库比较多的情况下。下图就是“好心”的台北同事经常提醒我检查,我的天,这要是通过EMC看还不累死。还CC我领导,搞的人怪没面子的。
图片1.jpg

几条需要注意:
一、此脚本放在exchange任一台主机运行即可。
二、Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010 添加Exchange管理模块
三、用Get-MailboxDatabase |foreach name 查看公司所有的Exchange数据库,选择要监控的数据库或者全部监控

NOTES
===========================================================================
 Created with:     SAPIEN Technologies, Inc., PowerShell Studio 2014 v4.1.57
 Created on:       2014/6/21 22:39
 Created by:       xing_ji
 Organization:     
 Filename:         
===========================================================================
.DESCRIPTION
    A description of the file.
#>
$host.UI.RawUI.WindowTitle = "check_DAGhealth edit by xing_ji"
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010
for (;;)
{
Start-Sleep -s 3600
$dblist = "XXhmdb11", "XXmdb12", "XXmdb13", "XXmdb14", "XXmdb00", "XXmdb11", "XXmdb12"
foreach ($db in $dblist)
{
    $status = Get-MailboxDatabaseCopyStatus -identity $db |foreach {$_.status}
    if ($status -notcontains "Healthy")
    {
        $msg1 = "$db is Dismount More than 5 minutes,Pls check!"
        $ssr = "relay.XXX.com"
        $from = "[email protected]"
        $to = "[email protected]"
                    $cc="[email protected]"
                $body = "$db is Dismount More than 5 minutes,Pls check!"
        Send-MailMessage -Subject $msg1 -SmtpServer $ssr -From $from -to $to -cc $cc -Body $body
    }
}
}

小插曲,
$status = (Get-MailboxDatabaseCopyStatus -identity $db).status 原先写法
$status = Get-MailboxDatabaseCopyStatus -identity $db |foreach {$_.status} 后来写法
我在写完脚本时,本机运行测试正常。但是放在服务器上运行时反而起了反作用,明明健康也给我发邮件报警玩儿。最后我发现原来是powershell 2.0版本不支持原来写法。

效果如图
图片2.jpg

前言:
恢复AD账号的文章不少,但是恢复后,往往更重要的事情片字未提,本文从实际操作角度出发,利用事前主动备份,防患未然,适用于每家企业。

某AD管理人员失误,将大领导账号除(删*除也是敏感字?)。抓紧将领导账户恢复,其反应一天邮件很少,本应该收到N个群组的来信,有些文件夹提示无权限!。才发现恢复账户后隶属组信息丢失。经过查询,未发现事后恢复群组信息的方法。 既然这样,干脆定期备份一次群组信息。
图片1.jpg
图片2.jpg

Import-Module ActiveDirectory
Get-ADUser -Filter {emailaddress -like "*@XXX.com"}|Format-Table Name >D:\Log\export_alluser_memberof\alluser.txt
$content= Get-Content D:\Log\export_alluser_memberof\alluser.txt
$users=$content.Trim()
ForEach ($user in $users)
{
$group=(Get-ADPrincipalGroupMembership -Identity $user).name
$result="$user is belong to $group " >>D:\Log\export_alluser_memberof\usergroup.txt
}

总结:
一、养成良好的备份习惯。此脚本定期执行即可,以后在恢复后可直接添加对应组。
二、网上的教程大多数是怎样恢复AD账号,但后续工作基本写的少之又少。我写的脚本只备份了群组信息,如果想做的完美,可以添加办公室 分机号等信息。一般来说,足矣!

感谢sima2004的热情回复,对于域、林结构均为08R2或以上的用户,可参照其文章恢复,恢复出的人员属xing(属xing也是敏感词- -!)信息都在。 ​​Windows Server 2008 AD R2 AD回收站恢复删除用户实战

邮箱业务往往是公司的重中之重,作为邮箱管理员,必须经常关注己方的出口IP是否被列入黑名单(Spamhaus),如已被列入,会造成终端用户发信被退回,此时须立即从此名单中取出并查明原因。每天上去看也挺麻烦的。写了个简单的小脚本供大家使用。

知识点1: ​​http://www.spamhaus.org/query/ip/1.1.1.1​​ IP换成你公司IP,绿色正常、红色异常。此194的IP说明已被列入CBL(图1)

知识点2: 知道区别就好办了,打开网页源代码,看到如下一行, <FONT color="red" 。那我们只要判断网页中是否含有这行就好(图2)
代码在最下方。每小时自动检核一次,有问题邮件报警。
图1.jpg

图2.jpg

$host.UI.RawUI.WindowTitle = "check_blacklist edit by xing_ji"
for (;;){
Start-Sleep -s 3600
$web1=(Invoke-WebRequest "http://www.spamhaus.org/query/ip/1.1.1.1").content
$web2=(Invoke-WebRequest "http://www.spamhaus.org/query/ip/2.2.2.2").content
if ($web1 -match '<B><FONT color="red">1.1.1.1' )
 {
 $msg1="1.1.1.1 in the blacklist,Pls check!"
 $msg2="2.2.2.2 in the blacklist,Pls check!"
 $ssr="relay.XXX.com"
 $from="[email protected]"
 $to="[email protected]"
 $cc="[email protected]" 
 $body="The ip address is being listed in the spamhaus blacklist.The mail is sent from SHVMMN01,which ip address is 10.101.13.15.For further infomation,please check with http://www.spamhaus.org"
 Send-MailMessage -Subject $msg1 -SmtpServer $ssr -From $from -to $to -cc $cc -Body $body
 }
 elseif ($web2 -match '<B><FONT color="red">2.2.2.2' )
 { Send-MailMessage -Subject $msg2 -SmtpServer $ssr -From $from -to $to -cc $cc -Body $body
 } }