1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#cloud-config
#Update the packages onboot.
package_update: true

#ncurses-compat-libs is for Amazon Linux 2.
packages:
- libaio
- numactl
- tzdata
- ncurses-compat-libs

write_files:
- path: /etc/profile.d/lang.sh
content: |
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8

- path: /etc/security/limits.conf
content: |
root hard nofile 65535
root soft nofile 65535
root hard nproc 8192
root soft nproc 8192

- path: /opt/appdynamics/response.varfile.bak
content: |
serverHostName=HOST_NAME
sys.languageId=en
disableEULA=true
platformAdmin.port=9191
platformAdmin.databasePort=3377
platformAdmin.dataDir=/opt/appdynamics/platform/mysql/data
platformAdmin.databasePassword=ENTER_PASSWORD
platformAdmin.databaseRootPassword=ENTER_PASSWORD
platformAdmin.adminPassword=ENTER_PASSWORD
platformAdmin.useHttps$Boolean=false
sys.installationDir=/opt/appdynamics/platform

- path: /etc/systemd/system/appd.console.service
permissions: '0644'
content: |
[Unit]
Description=AppDynamics Enterprise Console
After=network.target

[Service]
Type=forking
ExecStart=/opt/appdynamics/platform/platform-admin/bin/platform-admin.sh start-platform-admin
ExecStop=/opt/appdynamics/platform/platform-admin/bin/platform-admin.sh stop-platform-admin
User=root
Restart=always

[Install]
WantedBy=multi-user.target

- path: /etc/systemd/system/appd.console.install.service
permissions: '0644'
content: |
[Unit]
Description=AppDynamics Enterprise Console Installation
After=network.target

[Service]
Type=oneshot
RemainAfterExit=no
ExecStart=/bin/sh -c 'sleep 5 && cp /opt/appdynamics/response.varfile.bak /opt/appdynamics/response.varfile && sed -i \"s/ENTER_PASSWORD/`curl http://169.254.169.254/latest/meta-data/instance-id`/g\" /opt/appdynamics/response.varfile && sed -i \"s/HOST_NAME/`curl http://169.254.169.254/latest/meta-data/hostname`/g\" /opt/appdynamics/response.varfile && /opt/appdynamics/platform-setup-x64-linux-23.1.1.18.sh -q -varfile /opt/appdynamics/response.varfile && systemctl daemon-reload && systemctl enable appd.console.service && systemctl start appd.console.service'

[Install]
WantedBy=multi-user.target

runcmd:
# Create directory and copy Cisco AppDynamics Enterprise Console setup file
- aws s3 cp s3://ciscoappdnx/platform-setup-x64-linux-23.1.1.18.sh /opt/appdynamics/ --region cn-northwest-1
- chmod +x /opt/appdynamics/platform-setup-x64-linux-23.1.1.18.sh
- systemctl daemon-reload
- systemctl enable appd.console.install.service
- sed -i 's/#PermitRootLogin yes/PermitRootLogin no/g' /etc/ssh/sshd_config
- rm -rf /root/.ssh/authorized_keys
- rm -rf /home/ec2-user/.ssh/authorized_keys
- shred -u /etc/ssh/*_key /etc/ssh/*_key.pub

手工作坊与“云”格格不入

Cisco AppDynamics 是一款功能强大、易于使用的应用程序性能管理(APM)解决方案,能够端到端监控亚马逊云的应用程序,包括微服务和 Docker,通过 CloudWatch 集成为 EC2、DynamoDB、Lambda 等提供支持。AppDynamics可比较和验证云迁移前后的从客户到业务的优化,从而加速客户上云,因而深受用户喜爱。

为了提升用户在亚马逊云科技云端安装部署AppDynamics软件的效率,我们需要制作一个打包好的安装镜像 —— Amazon Machine Images (AMI)。用户使用AMI镜像启动虚拟机即可进入AppDynamics的设置界面,这能帮助用户节省大量软件下载、安装调试的时间,极大改善用户的安装体验。
我们采用什么方式来制作AMI镜像呢?

使用纯手工方式当然可以完成制作,但是这个AMI镜像封存了整个虚拟机的磁盘,包括操作系统和软件包。如果AppDynamics软件发布新版本,或者操作系统发现安全漏洞,就需要进行软件升级或系统漏洞修复的工作。在这种情况下,手工作坊难以招架,换句话说,在云的世界,已经没有手工作坊的一席之地,只有自动化一种选项。

那么,接下来的问题是:自动化需要工具和代码的支持,代码要怎么写呢?

笔者虽然能写点简单的Python代码、Shell脚本,可是要编写一个综合性的代码,恐怕没有两周时间,再加上掉几把头发是写不出来的。

阅读全文 »

作者: 饶维波

本文记录通过ChatGPT生成cloud-init制作AppDynamics在AWS上 AMI安装镜像的过程,形成操作文档作为参考指南。

任务简介和总体思路

任务简介

Cisco AppDynamics 提供功能强大、易于使用的应用程序性能管理(APM)解决方案,端到端监控亚马逊云的应用程序,包括微服务和 Docker,通过 CloudWatch 集成为 EC2、DynamoDB、Lambda 等提供支持。AppDynamics可比较和验证云迁移前后的从客户到业务的优化,从而加速客户上云,因而深受用户喜爱。

为了提升用户在亚马逊云科技云端安装部署AppDynamics软件的效率,我们需要制作一个打包好的安装镜像,叫做Amazon Machine Images (AMI)。用户使用AMI镜像启动虚拟机即可进入AppDynamics的设置界面,这能帮助用户节省大量软件下载、安装调试的时间,极大改善用户的安装体验。

本次任务的目标是需要完成AppDynamics AMI的制作,且为了便于后续维护,维护的工作主要包括操作系统层面的安全漏洞修复、AppDynamics软件版本的升级,尽量使用自动化,节省人的时间精力的同时,避免人为错误。

任务关键点是需要编写一个自动化脚本,考虑为Shell脚本或者cloud-init脚本。

阅读全文 »

本文将分析一种名为允许Traceroute探测的漏洞,对其判定方法进行追查,并提出建议。

背景

最近,笔者在做一个网络设备方面的安全合规性的测试,其中有一项是需要使用漏洞扫描设备对被测试的设备进行全面的安全漏洞扫描。在笔者对被测设备进行了针对性的安全加固后,漏洞扫描报告仍然有一个低危漏洞:允许Traceroute探测。该低危漏洞的详细信息如下:

traceroute-vulnerability

需要说明的一点是,扫描器如需成功扫描到该设备,这个设备的IP地址要求能被扫描器探测到,否则扫描器会认为设备不在线。通常的做法就是允许Ping,具体而言,被测设备至少要允许ICMP Echo Request请求,并应答ICMP Echo Reply。

笔者在被测试设备的接口上配置了ACL,入向仅允许ICMP Echo Request报文,出向仅允许ICMP Echo Reply,但是扫描结果依然判断被测设备允许Traceroute探测。

对此,笔者疑惑不已,下文将展开思考和分析。

阅读全文 »

AnyCast,一组服务器拥有相同的IP地址,当客户端访问该组服务器时,网络会将请求发送至最近的服务器进行处理,从而极大的缩短途径的公网路径,减少延时、抖动、丢包的情况。

AnyCast通常和BGP路由协议关联在一起,其实现的主要原理是:位于不同地理位置的路由器向外发布同一段IP网段的BGP路由,路由在Internet中传播后,访问发起端所处网络的路由器会选择最短的BGP AS Path路由,从而实现最短路径的访问。如果BGP选路区分不出最近的路径,那就由IGP最短路径进行转发。

AnyCast的好处:

  • 就近访问,减少时延、提升性能
  • 获得高冗余性和可用性,即当任意目的节点异常时,可自动路由到就近目的节点
  • 实现负载均衡,且对客户端是透明的(由网络路由实现)
  • 缓解DDOS攻击,AnyCast将DDOS攻击流量引导至本地服务器,极大的减少了DDOS流量的范围以及规模
阅读全文 »