Skip to content

监控本机外网 ip 变动,并更新云服务安全组白名单放行 ip,用于加固没有堡垒机的在线环境

License

Notifications You must be signed in to change notification settings

abrahamgreyson/update-whitelist

Repository files navigation

定时更新云服务安全组规则

License CodeFactor Test Codecov Python versions Views

这个工具旨在在缺乏堡垒机的情况下,对在线服务器放行本地 ip,免得长期暴露敏感端口。它会定时(每 3 分钟)获取本地的外网 ip,更新到云服务器的安全组白名单(目前支持腾讯云、华为云,其它云请参考本页末尾的“扩展”部分)。 支持多个云,每个云支持多个 region,每个 region 支持多个安全组,每个安全组支持多个端口的放行。

部署

  1. 支持 3.9 - 3.12
  2. 克隆项目,安装依赖 pip install -r requirements.txt
  3. 复制模板配置文件 config.example.yamlconfig.yaml,按需配置(请看下一节配置章节)
  4. 运行
 # 调试模式运行,带有 stdout
 python main.py
 
 # 后台运行、丢弃任何输出(活着使用 screen 活 tmux 工具能达到同样效果)
 nohup python main.py > /dev/null 2>&1 &
    
 # 验证是否执行
 ps aux | grep python
 
 # 重要服务,建议新建 systemd 服务单元,可以保证开机启动,也更好使用 systemctl 管理
 # 新建服务单元配置
 sudo vim /etc/systemd/system/whitelist.service
 # 文件添加下个代码段的内容👇 , 按需更改其中路径
 
 # 重新加载 systemd 配置
 sudo systemctl daemon-reload
 # 启动服务
 sudo systemctl start whitelist
 # 开机自启
 sudo systemctl enable whitelist
 # 检查状态 
 sudo systemctl status whitelist
[Unit]
Description=Update whitelist by Abe
After=network.target

[Service]
ExecStart=/usr/bin/python3 /path/to/your/main.py
WorkingDirectory=/path/to/your/
# 丢弃 stderr 和 stdout, 我们自己维护日志
StandardOutput=null
StandardError=null
Restart=always

[Install]
WantedBy=multi-user.target

配置

ipinfo.io

我们使用 ipinfo 的服务,去获得本地外网 ip, 最好申请个 token, 这样可以有更多的 rate limit 上限。

华为云

统一身份认证服务 IAM 中创建用户,赋予特定的接口权限,获取用户的 Access KeySecret Key

我们使用到的华为云 VPC 接口有:

  • ListSecurityGroupRule
  • DeleteSecurityGroupRule
  • BatchCreateSecurityGroupRules

我们需要放行的权限:

{
    "Version": "1.1",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "vpc:securityGroupRules:create",
                "vpc:securityGroupRules:delete",
                "vpc:securityGroupRules:get"
            ]
        }
    ]
}

腾讯云

访问管理中创建用户,赋予特定的接口权限,获取用户的 SecretIdSecretKey

我们使用到的接口:

  • DescribeSecurityGroupPolicies
  • DeleteSecurityGroupPolicies
  • CreateSecurityGroupPolicies

我们需要放行的权限:

{
  "statement": [
    {
      "action": [
        "cvm:DescribeSecurityGroup*",
        "cvm:Create*",
        "cvm:DeleteSecurityGroupPolicy"
      ],
      "effect": "allow",
      "resource": [
        "*"
      ]
    }
  ],
  "version": "2.0"
}

扩展

因为是自用的,所以仅实现了腾讯和华为云,如果你使用其它云平台,请按照 update_whitelist/cloud_providers 目录下的现有代码实现自己的云服务供应商,需要实现的方法签名如下。 为了更加快捷地实现这些方法, 可以直接去云服务商的 API 调试台,先搞清楚接口什么怎么调用的,然后直接引入其 sdk 即可。

    @abstractmethod
    def initialize_client(self):
        """
        初始化特定云服务的客户端
        """
    pass

    @abstractmethod
    def delete_rules(self, group_id, rules):
        """
        删除安全组规则
        """
        pass

    @abstractmethod
    def add_rules(self, group_id, rules, ip):
        """
        添加安全组规则
        """
        pass

    @abstractmethod
    def get_rules(self, group_id):
        """
        获取安全组规则
        """
        pass

测试

# 安装开发依赖
pip install -e ".[dev]"
# 运行
pytest

LICENSE

MIT

About

监控本机外网 ip 变动,并更新云服务安全组白名单放行 ip,用于加固没有堡垒机的在线环境

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages