SSH访问管理 - 用Vault OTP引擎控制SSH访问(第1部分)

472 阅读4分钟

SSH访问管理 - 用Vault OTP引擎控制SSH访问(第一部分)

在这个博客系列中,你将了解到SSH访问管理所涉及的问题,以及如何使用Hashicorp的Vault和Bastion服务器在不影响组织安全和合规性的情况下解决这个问题。

SSH访问管理是当今DevOps世界中的一个已知问题。为你的团队按需创建访问权限,然后确保在他们完成任务后撤销访问权限,这是一项繁琐的工作。为了简化这项工作,你最终会在公共子网中创建你的应用工作负载(服务器),共享pem文件或将用户的公钥复制到工作负载本身。因此,你的关键应用程序或用户数据有可能暴露在世界面前。

让我们来谈谈房间里的大象

一般来说,你会通过Bastion/jump服务器为你的用户提供对应用工作负载的访问,并将我们所有的工作负载保存在一个私人子网中,不被世界其他地方发现。通过这样做,你可以限制外部用户和攻击者对你的工作负载的访问,但你仍然需要照顾到你的组织的内部用户的访问和审计能力。

控制对堡垒服务器的访问和记录访问请求以进行审计,对你的组织的安全和合规目标至关重要。有多个机构的软件包可以帮助你实现这一目标,Hashicorp的Vault就是这样一个机构。Vault帮助你控制对堡垒服务器的访问,并提供访问请求的审计日志。

实施

Vault SSH Engine Image

我们将使用两个EC2实例,一个用于设置Vault服务器,另一个作为公共子网的堡垒服务器。用户将通过Vault CLI与Vault服务器交互,获取OTP(一次性密码),然后使用OTP作为密码SSH到堡垒服务器。

该实施方案包括4个步骤

设置Vault服务器

让我们首先在EC2实例上设置Vault服务器。我们将使用Ubuntu AMI来启动EC2实例。

  1. 下载并安装Vault服务器

    # Download Vault binary based on the version, replace ${VAULT_VERSION} with required version below
    $ wget https://releases.hashicorp.com/vault/${VAULT_VERSION}/vault_${VAULT_VERSION}_linux_amd64.zip -O vault.zip
    
    # Unzip the Vault zip file
    $ unzip vault.zip
    
    # Make Vault executable and accessible
    $ chmod +x vault
    $ sudo mv vault /usr/local/bin/vault
    
    # Set Linux capability flag on the binary, this will let the binary do memory locking without granting unnecessary #privileges
    $ sudo setcap cap_ipc_lock=+ep /usr/local/bin/vault
    
    # To check if vault is installed
    $ vault --version
    vault v1.3.1
    
    # To install command line completion
    $ vault -autocomplete-install
    
    # Create a vault system user
    sudo useradd --system --home /etc/vault.d --shell /bin/false vault
    
    # Create vault service file
    sudo touch /etc/systemd/system/vault.service
    
    # Update /etc/systemd/system/vault.service with below content
    [Unit]
    Description="HashiCorp Vault - A tool for managing secrets"
    Documentation=https://www.vaultproject.io/docs/
    Requires=network-online.target
    After=network-online.target
    ConditionFileNotEmpty=/etc/vault.d/vault.hcl
    StartLimitIntervalSec=60
    StartLimitBurst=3
    
    [Service]
    User=vault
    Group=vault
    ProtectSystem=full
    ProtectHome=read-only
    PrivateTmp=yes
    PrivateDevices=yes
    SecureBits=keep-caps
    AmbientCapabilities=CAP_IPC_LOCK
    Capabilities=CAP_IPC_LOCK+ep
    CapabilityBoundingSet=CAP_SYSLOG CAP_IPC_LOCK
    NoNewPrivileges=yes
    ExecStart=/usr/local/bin/vault server -config=/etc/vault.d/vault.hcl
    ExecReload=/bin/kill --signal HUP $MAINPID
    KillMode=process
    KillSignal=SIGINT
    Restart=on-failure
    RestartSec=5
    TimeoutStopSec=30
    StartLimitInterval=60
    StartLimitIntervalSec=60
    StartLimitBurst=3
    LimitNOFILE=65536
    LimitMEMLOCK=infinity
    
    [Install]
    WantedBy=multi-user.target
    
  2. 设置Vault服务器

    vault 用户提供访问权限/etc/vault.d

    sudo mkdir /etc/vault.d
    sudo touch /etc/vault.d/vault.hcl
    sudo chown --recursive vault:vault /etc/vault.d
    sudo chmod 640 /etc/vault.d/vault.hcl
    

    Vault以加密的形式将数据存储在其存储器中。Vault支持多种类型的存储。我们将使用Filesystem 作为演示的存储。不过在生产服务器上,建议使用一个高可用的键值存储,如etcd、Consul等。让我们用下面的值更新文件/etc/vault.d/vault.hcl

    storage "file" {
      path = "/mnt/vault/data"
    }
    
    listener "tcp" {
     address     = "0.0.0.0:8200"
     tls_disable = 1
    }
    
    ui = true
    log_level = "Info"
    

    提供vault 用户权限到/mnt/vault 目录

    # Create /mnt/vault
    $ sudo mkdir /mnt/vault
    
    # Give vault permission to the directory
    $ sudo chown -R vault:vault /mnt/vault
    
  3. 初始化Vault服务器

    Vault服务器总是在密封状态下启动,其存储中的数据是以加密格式存储的。Vault被配置为知道如何访问物理存储和它的位置,但不知道如何解密其中的任何内容。解封是构建读取解密密钥以解密数据所需的主密钥的过程。

    当你第一次初始化Vault时,你会得到一组5个密钥。要解开Vault的封印,你至少需要其中的3把。你还将获得一个根令牌,以后将用于登录保险库并创建所需的用户、组和策略。创建主密钥的数量和解封密钥的阈值是可配置的,它们默认被设置为5和3。

    每次保险库被重新启动,或者如果底层EC2实例被重新启动,保险库就会回到密封状态,必须使用初始化步骤中提供的5个密钥中的至少3个来解锁。为了避免这种手动操作,你可以使用AWS KMS来自动解封保险库。(我们将很快写一篇关于这个的详细博客)

    现在让我们来初始化金库服务器,这些钥匙和令牌在初始化时只显示一次,所以要把它们放在安全的地方。如果你丢失了钥匙,你以后就无法解封金库了。

    # Now start the vault server as a service
    $ sudo systemctl enable vault # Enable vault to start automatically when the system boots up
    $ sudo systemctl start vault
    $ sudo systemctl status vault
    
    # Initialise the Vault server this will return root token and 5 keys used to unseal
    $ export VAULT_ADDR="http://127.0.0.1:8200"
    $ vault operator init >> ~/vault.keys
    
    Initial Root Token: s.######
    
    Unseal Key 1: key1###
    Unseal Key 2: key2###
    Unseal Key 3: key3###
    Unseal Key 4: key4###
    Unseal Key 5: key5###
    
    

    现在金库服务器的设置已经完成,可以使用了。

在金库上启用SSH OTP引擎

现在金库服务器已被初始化,我们可以通过http://{{VaultEC2PublicIP}}:8200 来访问它。让我们继续前进,在Vault上启用SSH OTP引擎。按照下面的步骤来完成同样的工作。

  • 使用初始化时获得的根令牌登录到保险库:

Vault SSH Engine Image

  • 点击启用引擎,以启用SSH引擎

Vault SSH Engine Image

  • 选择SSH引擎,继续前进

Vault SSH Engine Image

  • 用任何名字创建一个角色,但选择OTP作为类型:

Vault SSH Engine Image

一旦这个步骤完成,你现在就有了启用SSH OTP引擎的Vault服务器,可以使用。

下一步是什么?

正如前面所讨论的,实施包括4个步骤,我们在这篇博客中只介绍了这4个步骤中的两个。本博客系列的第二部分将涵盖:

  • 如何设置堡垒主机与Vault服务器上启用的SSH OTP引擎通信?
  • 用户如何从Vault服务器上请求OTP?