作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.
维姆Paliwal的头像

维姆Paliwal

拥有计算机安全硕士学位的认证AWS专家, Vimal专注于使用Terraform实现云的自动化, Kubernetes, 和Python.

专业知识

以前在

麦肯锡 & 公司
分享

在Linux上设置自定义工具或脚本来保存SSH日志可能很繁琐,而且容易出错.

工程师可以使用 rootsh, 屏幕, 或其他实用程序记录用户活动,但如果用户权限设置不正确, 熟练的用户可以擦除审计日志以掩盖其踪迹. 另一种选择是在内核级别设置日志记录, 但这方面所需的专业知识并不常见.

值得庆幸的是,有一种方法可以记录用户活动,而无需编写任何内容 Linux command! 我们需要这些服务:

让我们看看如何设置它们.

EC2和我

启动EC2实例通常相当容易, 但是在启动期间必须完成一个关键任务:我们需要将我角色附加到实例, 否则,我们将无法实现本文末尾详述的预期结果.

我们与EC2实例关联的我角色必须具有内置的 AmazonSSMManagedInstanceCore 政策,加上本政策(作为内联或客户管理的附件):

{
    “版本”:“2012-10-17”,
    “声明”:[
        {
            “行动”(
                “日志:CreateLogStream”,
                “日志:DescribeLogStreams”,
                “日志:DescribeLogGroups”,
                “日志:PutLogEvents”
            ],
            “效应”:“允许”,
            “资源”:“*”
        }
    ]
}

除了我角色,我们通常使用以下EC2实例配置:

  • OS 是Amazon Linux 2,因为默认情况下它安装了AWS系统管理器代理(SSM代理). (Ubuntu发行版也是一个选择.)
  • 实例类型 是t3.微型(但任何类型都可以).
  • 默认的 安全组 AWS分配给VPC的SSH端口将正常工作,因为我们不需要在此练习中打开SSH端口.

我们可以开始设置公里,而不必等待EC2实例启动.

公里

我们需要一个公里密钥,如果我们想要传递给CloudWatch的所有会话日志被加密存储. 让我们转到公里服务并创建一个密钥.

带有面包屑的AWS截图“公里,”“客户管理的密钥,和“创建密钥。,当前在步骤1:“配置密钥。.“密钥类型”可设置为“对称”(已选)或“非对称”.在“高级选项”下,,可设置“关键材料来源”为“公里”(已选), “外部,或“自定义密钥存储(CloudHSM)”。."
步骤1:选择对称密钥类型.

有相同面包屑的AWS的截图,现在在步骤2:“添加标签.别名字段设置为“cwlg”,可选的Description字段为空, 可选的标签字段没有添加任何标签.
步骤2:命名我们的密钥.

具有相同面包屑的AWS的屏幕截图,现在处于步骤3:“定义关键管理权限.第一个领域, “关键管理人员,有一个空白的搜索框,包含10行结果(第1页,共3页),列为Name, 路径, 和类型. 只有第一行(具有各自的列值“admin”)," "/,和“User”)对应的复选框被选中. 另一个领域, ”键删除,只有一个选择, "允许密钥管理员删除此密钥,“它的复选框也被选中了.
步骤3(可选):分配管理员.

我们建议分配一名管理员,这样密钥就可以由AWS帐户根用户以外的用户管理, 但如果其他人不需要访问, 我们可以跳过步骤3.

这里我们选择我用户“admin”作为密钥管理员,但我们可以自由选择任何用户或角色. 我们还可以选择禁用管理员的密钥删除权限.

具有相同面包屑的AWS的屏幕截图,现在处于步骤4:“定义密钥使用权限.第一个领域, “这个账户,的搜索结果与步骤3中相同, 但是没有一个被检查过. 另一个字段“其他AWS账户”没有添加任何内容.
步骤4:跳过用户分配页面.

我们不会为这个密钥分配任何用户,因为我们希望这个密钥仅由CloudWatch日志服务用于SSH日志加密和解密操作.

带有相同面包屑的AWS截图,现在是步骤5:“查看.第一个领域, “关键配置,将“密钥类型”列出为“对称”,,将“Key spec”设置为“SYMMETRIC_DEFAULT”,,将“密钥用法”改为“加密和解密”,,“Origin”为“AWS_公里”.下一个字段“别名和描述”列出了一个别名“cwlg”,没有描述. 下一个字段“标签”不显示任何数据. 最后一个字段“Key policy”包括一个预先填充了JSON格式策略的文本框.
步骤5:检查我们的配置并交换默认密钥策略.

在评论页面, 我们需要更改kms生成的密钥策略,因为它不包括CloudWatch日志使用密钥的权限. 我们将用这个政策来代替它:

{
    “版本”:“2012-10-17”,
    “声明”:[
        {
            "Sid": "启用我用户权限",
            “效应”:“允许”,
            “主要”:{
                :“AWS攻击:AWS:我::ACCOUNT_ID:根”
            },
            “行动”:“公里:*”,
            “资源”:“*”
        },
        {
            "Sid": "允许密钥管理员访问",
            “效应”:“允许”,
            “主要”:{
                :“AWS攻击:AWS:我::ACCOUNT_ID:用户/用户名”
            },
            “行动”(
                “公里:创建*”,
                公里:描述*”,
                公里:启用*”,
                公里:*”列表,
                公里:*”,
                公里:更新*”,
                “公里:撤销*”,
                公里:禁用*”,
                公里:*”,
                公里:删除*”,
                公里:TagResource”,
                公里:UntagResource”,
                公里:ScheduleKeyDeletion”,
                “公里:CancelKeyDeletion”
            ],
            “资源”:“*”
        },
        {
            “Sid”:“允许访问CloudWatch日志”,
            “效应”:“允许”,
            “主要”:{
                “服务”:“日志.地区.amazonaws.com”
            },
            “行动”(
                公里:加密”,
                公里:解密”,
                “公里:ReEncrypt *”,
                “公里:GenerateDataKey *”,
                “公里:DescribeKey”
            ],
            “资源”:“*”,
            "条件":{
                " ArnLike ": {
                    公里:EncryptionContext: aws:日志:攻击”:“在攻击:aws:日志:地区:ACCOUNT_ID: *”
                }
            }
        }
    ]
}

确保替换所有占位符:

  • ACCOUNT_ID 成为我们的AWS账户ID.
  • 用户名 为步骤3中选择的管理员用户名. 如果我们选择退出这一步,这里我们删除第二个语句块(带有 "Sid": "允许密钥管理员访问").
  • 地区 成为我们将服务部署到(e)的区域标识码.g., us-west-1).

有了这些,公里准备好了.

CloudWatch日志组

接下来,我们需要一个CloudWatch日志组(和/或S3桶-见下文),SSM代理可以发送SSH会话日志. 我们来创建它.

带有面包屑的AWS截图“CloudWatch”,“CloudWatch日志。,日志组,和“创建日志组”.没有多步骤侧边栏. 第一个字段, 日志组详细信息,有三个子字段:“日志组名称”(设置为“ssm-session-demo”), “保留设置”(从下拉菜单中设置为“永不过期”), 和"公里密钥ARN -可选"(设置为以" ARN:aws: 公里 "开头的截断值). 第二个字段“标签”没有任何标记.
创建CloudWatch日志日志组.

注意公里密钥ARN字段:在公里部分的步骤5中创建密钥之后,AWS为我们提供了这里所需的值.

(如果我们之前没有将正确的策略关联到公里密钥, 允许CloudWatch日志服务使用该密钥, 此时,我们将收到一个与公里键相关的错误.)

SSH日志存储到S3桶

用于使用S3存储活动日志,而不是cloudwatch日志, 我们需要将这些权限作为一个单独的策略添加到EC2实例配置文件中(或者手动将它们与我们可能需要关联的其他权限组合在一起):

{
    “版本”:“2012-10-17”,
    “声明”:[
        {
            “效应”:“允许”,
            “行动”(
                “s3: propertynames”
            ],
            “资源”:“在攻击:aws: s3::: BUCKET_NAME / *”
        },
        {
            “效应”:“允许”,
            “行动”(
                “s3: GetEncryptionConfiguration”
            ],
            “资源”:“*”
        },
        {
            “效应”:“允许”,
            “行动”:“公里:GenerateDataKey”,
            “资源”:“*”
        }
    ]
}

在上面的代码片段中,一定要替换 BUCKET_NAME 占位符.

现在我们已经设置了存储日志的地方——cloudwatch日志, S3桶, 或者两者都有——我们已经准备好进入SSH会话了.

AWS系统经理会话管理器

这是最后一个关键步骤, 我们在哪里配置对Linux机器的安全访问,以便进行SSH会话监控和日志记录. 我们将从会话管理器仪表板开始.

带有部分的AWS会话管理器仪表板的屏幕截图, 它是如何工作的?,“为什么要使用会话管理器??,“开始”,“更多资源”,以及右上角的“开始会话”.后一部分有一个橙色的“开始会话”按钮和一个白色的“配置首选项”按钮.
步骤1:开始使用仪表板.

在仪表盘上, 单击右上角“启动会话”框中的白色“配置首选项”按钮以启用会话记录.

在Preferences页面上, 我们会找到很多可以探索的部分, 但我们的重点是将SSH会话日志流式传输到CloudWatch或S3,以便我们快速查看Linux机器内发生的事情.

一个名为“CloudWatch日志”的AWS部分的截图.它的第一个设置,也称为“CloudWatch日志记录”,有一个标记为“启用”的复选框. 下一个场景, 选择您喜欢的日志记录选项,选项中选择了“流会话日志(推荐)”,而不是“上传会话日志”.下一个场景, “执行加密,有一个标记为“只允许加密的CloudWatch日志组”的复选框被选中. 最后的设定, CloudWatch日志组,将“在文本框中输入日志组”改为“从列表中选择日志组名称”.下面是一个列表,“CloudWatch日志组”,选择“ssm-session-demo”. 有对应的“加密”列(设置为“加密”), “过期事件”(设置为“永不过期”), “度量过滤器”(设置为0), “存储字节”(设置为0), 和“创建时间”时间戳.
步骤2a:启用CloudWatch日志记录.

就在“CloudWatch日志”一节之后, 有一个“S3日志”部分,我们可以在其中选择存储桶.

标题为“S3日志记录”的AWS部分的屏幕截图.它的第一个设置“将会话日志发送到S3”有一个标记为“启用”的复选框. 下一个场景, “执行加密,有一个标记为“只允许加密S3桶”的复选框被选中. 下一个场景, 选择S3桶,将“在文本框中输入桶名”改为“从列表中选择桶名”.在其下方,从下拉列表中选择“ssm-session-demo”. 最后一个字段“S3密钥前缀-可选”为空.
步骤2b:启用S3日志记录.

配置SSH日志记录后, 我们可以SSH到我们的Linux机器并执行一些命令来查看活动是否被捕获.

那么,让我们开始一个会话. 在同一页面上,我们会发现一个“会话”选项卡,我们可以开始一个会话. 点击“启动会话”按钮将会给我们一个可以启动会话的EC2机器列表:

AWS系统管理器、会话管理器和启动会话的屏幕截图. “Target instances”搜索框没有填写查询,只有一个结果, “实例名称”设置为“SSM Demo”."
步骤3:选择要启动SSH会话的EC2实例.

如果我们没有在列表中看到EC2 Linux实例, 我们应该检查它是否处于运行状态,并且具有我们之前描述的与它关联的我权限.

处理SSM代理“不支持流日志”错误

如果我们收到一个错误,说我们的EC2机器上安装的SSM代理版本不支持流式CloudWatch日志, 别担心. 有一个无痛的方法可以解决这个问题.

AWS错误信息的截图,红色背景上有白色文字. 留言旁边有一个圈起来的X, "的 SSM Agent version installed on this instance doesn't support streaming logs to CloudWatch. 将SSM Agent更新到最新版本, 或者在您的首选项中禁用流日志选项."
潜在的“过时的SSM代理版本”错误.

要更新SSM代理,我们需要导航到 运行命令 在左边的面板 AWS系统经理 服务.

带有部分的AWS系统经理 运行命令仪表板的屏幕截图, 它是如何工作的?,“功能和好处。,“用例和博客文章。,”“文档,在右上角, 管理您的实例.该部分只包含一个橙色的“运行命令”按钮.
步骤1:从“运行命令”仪表板开始.

一旦我们到了那里, 我们可以点击橙色的“运行命令”按钮, 指向一个新的页面,我们可以在那里填写一些参数.

AWS系统管理器、运行命令和运行命令的屏幕截图. 标签为“命令文档”的搜索框列出了10行(第4页超过5行), 其中一个名为“aws - updatessmanagement”. 它的“所有者”栏中有“亚马逊”,“平台类型”栏中有“Windows, Linux”. 底部的字段“文档版本”从下拉列表中选择了“1(默认)”.
步骤2:选择命令文档.

我们从选择开始 AWS-UpdateSSMAgent 从列表中.

标题为“目标”的AWS部分的屏幕截图.第一个领域, 也叫“目标”,指定实例标签,“手动选择实例”(已选中), 和“选择资源组”.底部是一个没有查询的“实例”搜索框, 唯一的结果是, “导弹演示,“检查. 该行中对应的实例ID被复制到“Instances”上方带有X的方框中.
步骤3:选择具有需要更新的SSM代理的EC2实例.

一旦选中,我们将向下滚动,直到看到“Targets”部分. 在这里,我们需要选择要在其上更新SSM代理的EC2实例, 然后点击“运行”按钮. 这将把我们送到一个页面,在那里我们可以监控更新的进度.

带有面包屑的AWS截图“AWS系统管理器”,"执行命令,和“命令ID”(后面跟着GUID)。. 第一部分, “命令状态,显示成功指标, 下一节的唯一一行也是如此, “目标和产出”,,它列出了之前的单个实例. 底部还有两个未展开的部分,“命令描述”和“命令参数”."
步骤4:监控更新进度.

代理更新不会超过5分钟. 一旦完成,我们应该能够在会话管理器中创建一个会话.

此时,我们应该启动了一个SSH会话.

终端上带有会话ID和实例ID的AWS的截图. 提示符是“sh-4”.2已输入“$”和“whoami”、“pwd”命令, 输出分别为“ssm-user”和“/usr/bin”.
通过AWS系统管理器会话管理器使用SSM代理的SSH会话.

执行一些命令后, 让我们导航到CloudWatch日志日志组(或S3存储桶), (未显示),并确认该活动正在被记录.

带有面包屑的AWS截图“CloudWatch”,“CloudWatch日志。,日志组,”“ssm-session-demo,和上一步的会话ID. 唯一的部分是一个搜索框, “日志事件,,每行都有时间戳和json格式的消息. 其中一个被展开,显示出它的JSON,打印得很漂亮,右边有一个标签为“复制”的白色按钮."
CloudWatch日志中正在记录SSH日志事件.

现在我们有了一个设置, 启用静态加密, 记录在我们的Linux机器上发出的每一个命令.

事实上, 每一个 命令可能比我们想要的要多:在会话期间提供或生成的任何秘密都将记录在CloudWatch或S3中,并且任何具有所需权限的人都可以看到. 为了防止这种情况,我们可以使用 stty -echo; read passwd; stty echo; 对于我们需要在会话期间提供的每个秘密.

一个伟大的SSM/SSH AWS日志解决方案与小警告

会话管理器是一个有用的工具,可以在不打开端口22的情况下远程访问AWS中的虚拟机. 事实上, 如果我们使用端口转发或直接SSH连接,我们就不能以这种方式生成SSH日志, 随着 会话管理器文档 笔记.

尽管如此, 将会话管理器与会话日志相结合是控制和监视虚拟机活动的一个健壮的解决方案. 此外,我们不收取使用会话管理器服务的费用. 我们只需要为我们的EC2实例和CloudWatch日志或存储日志的S3桶付费.

对于喜欢视频教程的读者,我已经详细介绍了一个非常相似的过程 在YouTube上.


了解基本知识

  • SSH可以用于什么?

    SSH (Secure Shell)用于即使在不安全的网络上也能安全地访问其他计算机, 由于客户端和服务器之间的通信是加密的. 它还用于通过SFTP协议向服务器传输文件或从服务器传输文件, 它在底层使用SSH. SSH在默认情况下监听端口22.

  • 我如何在SSH中看到活动会话?

    有多种方法可以找到活动的SSH会话,包括命令w、who和“ss”grep ssh”. 使用AWS系统管理器,可以在会话管理器控制台或通过终端中的“AWS ssm description -sessions -state Active”查看它们.
  • 什么是AWS监测日志?

    AWS监测日志是一个完全托管的日志聚合服务. 您可以查询、监控、过滤和触发条件告警.g.,当超过10%的HTTP请求接收到5xx错误码时. 此外,CloudWatch日志 Insights还以有用的条形图、线形图和堆叠面积图的形式呈现日志数据.

  • 什么是AWS我?

    AWS我负责对向AWS资源发出的请求进行身份验证和授权. 它同时支持RBAC和ABAC授权模型. 在RBAC中,权限是根据作业角色授予的. 在ABAC中,权限是基于属性e授予的.g.,根据标记为主体分配权限.

  • 什么是EC2实例?

    Amazon EC2(弹性计算云)允许开发人员在云中启动虚拟机. 本质上是高度可扩展的, EC2允许实例在几分钟内从1vCPU增加到20vcpu,反之亦然. 实例可以使用Intel、AMD或ARM处理器,并在Linux、Windows或macOS上运行工作负载.

  • EC2实例的用途是什么?

    EC2实例是云中的虚拟机, 用于运行工作负载,而无需管理底层硬件, 但仍然提供对计算资源的完全控制. EC2提供了广泛的处理器, OSs, 以及用于运行从小型web应用程序到大型SAP HANA数据库的存储空间.

聘请Toptal这方面的专家.
现在雇佣
维姆Paliwal的头像
维姆Paliwal

位于 英国伦敦

成员自 2020年4月27日

作者简介

拥有计算机安全硕士学位的认证AWS专家, Vimal专注于使用Terraform实现云的自动化, Kubernetes, 和Python.

Toptal作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.

专业知识

以前在

麦肯锡 & 公司

世界级的文章,每周发一次.

订阅意味着同意我们的 隐私政策

世界级的文章,每周发一次.

订阅意味着同意我们的 隐私政策

Toptal开发者

加入总冠军® 社区.