繁体   English   中英

在 EC2 AWS 中使用 UFW 将自己锁定在 SSH 之外

[英]Locked myself out of SSH with UFW in EC2 AWS

我有一个带有 Ubuntu 的 EC2 实例。我使用了sudo ufw enable ,之后只允许 mongodb 端口

sudo ufw allow 27017

当 ssh 连接中断时,我无法重新连接

# 更新

最简单的方法是更新实例的用户数据

  • 停止您的实例

  • 在实例上右键单击 (windows) 或 ctrl + 单击 (Mac) 以打开上下文菜单,然后转到Instance Settings -> Edit User Data或选择实例并转到Actions -> Instance Settings -> Edit User Data

    如果您仍然在旧的 AWS 控制台上,请选择实例,转到Actions -> Instance Settings -> View/Change User Data

并粘贴这个

Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0
--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"
#cloud-config
cloud_final_modules:
- [scripts-user, always]
--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"
#!/bin/bash
ufw disable
iptables -L
iptables -F
--//
  • 添加后,重新启动实例,ssh 应该可以工作。 如果启用,userdata 将禁用 ufw,并且还会刷新任何阻止 ssh 访问的 iptable 规则

来源在这里

# 旧答案

使用另一个实例分离并修复问题实例的体积

  • 启动一个新实例(恢复实例)。

  • 停止原始实例(不要终止)

  • 从原始实例中分离卷(问题卷)

  • 将其作为 /dev/sdf 附加到恢复实例。

  • 通过 ssh/putty 登录到恢复实例

  • 运行sudo lsblk以显示附加的卷并确认问题卷的名称。 它通常以/dev/xvdf 我的是/dev/xvdf1

  • 挂载问题卷。

     $ sudo mount /dev/xvdf1 /mnt $ cd /mnt/etc/ufw
  • 打开ufw配置文件

     $ sudo vim ufw.conf
  • 按 i 编辑文件。

  • ENABLED=yes更改为ENABLED=no

  • 键入 Ctrl-C 并键入 :wq 以保存文件。

  • 使用以下命令显示 ufw conf 文件的内容并确保ENABLED=yes已更改为ENABLED=no

     $ sudo cat ufw.conf
  • 卸载卷

     $ cd ~ $ sudo umount /mnt
  • 从恢复实例中分离问题卷,并将其作为 /dev/sda1 重新附加到原始实例。

  • 启动原始实例,您应该能够重新登录。

来源: 这里

我有同样的问题,发现这个步骤有效:

1-停止您的实例

2- 转到Instance Settings -> View/Change user Data

更新:新 AWS 控制台 UI 上的路径

右键单击已Stopped实例 -> Instance Settings -> Edit User Data

3- 将此粘贴到选项将Modify user data as text并保存

Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0
--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"
#cloud-config
cloud_final_modules:
- [scripts-user, always]
--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"
#!/bin/bash
ufw disable
iptables -L
iptables -F
--//

4- 启动您的实例

希望它对你有用!

  • 启动另一个 EC2 服务器实例 实现此目的的最佳方法是使用 EC2 的“Launch More Like This”功能。 这将确保操作系统类型、安全组和其他属性相同,从而节省一些设置时间。
  • 停止问题实例
  • 从问题实例中分离卷
  • 将卷附加到新实例

注意:较新的 Linux 内核可能会在内部通过 /dev/xvdp 将您的设备重命名为 /dev/xvdf,即使输入的设备名称是 /dev/sdf 到 /dev/sdp。

  • 挂载卷
cd ~ mkdir lnx1 sudo mount /dev/xvdf ./lnx1
  • 禁用 UFW
 cd lnx1 sudo vim ufw.conf

现在找到 ENABLED=yes 并将其更改为 ENABLED=no。

  • 分离卷

请务必先卸载卷:

sudo umount ./lnx1/
  • 将卷重新附加到我们问题实例上的 /dev/sda1
  • 启动问题实例
  • 必要时重新分配弹性 IP 地址
  • 删除临时实例及其关联卷

你好 !! 你很好去。

其他方法对我不起作用。 我的 EC2 实例基于 Bitnami 映像。 由于市场锁定,无法将卷附加到另一个实例。

因此,请停止问题实例并将此脚本粘贴到 instanceSettings > view-change user data 中。

这种方法不需要分离卷,因此与其他方法相比更直接。


Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0
--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"
#cloud-config
cloud_final_modules:
- [scripts-user, always]
--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"
#!/bin/bash
ufw disable
iptables -L
iptables -F
--//

在粘贴之前必须停止实例,在此之后启动您的实例,您应该能够 ssh。

我知道这是一个老问题,但我通过使用bootcmd在查看/更改用户数据中添加一个命令来修复我的问题

我首先停止了我的实例

然后我在用户数据中添加了这个

#cloud-config
bootcmd:
 - cloud-init-per always fix_broken_ufw_1 sh -xc "/usr/sbin/service ufw stop >> /var/tmp/svc_$INSTANCE_ID 2>&1 || true" 
 - cloud-init-per always fix_broken_ufw_2 sh -xc "/usr/sbin/ufw disable>> /var/tmp/ufw_$INSTANCE_ID 2>&1 || true"

#注意:我的实例是 Ubuntu

这是用户数据脚本的扩展版本

Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"

#cloud-config
cloud_final_modules:
- [scripts-user, always]

--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"

#!/bin/bash
set -x
USERNAME="ubuntu"
ls -Al
ls -Al /home
ls -Al /home/${USERNAME}
ls -Al /home/${USERNAME}/.ssh
sudo cat /home/${USERNAME}/.ssh/authorized_keys
ls -Al /etc/ssh
ls -ld /etc/ssh

sudo grep -vE '^$|^#' /etc/hosts.*
sudo sed -i -e 's/^\([^#].*\)/# \1/g' /etc/hosts.deny
sudo sed -i -e 's/^\([^#].*\)/# \1/g' /etc/hosts.allow
sudo grep -vE '^$|^#' /etc/hosts.*
sed '/^$\|^#/d' /etc/ssh/sshd_config

chown -v root:root /home
chmod -v 755 /home
chown -v ${USERNAME}:${USERNAME} /home/${USERNAME} -R
chmod -v 700 /home/${USERNAME}
chmod -v 700 /home/${USERNAME}/.ssh
chmod -v 600 /home/${USERNAME}/.ssh/authorized_keys

sudo tail /var/log/auth.log
sudo ufw status numbered
sudo ufw disable
sudo iptables -F
sudo service iptables stop
sudo service sshd restart
sudo service sshd status -l
--//

在苦苦挣扎了 2 天后,我发现几乎没有简单的替代方案,这里是那些:

  • 使用 AWS session 管理器连接而无需 ssh( yt 教程
  • 使用 EC2 串行控制台

使用这些方法中的任何一种进入机器,稍后您可以更改 ufw 或 ssh 键...等

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM