如何使用 Cloud-Config 进行初始服务器设置

介绍

随着 DigitalOcean 元数据服务的引入,在您登录之前就可以开始配置服务器,简而言之,元数据服务是一个 HTTP 位置,您的服务器可以在启动过程中访问。

元数据的位置将包含有关服务器配置和环境的基本数据,如网络地址,主机名等在初始设置过程中,这些值可以由一个名为cloud-init的程序拉下来,以帮助配置必要的服务。

最强大的功能是,当您使用名为用户数据的字段创建服务器时,您可以将脚本传输给元数据服务,这将在初始启动过程中运行,并且非常灵活,允许您完成任何你可以脚本的操作。

传入的最常见的脚本类型称为cloud-config脚本. 这是一个YAML格式化文件,提供了通过声明设置常见配置项目的简单、可读的方法。

在本指南中,我们将通过尝试一个简单的例子来熟悉DigitalOcean元数据服务和‘cloud-config’文件。

目标

为了成功地复制 Ubuntu 14.04初始服务器设置指南中的步骤,我们的脚本将不得不完成一系列任务。

以下是上述指南完成的基本任务:

  • 更改 root 用户的密码
  • 创建新用户
  • 创建新用户的密码
  • 赋予新用户 root 特权
  • (可选) 更改 SSH daemon 收听的端口
  • (可选) 限制 root SSH 登录
  • (可选) 明确允许我们的新用户

改变目标以解决环境问题

对于用cloud-config文件创建的服务器,我们将不得不稍微修改我们的目标,通过cloud-config文件传输的任何信息都可供系统的任何用户在服务器的整个生命周期访问。

这引入了一些安全问题,重要的是要理解和解决。

  • 在您的云配置中传递的任何信息都可供系统上的每个用户访问。 不要将任何机密信息放入您的云配置文件中
  • 您可以为现有用户设置密码,但必须以简单的文本传输
  • 对于新用户,您可以传输密码的哈希版本,但这些哈希可以很容易地使用现代硬件破解

考虑到这些事情,我们的设置应该尽一切可能避免在云配置文件中以任何形式发出密码,我们可以调整我们的目标,以满足我们部署环境的具体需求。

我们的调整策略将看起来像这样:

通过Cloud-config设置无密码,不为 root 帐户提供 SSH 密钥(任何 SSH 密钥都添加,尽管 DigitalOcean 接口仍将像往常一样添加) *创建新用户 *为新用户帐户设置无密码 *为新用户帐户设置 SSH 访问 *给予新用户无密码的 sudo 特权进行管理更改 *(可选)更改 SSH 用户列表的端口 *(可选)限制 root SSH 登录(特别是如果您不通过 DigitalOcean 接口添加 SSH 密钥) *

除了删除两个帐户的密码之外,这里最 drastic 的变化是,新帐户将被允许使用sudo而无需输入帐户密码,这是必要的,因为我们不允许 root 登录,我们不为我们的新用户设置帐户密码。

在新用户登录后,他们将有自由安全地为自己设置密码,并修改sudo特权以要求密码,如果愿意。

考虑到这些调整的目标,让我们开始。

使用 Cloud-Config 文件

云配置文件基本上是一个理解某些指令的YAML文件,YAML是一个数据序列化格式,旨在非常易于人读,使其易于理解和编辑。

YAML 文件依赖于几个格式化规则:

  • 用白色空间的入口表示了项目的结构和相互关系。更入口的项目是第一个项目的子项目,其入口水平较低 *列表成员可以通过领先入口识别 *连接的数组条目是通过使用列(:)创建的,然后是空间和值 *文本块被入口。

cloud-config文件的第一行必须包含一个特殊的标识符,以便cloud-init程序知道该文件是cloud-config文件。

1#cloud-config

这必须单独放在第一行上,在创建服务器时必须提供cloud-config文件,这可以通过两种不同的方式完成。

请记住,该元数据服务仅在部署云 1.5 的区域提供,此外,用于消耗用户数据领域所需的云起始版本目前仅在 Ubuntu 14.04 和 CentOS 7 中提供,以及基于这些版本的应用程序图像。

通过控制面板界面,有一个可选的检查框来启用用户数据. 当您选择此时,会出现一个文本框,您可以粘贴您的‘cloud-config’文件:

DigitalOcean user data

如果您正在使用 API,在创建请求中传输的 JSON 对象可以使用名为user_data的字段,例如,您可以传输类似于此的 JSON 对象:

 1{
 2    "name": "test",
 3    "private_networking": true,
 4    "region": "nyc3",
 5    "size": "512mb",
 6    "image": "ubuntu-14-04-x64",
 7    "user_data":"#cloud-config
 8        config_data
 9        more_config"
10    "ssh_keys":[ 12345,56789 ]
11}

这两种方法在实践中完全相同,所以使用最方便的。

创建新用户帐户

我们需要做的第一件事是配置我们的新用户帐户。

根帐户默认没有密码,所以我们不必在那里启动任何密码。

创建新用户

为了创建一个新用户,我们使用用户指令. 这将包含我们想要创建的所有新帐户的列表. 因为我们只创建一个帐户,我们将有一个列表。

请记住,我们必须从第一个行开始我们的cloud-config文件,仅仅是#cloud-config

1#cloud-config
2users:
3  - name: demo

如果我们想添加额外的用户,我们可以这样做,将一个项目放置在下面,并与这个项目水平对齐,再次从一个插槽开始,如下:

1#cloud-config
2users:
3  - name: demo
4  - name: second_user

每个面板都表示一个单独的用户帐户,在其中我们可以添加用户的详细信息(我们会暂时这样做)。

添加授权密钥

为了在没有密码的情况下登录这个新帐户,我们需要提供一个或多个我们的SSH公共密钥,这些密钥将被添加到新用户在其主目录中的.ssh目录中的authorized_keys文件中。

这是通过ssh-authorized-keys指令实现的,这是一个用户条目的子项目,基本上这意味着我们将其与我们的名称指令一致,但不给它一个冲击,因为它不是一个新的用户条目的开始。

ssh-authorized-keys的输入实际上需要一个密钥列表,这允许您将多个SSH公共密钥添加到文件中,例如,如果您为笔记本电脑、桌面和工作时的计算机拥有一个SSH密钥对,您可以在ssh-authorized-keys列表中将所有这些密钥添加为单独的项目。

要获取本地计算机的公共密钥的内容,您可以键入:

1cat ~/.ssh/id_rsa.pub
1ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCv60WjxoM39LgPDbiW7ne3gu18q0NIVv0RE6rDLNal1quXZ3nqAlANpl5qmhDQ+GS/sOtygSG4/9aiOA4vXO54k1mHWL2irjuB9XbXr00+44vSd2q/vtXdGXhdSMTf4/XK17fjKSG/9y3yD6nml6q9XgQxx9Vf/IkaKdlK0hbC1ds0+8h83PTb9dF3L7hf3Ch/ghvj5++tWJFdFeG+VI7EDuKNA4zL8C5FdYYWFA88YAmM8ndjA5qCjZXIIeZvZ/z9Kpy6DL0QZ8T3NsxRKapEU3nyiIuEAmn8fbnosWcsovw0IS1Hz6HsjYo4bu/gA82LWt3sdRUBZ/7ZsVD3ELip [email protected]

然后,您可以将完整的内容粘贴为我们的ssh-authorized-keys条目。SSH公共密钥可以公开发布,因此这不构成安全风险:

1#cloud-config
2users:
3  - name: demo
4    ssh-authorized-keys:
5      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCv60WjxoM39LgPDbiW7ne3gu18q0NIVv0RE6rDLNal1quXZ3nqAlANpl5qmhDQ+GS/sOtygSG4/9aiOA4vXO54k1mHWL2irjuB9XbXr00+44vSd2q/vtXdGXhdSMTf4/XK17fjKSG/9y3yD6nml6q9XgQxx9Vf/IkaKdlK0hbC1ds0+8h83PTb9dF3L7hf3Ch/ghvj5++tWJFdFeG+VI7EDuKNA4zL8C5FdYYWFA88YAmM8ndjA5qCjZXIIeZvZ/z9Kpy6DL0QZ8T3NsxRKapEU3nyiIuEAmn8fbnosWcsovw0IS1Hz6HsjYo4bu/gA82LWt3sdRUBZ/7ZsVD3ELip [email protected]

如果您想添加额外的密钥,则可以通过添加另一个密钥,然后是第二个公共密钥来完成:

1#cloud-config
2users:
3  - name: demo
4    ssh-authorized-keys:
5      - key_one
6      - key_two

添加您想要使用的任何密钥来登录此帐户。

设置 Sudo 访问

再次重申,我们将配置无密码的sudo访问,因为由于安全限制,我们不会为此帐户设置密码。

为了配置访问,我们实际上会做两个单独的步骤。

首先,我们将创建我们想要使用的sudoers文件的条目,我们的更改实际上将被写入/etc/sudoers.d目录中的一个单独的文件中,该文件在解析时包含/etc/sudoers

我们需要创建的条目不需要包含用户名,因为cloud-init足够聪明,可以从输入信息中找出帐户名称。

对于我们的指南,由于我们正在配置无密码的sudo功能,它将看起来像这样:

1#cloud-config
2users:
3  - name: demo
4    ssh-authorized-keys:
5      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCv60WjxoM39LgPDbiW7ne3gu18q0NIVv0RE6rDLNal1quXZ3nqAlANpl5qmhDQ+GS/sOtygSG4/9aiOA4vXO54k1mHWL2irjuB9XbXr00+44vSd2q/vtXdGXhdSMTf4/XK17fjKSG/9y3yD6nml6q9XgQxx9Vf/IkaKdlK0hbC1ds0+8h83PTb9dF3L7hf3Ch/ghvj5++tWJFdFeG+VI7EDuKNA4zL8C5FdYYWFA88YAmM8ndjA5qCjZXIIeZvZ/z9Kpy6DL0QZ8T3NsxRKapEU3nyiIuEAmn8fbnosWcsovw0IS1Hz6HsjYo4bu/gA82LWt3sdRUBZ/7ZsVD3ELip [email protected]
6    sudo: ['ALL=(ALL) NOPASSWD:ALL']

这将创建一个名为90-cloud-init-users的 `/etc/sudoers.d’ 目录中的文件。

1demo ALL=(ALL) NOPASSWD:ALL

我们要做的第二件事是实际上将我们的用户添加到sudo组,这是不必要的,因为我们有一个专门用于我们新帐户的条目,它被sudo解析,但它给了我们更多的灵活性。

后来,我们可能想为我们的用户手动设置密码,并要求该密码用于sudo命令. 如果我们的用户已经在sudo组中,我们只需要设置密码并删除90-cloud-init-users文件中的条目。

要添加一个补充组,我们可以使用指令:

1#cloud-config
2users:
3  - name: demo
4    ssh-authorized-keys:
5      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCv60WjxoM39LgPDbiW7ne3gu18q0NIVv0RE6rDLNal1quXZ3nqAlANpl5qmhDQ+GS/sOtygSG4/9aiOA4vXO54k1mHWL2irjuB9XbXr00+44vSd2q/vtXdGXhdSMTf4/XK17fjKSG/9y3yD6nml6q9XgQxx9Vf/IkaKdlK0hbC1ds0+8h83PTb9dF3L7hf3Ch/ghvj5++tWJFdFeG+VI7EDuKNA4zL8C5FdYYWFA88YAmM8ndjA5qCjZXIIeZvZ/z9Kpy6DL0QZ8T3NsxRKapEU3nyiIuEAmn8fbnosWcsovw0IS1Hz6HsjYo4bu/gA82LWt3sdRUBZ/7ZsVD3ELip [email protected]
6    sudo: ['ALL=(ALL) NOPASSWD:ALL']
7    groups: sudo

这将使过渡到更传统的sudo设置更容易,我们将在本指南结束时向您展示如何做到这一点。

设置Shell环境

默认情况下,新创建的用户将其默认壳设置为非常基本的 /bin/sh shell。

这是一个比大多数人所习惯的更为模糊的环境,所以我们想为我们的新用户手动指定一个bash壳环境。

这可以通过在用户级别项目中的指令来实现,我们所需要做的就是将其指向bash可执行的完整路径:

1#cloud-config
2users:
3  - name: demo
4    ssh-authorized-keys:
5      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCv60WjxoM39LgPDbiW7ne3gu18q0NIVv0RE6rDLNal1quXZ3nqAlANpl5qmhDQ+GS/sOtygSG4/9aiOA4vXO54k1mHWL2irjuB9XbXr00+44vSd2q/vtXdGXhdSMTf4/XK17fjKSG/9y3yD6nml6q9XgQxx9Vf/IkaKdlK0hbC1ds0+8h83PTb9dF3L7hf3Ch/ghvj5++tWJFdFeG+VI7EDuKNA4zL8C5FdYYWFA88YAmM8ndjA5qCjZXIIeZvZ/z9Kpy6DL0QZ8T3NsxRKapEU3nyiIuEAmn8fbnosWcsovw0IS1Hz6HsjYo4bu/gA82LWt3sdRUBZ/7ZsVD3ELip [email protected]
6    sudo: ['ALL=(ALL) NOPASSWD:ALL']
7    groups: sudo
8    shell: /bin/bash

我们已经完成了我们的新用户配置,现在我们可以转到可选的步骤来锁定我们的SSH大门。

配置和锁定 SSH Daemon (可选)

接下来的步骤可能有助于增强安全性. 您可以按照您认为合适的方式实施任何或所有这些步骤. 查看我们正在自动化的指南,以获取有关这些选项的更多信息。

我们需要做的所有更改都将位于 /etc/ssh/sshd_config 文件中。

  • (可选) 更改 SSH DAEMON 聆听的端口
  • (可选) 限制 root SSH 登录(特别是如果您不通过 DigitalOcean 接口包含 SSH 密钥)
  • (可选) 明确允许我们的新用户

这些设置可以通过对 sshd_config 文件进行以下更改来实现:

  • 端口 4444
  • 允许RootLogin 无
  • 允许用户演示

有两种方法可以进行这些更改,第一种方法是通过在我们的云配置文件中提供整个配置文件来完全重写文件,第二种方法是使用常见的Linux文本工具来战略地进行更改。

这两者都有其优势,并在云配置中展示了不同的指令,我们将分别覆盖。

通过提供新配置文件来配置 SSH Daemon

我们想要的更改的第一个策略是用我们想要的内容完全重写文件。

这使我们能够完全控制文件,无论默认情况下有什么可用. 方法是直前的,很容易预测我们的行动的结果。

要在磁盘上写一个新文件,我们可以使用write_files指令,这是一个顶级的指令,所以它应该被放置在我们之前正在工作的用户部分之外。

我们提供了我们要写的文件的列表(再一次由每个项目的盘点表示)。

 1#cloud-config
 2users:
 3  - name: demo
 4    ssh-authorized-keys:
 5      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCv60WjxoM39LgPDbiW7ne3gu18q0NIVv0RE6rDLNal1quXZ3nqAlANpl5qmhDQ+GS/sOtygSG4/9aiOA4vXO54k1mHWL2irjuB9XbXr00+44vSd2q/vtXdGXhdSMTf4/XK17fjKSG/9y3yD6nml6q9XgQxx9Vf/IkaKdlK0hbC1ds0+8h83PTb9dF3L7hf3Ch/ghvj5++tWJFdFeG+VI7EDuKNA4zL8C5FdYYWFA88YAmM8ndjA5qCjZXIIeZvZ/z9Kpy6DL0QZ8T3NsxRKapEU3nyiIuEAmn8fbnosWcsovw0IS1Hz6HsjYo4bu/gA82LWt3sdRUBZ/7ZsVD3ELip [email protected]
 6    sudo: ['ALL=(ALL) NOPASSWD:ALL']
 7    groups: sudo
 8    shell: /bin/bash
 9write_files:
10  - item_one
11  - item_two

在我们的情况下,我们只会写一个文件. 对于每个文件,我们提供有关我们想要创建的 chanegs 的详细信息. 例如,您可以使用的参数是路径,内容,所有者,权限,甚至编码

默认情况下,使用这种方法创建的文件的所有者是 root,权限为644,这正是我们想要的,所以我们只需要提供pathcontent指令。

路径只是在文件系统中写入文件的位置。

对于内容,我们将想要提供文件的全部内容,以写为-是. 请记住,我们可以使用管道字符()通过一个文本块,以保持其格式化。

对于我们的 sshd_config 文件的内容,我们只会使用默认的内容,没有评论(为了简短),我们想要做的更改。

 1#cloud-config
 2users:
 3  - name: demo
 4    ssh-authorized-keys:
 5      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCv60WjxoM39LgPDbiW7ne3gu18q0NIVv0RE6rDLNal1quXZ3nqAlANpl5qmhDQ+GS/sOtygSG4/9aiOA4vXO54k1mHWL2irjuB9XbXr00+44vSd2q/vtXdGXhdSMTf4/XK17fjKSG/9y3yD6nml6q9XgQxx9Vf/IkaKdlK0hbC1ds0+8h83PTb9dF3L7hf3Ch/ghvj5++tWJFdFeG+VI7EDuKNA4zL8C5FdYYWFA88YAmM8ndjA5qCjZXIIeZvZ/z9Kpy6DL0QZ8T3NsxRKapEU3nyiIuEAmn8fbnosWcsovw0IS1Hz6HsjYo4bu/gA82LWt3sdRUBZ/7ZsVD3ELip [email protected]
 6    sudo: ['ALL=(ALL) NOPASSWD:ALL']
 7    groups: sudo
 8    shell: /bin/bash
 9write_files:
10  - path: /etc/ssh/sshd_config
11    content: |
12         Port 4444
13         Protocol 2
14         HostKey /etc/ssh/ssh_host_rsa_key
15         HostKey /etc/ssh/ssh_host_dsa_key
16         HostKey /etc/ssh/ssh_host_ecdsa_key
17         HostKey /etc/ssh/ssh_host_ed25519_key
18         UsePrivilegeSeparation yes
19         KeyRegenerationInterval 3600
20         ServerKeyBits 1024
21         SyslogFacility AUTH
22         LogLevel INFO
23         LoginGraceTime 120
24         PermitRootLogin no
25         StrictModes yes
26         RSAAuthentication yes
27         PubkeyAuthentication yes
28         IgnoreRhosts yes
29         RhostsRSAAuthentication no
30         HostbasedAuthentication no
31         PermitEmptyPasswords no
32         ChallengeResponseAuthentication no
33         X11Forwarding yes
34         X11DisplayOffset 10
35         PrintMotd no
36         PrintLastLog yes
37         TCPKeepAlive yes
38         AcceptEnv LANG LC_*
39         Subsystem sftp /usr/lib/openssh/sftp-server
40         UsePAM yes
41         AllowUsers demo         

这将完全取代 /etc/ssh/sshd_config 的内容,以我们提供的新内容. 这是 Ubuntu 的默认 sshd_config 文件,只修改了我们上面提到的项目。

这是对SSH大象进行更改的一种方法。

通过集中更改配置 SSH Daemon

我们可以通过集中编辑修改sshd_config文件的第二种方式,Linux系统配备了各种强大的文本操纵工具,我们可以利用这些工具来进行我们所需要的更改。

要运行任意命令,我们将使用名为runcmd的指令,允许我们在系统上运行任何命令. 每个命令将是指令下的列表项目. 这些可以作为代表整个命令的字符串,或作为命令和所有选项作为元素的数组。

我们将使用sed命令,该命令用于字符串替换,虽然您可以将多个操作传递给单个sed命令,但我们将为每个sed命令执行单个操作,这将使我们更容易地解决任何问题。

我们的第一个sed命令将更改配置倾听端口的行,我们将通过搜索以Port开头的行来识别这一点,我们将告诉sed用我们的Port 4444配置取代整个行(由常规表达式^.*$):

 1#cloud-config
 2users:
 3  - name: demo
 4    ssh-authorized-keys:
 5      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCv60WjxoM39LgPDbiW7ne3gu18q0NIVv0RE6rDLNal1quXZ3nqAlANpl5qmhDQ+GS/sOtygSG4/9aiOA4vXO54k1mHWL2irjuB9XbXr00+44vSd2q/vtXdGXhdSMTf4/XK17fjKSG/9y3yD6nml6q9XgQxx9Vf/IkaKdlK0hbC1ds0+8h83PTb9dF3L7hf3Ch/ghvj5++tWJFdFeG+VI7EDuKNA4zL8C5FdYYWFA88YAmM8ndjA5qCjZXIIeZvZ/z9Kpy6DL0QZ8T3NsxRKapEU3nyiIuEAmn8fbnosWcsovw0IS1Hz6HsjYo4bu/gA82LWt3sdRUBZ/7ZsVD3ELip [email protected]
 6    sudo: ['ALL=(ALL) NOPASSWD:ALL']
 7    groups: sudo
 8    shell: /bin/bash
 9runcmd:
10  - sed -i -e '/^Port/s/^.*$/Port 4444/' etc/ssh/sshd_config

我们的下一个sed行将修改PermitRootLogin指令,通过在行开始时搜索该字符串. 再次,我们将取代整个字符串,这次是PermitRootLogin no:

 1#cloud-config
 2users:
 3  - name: demo
 4    ssh-authorized-keys:
 5      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCv60WjxoM39LgPDbiW7ne3gu18q0NIVv0RE6rDLNal1quXZ3nqAlANpl5qmhDQ+GS/sOtygSG4/9aiOA4vXO54k1mHWL2irjuB9XbXr00+44vSd2q/vtXdGXhdSMTf4/XK17fjKSG/9y3yD6nml6q9XgQxx9Vf/IkaKdlK0hbC1ds0+8h83PTb9dF3L7hf3Ch/ghvj5++tWJFdFeG+VI7EDuKNA4zL8C5FdYYWFA88YAmM8ndjA5qCjZXIIeZvZ/z9Kpy6DL0QZ8T3NsxRKapEU3nyiIuEAmn8fbnosWcsovw0IS1Hz6HsjYo4bu/gA82LWt3sdRUBZ/7ZsVD3ELip [email protected]
 6    sudo: ['ALL=(ALL) NOPASSWD:ALL']
 7    groups: sudo
 8    shell: /bin/bash
 9runcmd:
10  - sed -i -e '/^Port/s/^.*$/Port 4444/' /etc/ssh/sshd_config
11  - sed -i -e '/^PermitRootLogin/s/^.*$/PermitRootLogin no/' /etc/ssh/sshd_config

接下来的sed命令将添加一行到文件的末尾,因为目前在文件中没有AllowUsers指令. 我们通过匹配最后一行(指定为$)并附加我们需要的行来做到这一点。

之后,我们需要重新启动 SSH 对象,以便我们的更改传播,我们可以轻松地使用 Upstart 命令重新启动:

 1#cloud-config
 2users:
 3  - name: demo
 4    ssh-authorized-keys:
 5      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCv60WjxoM39LgPDbiW7ne3gu18q0NIVv0RE6rDLNal1quXZ3nqAlANpl5qmhDQ+GS/sOtygSG4/9aiOA4vXO54k1mHWL2irjuB9XbXr00+44vSd2q/vtXdGXhdSMTf4/XK17fjKSG/9y3yD6nml6q9XgQxx9Vf/IkaKdlK0hbC1ds0+8h83PTb9dF3L7hf3Ch/ghvj5++tWJFdFeG+VI7EDuKNA4zL8C5FdYYWFA88YAmM8ndjA5qCjZXIIeZvZ/z9Kpy6DL0QZ8T3NsxRKapEU3nyiIuEAmn8fbnosWcsovw0IS1Hz6HsjYo4bu/gA82LWt3sdRUBZ/7ZsVD3ELip [email protected]
 6    sudo: ['ALL=(ALL) NOPASSWD:ALL']
 7    groups: sudo
 8    shell: /bin/bash
 9runcmd:
10  - sed -i -e '/^Port/s/^.*$/Port 4444/' /etc/ssh/sshd_config
11  - sed -i -e '/^PermitRootLogin/s/^.*$/PermitRootLogin no/' /etc/ssh/sshd_config
12  - sed -i -e '$aAllowUsers demo' /etc/ssh/sshd_config
13  - restart ssh

这应该足以对我们的文件进行我们需要的编辑,并重新启动服务。

完工产品

我们现在已经完成了我们使用cloud-config文件的所有调整目标,您可以使用控制面板创建您的服务器,或者使用API来旋转服务器。

如果您选择使用 API,样本数据实用负载可能看起来如下:

 1{"name": "your_droplet_name",
 2"private_networking": true,
 3"region": "nyc3",
 4"size": "512mb",
 5"image": "ubuntu-14-04-x64",
 6"user-data": "#cloud-config
 7users:
 8  - name: demo
 9    ssh-authorized-keys:
10      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCv60WjxoM39LgPDbiW7ne3gu18q0NIVv0RE6rDLNal1quXZ3nqAlANpl5qmhDQ+GS/sOtygSG4/9aiOA4vXO54k1mHWL2irjuB9XbXr00+44vSd2q/vtXdGXhdSMTf4/XK17fjKSG/9y3yD6nml6q9XgQxx9Vf/IkaKdlK0hbC1ds0+8h83PTb9dF3L7hf3Ch/ghvj5++tWJFdFeG+VI7EDuKNA4zL8C5FdYYWFA88YAmM8ndjA5qCjZXIIeZvZ/z9Kpy6DL0QZ8T3NsxRKapEU3nyiIuEAmn8fbnosWcsovw0IS1Hz6HsjYo4bu/gA82LWt3sdRUBZ/7ZsVD3ELip [email protected]
11    sudo: ['ALL=(ALL) NOPASSWD:ALL']
12    groups: sudo
13    shell: /bin/bash
14runcmd:
15  - sed -i -e '/^Port/s/^.*$/Port 4444/' /etc/ssh/sshd_config
16  - sed -i -e '/^PermitRootLogin/s/^.*$/PermitRootLogin no/' /etc/ssh/sshd_config
17  - sed -i -e '$aAllowUsers demo' /etc/ssh/sshd_config
18  - restart ssh"}

故障解析

如果您遇到一些问题,让您的cloud-config文件正常工作,您可以检查日志文件中的线索。

它们位于:

  • /var/log/cloud-init.log:云-init 处理配置文件的实际过程日志
  • /var/log/cloud-init-output.log:任何由配置处理产生的输出都可以在这里找到

你通常可以找到一些关于发生了什么的好信息,使用抓住来搜索这些文件。

如果您因某些配置问题无法登录您创建的服务器,最好将服务器摧毁并重新启动。 对于故障排除,有时需要暂时在cloud-config文件中设置一个测试服务器的根密码,以便您可以看到有什么不对劲。

您可以通过在您的云配置中添加类似的东西来完成此操作:

1#cloud-config
2chpasswd:
3  list: |
4    root:yourpassword    
5  expire: False
6. . .

这将允许您使用不依赖SSH的DigitalOcean控制台登录,请记住,您在这里放置的任何密码将可读于您的服务器上的每个用户在您的系统的整个生命周期,所以在您发现问题后销毁此Droplet。

建立传统的Sudo接入

如果您想在部署服务器后配置更传统的,密码验证的sudo访问,您可以轻松地执行以下步骤:

首先,您需要为新帐户设置密码. 唯一的方式来做到这一点 _ 没有_ 需要输入当前的密码(它不存在)是通过sudo 您将需要在命令的末尾指定新用户帐户的名称,以免设置根密码:

1sudo passwd demo

现在你有帐户的密码,确认你实际上是在sudo组。

1groups
1demo sudo

如果你还没有进入sudo组,你可以通过键入添加自己:

1sudo usermod -a -G sudo demo

现在,用visudo命令编辑90-cloud-init-users文件,通过通过该文件作为一个参数:

1sudo visudo -f /etc/sudoers.d/90-cloud-init-users

评论或删除与您相关联的行用户:

1#demo ALL=(ALL) NOPASSWD:ALL

保存和关闭文件. 您的帐户现在需要您的密码来执行sudo命令。

结论

使用cloud-config文件完成您的服务器的初始配置可以很容易,从长远来看,您可以节省时间。

通过将云配置与更传统的配置管理系统相结合,在机器上线后,您可以快速轻松地将新机器带入所需状态。

Published At
Categories with 技术
comments powered by Disqus