关于使用 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
加载中...
0 票,平均:0.00 / 10
1,187
X Facebook 哈特纳书签 口袋

写这篇文章的人

关于作者

寺冈由纪

于 2016 年加入 Beyond,目前是他担任基础设施工程师
MSP 的第六个年头,他负责排除故障,同时
使用 AWS 等公共云设计和构建基础设施。
最近,我
一直在使用 Terraform 和 Packer 等 Hashicorp 工具作为构建 Docker 和 Kubernetes 等容器基础设施以及自动化操作的一部分,并且我
还扮演了在外部学习小组和研讨会上发言的传播者的角色。

・GitHub
https://github.com/nezumisannn

・演示历史
https://github.com/nezumisannn/my-profile

・演示材料(SpeakerDeck)
https://speakerdeck.com/nezumisannn

・认证:
AWS认证解决方案架构师-
谷歌云专业云架构师