关于使用 Golang 创建 CLI 工具来编辑 AWS 安全组的故事

我叫寺冈,是一名基础设施工程师。
这次,我将谈谈如何用 Golang 创建一个命令行工具。
它叫做“goacl”,我想先介绍一下它的功能。
1. goacl是什么?
goacl 是一个用 Golang 编写的命令行工具。
查看 AWS 安全组列表,并向
特定组添加规则。
目前,它只允许您显示列表和添加规则,但
我们计划添加允许您删除不必要的规则的功能。
2.创建原因
有两个内部/个人原因。
内部原因
简而言之,原因是办公室的固定 IP 地址将来会发生变化。
为了提高内部网络的质量,
我们决定更换线路,但我们
不确定如何从新的 IP 地址授予访问权限。
我们公司的核心业务是托管服务提供商 (MSP),
因此我们管理着许多客户的 AWS 账户。
每当 IP 地址发生变更时,我们都必须检查所有账户的权限设置,而
手动添加权限设置存在诸多限制。
这时我们就需要用到“goacl”工具。
个人原因
我一直想学习 Golang 编程,我认为这将
有助于我简化工作流程,同时也是一个很好的个人学习机会。
HashiCorp 产品(如 Terraform 和
中使用的语言
我认为基础设施工程师学习它有很多好处。
3.goacl 的用法和逻辑
这是一个命令行工具,因此需要从命令行运行。
用法
只需输入 goacl 即可查看用法。
`goacl` 是一个命令行工具,用于列出 AWS 安全组并添加/删除规则。用法:`goacl [命令]` 可用命令:`add` 添加安全组规则;`help` 获取任何命令的帮助信息;`list` 列出安全组信息。参数:`--config string` 配置文件(默认为 `$HOME/.goacl.yaml`);`-h, --help` 获取 `goacl` 的帮助信息;`-t, --toggle` 获取切换命令的帮助信息。使用 `goacl [命令] --help` 获取有关命令的更多信息。.
列表
使用“list”子命令查看安全组列表
$ goacl list --region us-west-1 --profile default +-------------+----------+----------+----------------+--------------+ | GROUPID | GROUPNAME | FROMPORT | CIDRIP/GROUPID | VPCID | +-------------+------------+----------+----------------+--------------+ | sg-XXXXXXXX | default | +-------------+------------+----------+----------------+--------------+
由于这是一篇博客,ID 部分被屏蔽了,但
在 goacl 内部,使用 aws-sdk-go 获取安全组信息,并将
执行结果格式化为表格并输出。
通过命令选项
指定要列出的区域和要使用的配置文件。
如果您未指定任何内容,则将引用默认值,
区域为“ap-northeast-1”,配置文件为“default”。
子命令和选项的实现使用了
Cobra 而 Cobra 也用于 Kubernetes 源代码中,因此它可能相当有名。
添加
您可以向特定安全组添加规则。
执行添加命令时,需要一个用 YAML 编写的配置文件。
规则: - groupid: sg-XXXXXXXX fromport: 80 toport: 80 ipprotocol: tcp ipranges: - 0.0.0.0/0 - groupid: sg-XXXXXXXX fromport: 443 toport: 443 ipprotocol: tcp ipranges: - 0.0.0.0/0
要开放 80/443 端口,请使用上述命令。ipranges
命令用于指定允许的 IP 地址,
可以指定多个条目。
我们来试一试。
$ goacl add --region us-west-1 --profile default --config config.yaml $ goacl list --region us-west-1 --profile default +-------------+------------+----------+----------------+--------------+ | GROUPID | GROUPNAME | FROMPORT | CIDRIP/GROUPID | VPCID | +-------------+-----------+----------+----------------+--------------+ | sg-XXXXXXXX | default | 80 | 0.0.0.0/0 | vpc-XXXXXXXX | + + +----------+----------------+ + | | | -1 | sg-XXXXXXXX | | + + +----------+----------------+ + | | | 443 | 0.0.0.0/0 |
您可以使用“--config”选项指定配置文件。
其余选项与 list 命令相同。
如果在运行 add 命令后运行 list 命令,则可以确认是否已添加。
使用
viper读取配置文件代码中定义了与 yaml 结构相同的结构,
使用 viper.Unmarshal读取配置文件并将
type Config struct { Rules []Rules `yaml:rules` } type Rules struct { GroupID string `yaml:groupid` FromPort int64 `yaml:fromport` ToPort int64 `yaml:toport` IpProtocol string `yaml:ipprotocol` IpRanges []string `yaml:ipranges` }
我遇到了困难,因为我完全不理解结构的概念,但我
设法让它正常运行了(我会再多学习一下)。
4.总结
目前,我们会将其用于内部识别漏洞,但希望
将来能将其开源。我们
目前还无法删除规则,所以我们会继续完善该功能,并在另一篇博文中详细介绍!
0