应用监控与安全保障:AWS 实战指南
1. 应用监控基础
在运行的实例上,由于配方是在设置阶段运行的,所以需要在当前运行的实例上触发设置操作。未来启动的任何实例都会自动运行设置。若当前只有一个实例在运行,可按以下步骤在其上运行设置命令:
1. 导航到实例视图,点击正在运行的实例名称。
2. 在右上角点击“运行命令”。
3. 在“设置”标题下,从“命令”下拉菜单中选择“设置”。
4. 点击右下角的“设置”。
实例完成设置命令需要一些时间。运行的配方会在实例设置完成后,自动将存储在 /var/log/aws/opsworks/opsworks-agent.log 的日志上传到 CloudWatch Logs。
如果想上传不同的系统日志到 CloudWatch,可通过 SSH 连接到实例,查找感兴趣的日志,然后修改配方以选择不同的日志文件进行上传,并从 S3 存储桶或存储库部署食谱。
2. CloudWatch Logs 操作
- 查看日志 :片刻后,日志会出现在 CloudWatch 中。前往 CloudWatch 仪表板,从左侧导航栏选择“日志”,会看到一个名为“Photoalbums”的日志组。
- 设置日志保留期 :CloudWatch Logs 有自己的层次结构,单个日志语句称为事件,日志事件存储在一系列流中,这些流在顶层组织成组。在组级别可以控制日志保留策略。例如,将日志保留期减少到三天的操作步骤如下:
- 点击日志组视图中的“永不过期”。
- 编辑保留期模态视图将出现,从下拉菜单中选择“3 天”。
- 会看到确认旧数据将被删除的消息,点击“确定”确认。
- 创建指标过滤器 :可以创建指标过滤器来自动扫描日志中的特定术语或模式,并使用它们创建自定义 CloudWatch 指标。创建步骤如下:
- 返回 CloudWatch Logs,点击“Photoalbums”日志组旁边的“0 个过滤器”。
- 点击“添加指标过滤器”。
- 在“定义日志指标过滤器”视图中,在“过滤器模式”字段中输入文本“[ERROR]”(包括双引号)。
- 点击“分配指标”继续。
- 在下一个视图中,设置过滤器名称和指标名称,如将指标名称设置为“UncaughtErrors”,然后点击“创建过滤器”。
- 创建警报 :基于指标创建警报,当异常抛出时警报会触发。创建步骤如下:
- 点击“创建警报”。
- 命名警报为“Photoalbums - Uncaught Error Occurred”,并使警报向“PhotoalbumsAlarm”列表发送通知。
- 点击“创建警报”,然后对
/users/error进行 GET 请求,检查日志流会看到错误,同时会收到错误发生的电子邮件通知。
3. 应用日志流管理
为应用程序级日志创建单独的日志流是个好方法,因为应用程序在多个实例上运行时,负载均衡器会决定哪个实例处理用户请求,若用户遇到错误,无法确定错误发生在哪个实例上。创建应用程序日志流的步骤如下:
1. 在“日志流”视图中,点击顶部的“创建日志流”按钮。
2. 模态窗口将出现,输入日志流名称“application”,然后点击“创建日志流”。
为了向日志流填充数据,可使用 AWS SDK 以编程方式发布事件。以下是创建自定义 CloudWatch 日志记录类(cwlogs)的代码:
// /lib/cwlogs.js
var aws = require('aws-sdk');
var cloudwatchlogs = new aws.CloudWatchLogs({ region: 'us-east-1' });
var logParams = {
logGroupName: 'Photoalbums',
logStreamName: 'application',
logEvents: []
};
// store event in logs to be sent to CloudWatch Logs
function logEvent(message) {
var eventTimestamp = Math.floor(new Date());
var newEvent = {
message: message,
timestamp: eventTimestamp
}
logParams.logEvents.push(newEvent);
}
function putLogs() {
if (logParams.logEvents.length > 0) {
getSequenceToken(function (err, token) {
if (token) {
logParams.sequenceToken = token;
}
cloudwatchlogs.putLogEvents(logParams, function (err, data) {
if (err) {
} else {
logParams.sequenceToken = data.nextSequenceToken;
logParams.logEvents = [];
}
});
});
}
}
function getSequenceToken(callback) {
cloudwatchlogs.describeLogStreams({ logGroupName: logParams.logGroupName }, function (err, data) {
if (err) {
callback(err);
} else {
for (var i = 0; i < data.logStreams.length; i++) {
var logStream = data.logStreams[i];
if (logStream.logStreamName == logParams.logStreamName) {
callback(null, logStream.uploadSequenceToken);
break;
}
}
}
});
}
exports.logEvent = logEvent;
exports.putLogs = putLogs;
4. 集成 cwlogs 到代码
以在 /routes/users.js 中为 GET /users/user/:user 路由添加日志记录为例,集成步骤如下:
1. 在文件顶部包含 cwlogs 类:
var cwlogs = require('./../lib/cwlogs');
- 定位
router.get(/user/:user)函数,替换为以下代码:
router.get('/user/:user', function (req, res) {
var params = {
username: req.param('user')
}
var eventMessage = 'GET /users/user/' + params.username;
cwlogs.logEvent(eventMessage);
model.getUser(params, function (err, obj) {
if (err) {
res.status(500).send({ error: 'An unknown server error has occurred!' });
} else {
var eventMessage = 'getUser ' + params.username + ' ' + JSON.stringify(obj);
cwlogs.logEvent(eventMessage);
res.send(obj);
}
});
cwlogs.putLogs();
});
- 提交更改到存储库,返回 OpsWorks 选择堆栈,从导航菜单中选择“部署”,点击右上角的“部署应用程序”,添加部署说明(可选),点击右下角的“部署”。部署完成后,对
/users/user/[your username]进行 GET 请求,返回 CloudWatch 查看日志。
5. 异常处理
为了上传异常到 CloudWatch Logs 并创建警报,操作步骤如下:
1. 在 /routes/users.js 中添加以下代码:
router.get('/error', function (req, res) {
throw new Error("[ERROR] This is an intentional error");
});
- 在
/server.js中包含 cwlogs,并修改中间件函数:
var cwlogs = require('./lib/cwlogs');
app.use(function (err, req, res, next) {
cwlogs.logEvent(err.message);
cwlogs.putLogs();
res.status(err.status || 500);
res.send({
message: err.message,
error: {}
});
});
- 提交并部署更改,创建指标过滤器和警报,如前文所述。
6. 应用安全基础
在应用程序中实施一系列安全措施,包括为域名配置 SSL 证书,将用户与应用程序之间的敏感交互限制为 HTTPS,为应用程序用户实施安全登录,并将密码存储在数据库的加密字段中。
已经采取的安全措施包括:
- 访问凭证仅存储在 OpsWorks 中,而不在源代码中。
- 应用程序中的各种角色和用户仅被授予使用所需服务的权限。
- 数据库仅接受来自 OpsWorks 实例和本地 IP 地址的连接。
7. 使用 HTTPS
浏览器地址栏旁边的小锁图标表示与主机的连接是通过 HTTPS 而不是未加密的 HTTP 进行的。使用 HTTPS 与应用程序通信时,使用的是一种加密传输方法,由称为证书颁发机构的受信任第三方验证。
使用 HTTPS 的优势和操作如下:
- 优势 :使用 HTTPS 加密用户(客户端)与 CloudFront 之间以及 CloudFront 与负载均衡器之间的流量,确保数据在客户端和负载均衡器之间安全加密。应用程序将开始使用会话 cookie,将用户会话连接到通过负载均衡器的特定实例,并限制对实例的 HTTP 请求,仅接受来自 ELB 的请求,降低用户会话被劫持的风险。
- 操作 :为了支持 SSL,需要上传有效的 SSL 证书到 AWS,并重新配置 CloudWatch 和 ELB 服务。存储和验证 SSL 证书属于身份和访问管理的范畴,需要使用 AWS 命令行界面(CLI)将证书上传到 IAM。
8. SSL 证书生成
生成和签署域名的 SSL 证书是一个多步骤过程,需要使用一些命令行工具。虽然尽量在 AWS 控制台中进行操作,但此部分不可避免地依赖第三方工具。
以下是操作流程的 mermaid 流程图:
graph LR
A[开始] --> B[运行实例设置命令]
B --> C[查看 CloudWatch 日志]
C --> D[设置日志保留期]
D --> E[创建指标过滤器]
E --> F[创建警报]
F --> G[创建应用日志流]
G --> H[集成 cwlogs 到代码]
H --> I[异常处理]
I --> J[实施安全措施]
J --> K[使用 HTTPS]
K --> L[生成 SSL 证书]
L --> M[结束]
通过以上步骤,可以实现对应用程序的有效监控和安全保障,利用 AWS 提供的各种工具和功能,确保应用程序的稳定运行和数据安全。
应用监控与安全保障:AWS 实战指南
9. 安全责任分担
在使用 AWS 服务时,安全是一项共享责任。AWS 负责云的安全,而用户则负责云中的安全。
| 责任方 | 责任内容 |
|---|---|
| AWS | 当 SSL 协议中发现漏洞时,AWS 会迅速部署所需的补丁,并通过电子邮件通知其客户。AWS 维护着许多安全相关的组件,如 SSL 证书的管理等。用户可参考 AWS 共享安全模型 获取更多信息。 |
| 用户 | 用户需要遵循 AWS 推荐的安全最佳实践,例如限制 IAM 角色和用户仅拥有所需的权限,尽量减少访问密钥和凭证暴露的风险。 |
需要注意的是,EC2 实例和负载均衡器之间的通信目前没有额外的加密层,这种额外的加密层即后端认证,超出了初学者书籍的范围。如果用户有特定的安全合规标准,应彻底审查相关协议。
10. 上传 SSL 证书到 AWS
由于我们要为自己的域名提供内容服务,所以必须将有效的 SSL 证书上传到 AWS。并且由于请求首先会通过 CloudWatch 和 ELB,支持 SSL 需要重新配置这两个服务。具体操作步骤如下:
1. 准备证书 :确保已经生成并签署了有效的 SSL 证书。
2. 使用 AWS CLI :使用 AWS 命令行界面(CLI)将证书上传到 IAM。虽然 IAM 中没有专门的 SSL 证书选项卡,但可以通过 CLI 完成上传操作。具体的 CLI 命令可以参考 AWS 官方文档,这里简单示例一个可能的命令结构(实际使用时需根据具体情况修改参数):
aws iam upload-server-certificate \
--server-certificate-name YourCertificateName \
--certificate-body file://path/to/your/certificate.crt \
--private-key file://path/to/your/private.key \
--certificate-chain file://path/to/your/chain.crt
- 重新配置服务 :上传证书后,需要重新配置 CloudWatch 和 ELB 服务以支持 SSL。具体的配置步骤可以在 AWS 控制台中找到相应的服务设置选项进行操作。
11. 总结与展望
通过以上一系列的操作,我们实现了对应用程序的监控和安全保障。从监控方面来看,我们可以通过 CloudWatch 对应用程序的日志进行查看、管理和分析,设置日志保留期、创建指标过滤器和警报等,及时发现应用程序中的异常情况。在安全方面,我们采取了多种措施,包括使用 HTTPS 加密通信、上传 SSL 证书、实施安全登录等,确保用户与应用程序之间的交互安全。
未来,我们还可以进一步优化这些设置。例如,在监控方面,可以根据不同的业务需求创建更多的指标过滤器和警报,对应用程序的性能进行更细致的监控;在安全方面,可以考虑进一步加强后端认证,提高数据传输的安全性。也可以根据实际情况,将不同类型的信息存储在不同的日志流中,使日志管理更加清晰和有序。
以下是整个操作过程的关键步骤总结表格:
| 操作类型 | 操作步骤 |
| ---- | ---- |
| 应用监控 | 1. 在运行实例上触发设置命令;2. 查看 CloudWatch 日志;3. 设置日志保留期;4. 创建指标过滤器;5. 创建警报;6. 创建应用日志流;7. 集成 cwlogs 到代码;8. 异常处理 |
| 应用安全 | 1. 实施安全措施;2. 使用 HTTPS;3. 生成 SSL 证书;4. 上传 SSL 证书到 AWS;5. 重新配置服务 |
通过遵循这些步骤和最佳实践,我们可以更好地利用 AWS 提供的功能,保障应用程序的稳定运行和数据安全。
graph LR
A[开始监控与安全设置] --> B[监控设置]
B --> B1[实例设置]
B --> B2[日志查看与管理]
B --> B3[指标与警报创建]
B --> B4[日志流管理]
A --> C[安全设置]
C --> C1[安全措施实施]
C --> C2[HTTPS 使用]
C --> C3[证书生成与上传]
C --> C4[服务重新配置]
B4 --> D[代码集成与异常处理]
C4 --> E[完成设置,持续优化]
通过以上的监控和安全设置,我们可以构建一个稳定、安全的应用程序环境,为用户提供更好的服务体验。
超级会员免费看
425

被折叠的 条评论
为什么被折叠?



