跳到正文
TURNKEYGNU / LINUX
应用文档博客截图GitHubTurnKey Hub
文中文
EnglishEspañol中文日本語PortuguêsDeutsch
ưμ㼯A/Initihooks - 系统初始化,配置和预播

文档

Initihooks - 系统初始化,配置和预播

我们的目标是不断更新这些文件,但 Inithooks 文档来源 (GitHub)应始终更新。

导言

在将一个TurnKey系统暴露于敌对的互联网之前,首先需要初始化. 这将设置密码,安装安全更新,并配置关键应用程序设置.

初始化过程可以是互动的或非互动的,取决于在何种情况下最有效,以及系统如何部署。

交互式系统初始化

配置向导显示一个简短的序列, 简单文本对话框是 look 原始的, 但提供快速的步态进程, 它在任何地方都可行, 只需要赤色的 软件依赖性最小 -- -- 对安全敏感应用的一个巨大优势:

root password dialog

所有软件都有可能被窃听 但我们可以故意让简单化 而不是花哨的眼糖 来降低风险

配置对话框运行在两个位置中 :

  1. 首靴上的靴子控制台 建立在构造类型(如ISO,VM,VMDK)上,真实或虚拟机通常提供访问交互式系统控制台的机会.

  2. 第一次行政登录 运行的构建类型 无头 虚拟机(如AWS市场,OpenStack,Xen),不能提供在启动时与系统互动的选择.

    启动后,虚拟围栏将可能脆弱服务的尝试重新导向网页,解释SSH如何首次进入机器初始化 系统。初始化后,虚拟围栏会下线,所有服务都可以正常访问。

非互动系统初始化

电话 TurnKey Hub 通过预播系统初始化设置,在用户提供值之前,通过Hub的云部署网络应用启动实例来简化部署.

这意味着当系统第一次靴子时,它不需要通过文本对话框与用户互动.

播种有很好的记载,其他托管提供商或私人云可能以类似的方式使用,以精简部署.

盖子底下:你想知道的,但害怕问

停止! 前面的介绍解释了所有仅是凡人需要了解的系统初始化过程.

其余文件用于:

  • 应用设备黑客有兴趣学习TurnKey如何在罩下工作,并开发自己的配置hook.

  • 想要了解系统初始化如何深入工作的专家用户.

  • 托管供应商和有兴趣实施TurnKey与自定义控制面板之间紧密结合的私人云全屏忍者.

    这不是一个要求,只是奖金。 没有任何特殊的整合,TurnKey图像可以像其他Debian或Debian基于图像一样部署,使用你现有的部署脚本. 如果你可以部署Debian或Ubuntu,部署TurnKey应该微不足道.

Inithooks 套件设计目标

inithooks 包执行系统初始化脚本,这些脚本:

  • 重生成密钥( 如 SSH, 默认 SSL 证书):这不仅仅是一个好主意,必须避免中途攻击中的人.
  • 设置密码( 如 root、 数据库、 应用程序):为避免出现风险所必需的 硬线默认密码
  • 配置基本应用程序设置( 如域名、 管理电子邮件): 当配置应用程序需要查找配置文件的格式时,特别有用。

另外,Inithooks提供了一种预播机制,旨在方便TurnKey与各种虚拟化解决方案和云提供的自定义控制面板集成. 提供托管服务。

如何运作

Inithooks本身是尽可能通用的和赤骨的,将大部分功能留给应用设备特定的"hook"脚本本身,.

这些脚本位于/usr/lib/inithooks下的两个子目录中:每集boot.d和首集bot.d.

它们按字母顺序执行。 这意味着一个名为 1- foo 的脚本将在 2 栏前执行, 而 2 栏本身将在 3- foo 栏 之前执行 。 因此这些目录中的脚本在开头有搞笑的数字.

inithooks顶级init脚本在系统初始化初期执行,运行级别2 15. 这可以在大多数服务开始前对系统进行配置. 开发hox0X脚本时应考虑到这一点。

第一启动.d脚本

首首boot.d子目录中的脚本执行条件如下: 执行程序:

  1. 如果用户执行根 shell 的“ turnkey- init ” 。 此命令可用于重运行第一个启动. d inithooks , 以便在必要时重新配置 应用设备 。 某些脚本,例如重生成密钥的脚本会被跳过。详情请参见 /usr/sbin/turnkey-init 中的 BLACKLIST 变量 。

  2. 当用户首次登录为root时, 将启动“ turnkey- init” 运行, 以便用户能够交互完成 应用设备 初始化 。

  3. 当第一次穿TurnKey 应用设备靴子时

    inithooks通过检查/etc/default/inithooks.中RUN_FIRSTBOOT旗的值来检查此是否是第一个启动 如果值是虚假的,则会运行脚本,并将旗帜切换为真实的.

    首个boot脚本可能以交互或非交互两种模式之一运行,这取决于构建的类型.

    关于非无头建筑的互动模式 - Live CD ISO, VMDK和 OVF: 由于这些图像类型在启动时可以交互访问虚拟控制台,所以一些inithooks初始化脚本将通过文本与用户交互 对话框系统靴子( 如 密码、 应用程序设置等) 。 这些脚本和运行“ turnkey- init” 时执行的脚本相同 。

    无头建筑的非交互模式 - OpenStack, OpenVZ, OpenNode, Xen:由于这些图像类型在启动时对虚拟控制台的交互访问无法被假定. 第一个靴子必须能够进行非交互运行,否则我们冒着吊死靴子的风险,等待用户的交互,而这种互动永远不会发生.

    因此,系统没有与用户互动,而是预先初始化了假冒默认的应用程序设置,将所有密码设置为随机值. 如果根密码已经设置(例如,在部署前脚本中),则无头的预播脚本不会覆盖它,所以你的根密码应该很好工作.

    第一个启动脚本的非交互运行输出被登录到 /var/log/inithooks.log.

    Interactive 应用设备配置被延迟到用户首次登录为root. 这项工作是在/usr/lib/inithooks/firstboot.d/29preseed hook的帮助下完成的,它只存在于无头建筑上:

    #!/bin/bash -e
    # generic preseeding of inithooks.conf if it doesn't exist
    
    [ -e $INITHOOKS_CONF ] && exit 0
    
    MASTERPASS=$(mcookie | cut --bytes 1-8)
    
    cat>$INITHOOKS_CONF<<EOF
    export ROOT_PASS=$MASTERPASS
    export DB_PASS=$MASTERPASS
    export APP_PASS=$MASTERPASS
    export APP_EMAIL=admin@example.com
    export APP_DOMAIN=DEFAULT
    export HUB_APIKEY=SKIP
    export SEC_ALERTS=SKIP
    export SEC_UPDATES=FORCE
    EOF
    
    chmod +x /usr/lib/inithooks/firstboot.d/30turnkey-init-fence
    

    初始化围栏: 上述无头预播HEok也激活了使用iptables将访问本地网络服务器的尝试重定向到静态网络的"初始化栅栏"机制. 页面服务于 inithooks/bin/simphttpd.py.

    此页面解释您需要先登录为根才能完成系统初始化 。 栅栏的目的被用来阻止用户访问未初始化的网络应用程序,在某些情况下这可能会构成安全风险.

    用户登录为root并完成初始化过程后,"初始化栅栏"即被关闭. 用户然后可以访问在本地网络服务器上运行的应用程序.

    初创. d/30turnkey-init-fence的功能是:

    1. 启用 turnkey- init- fence 服务并启动

      通过更新 rc.d 启用/禁用服务

    2. 激活~$USERNAME/.profile.d/turnkey-init-fence 键盘

      配置.d 脚本启动一个绑定在套接字的 dtach 会话

      如果一个会话已经绑定在它上的套接字上

      命令是什么? 运行在 dtach 会话中?

      turnkey-init - > 失效隐患(服务和剖面)

每集脚本

每条脚本中都有脚本,每条脚本上都有子目录运行. d sub-direct rund on every boot. 我们试图尽量减少住在这里的剧本数量,因为它们基本上是穷人的init剧本,而真正的init剧本往往是一个更好的主意.

在无头部署中设置根密码

在无头部署时,用户需要登录为root来完成应用设备初始化进程,但您如何登录为root?

使用 OpenNode 或 ProxMox 并不问题:这些系统促使您在部署 TurnKey 图像之前选择一个根密码 。

在 OpenStack 上,您可以使用您配置的 SSH 键盘登录为 root , 或者从“ 系统日志” 中获取随机的 root 密码 。

其他虚拟化/私有云解决方案应该能够使用他们现有的部署脚本来设置根密码,就像他们已经和Debian和Ubuntu一样.

另一个更先进的选项是首次启动前在plions的文件系统中"prefeed"/etc/inithooks.conf文件. 这使得您可以利用 inithooks 来预设不仅包含根密码,而且还包含数据库和应用密码,管理电子邮件,域名等.

然而,请注意,使用播种前的植入栅栏会失效。 如果您在使用预播TurnKey假设,您已经与用户通过其他方式(如网页控制面板)互动,以获得预播配置值.

播种前的预播

默认情况下,当 应用设备 首次运行时,第一个启动脚本会通过虚拟控制台,以交互方式提示用户选择各种密码和 基本应用程序配置设置。

通过在 应用设备 文件系统中创建 /etc/inithooks.conf 并写入 inithooks 配置变量,可以绕过此交互配置进程 系统启动前。例如:

cat>/etc/inithooks.conf<<EOF
export ROOT_PASS=supersecretrootpass
export DB_PASS=supersecretmysqlpass
export APP_EMAIL=admin@example.com
export APP_PASS=webappadminpassword
export SEC_ALERTS=admin@example.com
export SEC_UPDATES=FORCE
export HUB_APIKEY=SKIP
EOF

不用担心把敏感的密码留在里面:在第一个靴子后,inithooks空白的/etc/inithooks.conf出那么重要的密码不会意外地留在清晰的空间中.

这种预播机制使得TurnKey与自定义控制面板,虚拟化解决方案等集成起来相对容易.

您如何准确创建 /etc/inithooks.conf 取决于您以及您正在使用的虚拟化平台的能力. 例如,许多虚拟化平台提供了一个设施,您可以通过它运行脚本或在第一个启动前将文件添加到文件系统.

初始化的hooks和预播配置参数列表

下面列出互动首个boot hox1X. 所有互动的hox2X都有预播选项支持云的部署,主机和ISV集成.

注意几乎所有应用设备都有自己的应用,具体的秘密再生HOok.

通用的 应用设备 :

30rootpass              ROOT_PASS
50auto-apt-archive      AUTO_APT_ARCHIVE        [ SKIP ]
80tklbam                HUB_APIKEY              [ SKIP ]
85secalerts             SEC_ALERTS              [ SKIP ]
92etckeeper             ETCKEEPER_COMMIT        [ SKIP ]
95secupdates            SEC_UPDATES             [ SKIP | FORCE ]

指定为无头建筑 :

29preseed INITFENCE [ SKIP ]

应用设备 具体 :

35mysqlpass                    DB_PASS
35pgsqlpass                    DB_PASS

40ansible                      APP_PASS
40couchdb                      APP_PASS
40espocrm                      APP_PASS
40etherpad                     APP_PASS
40githttp                      APP_PASS
40icesecretset                 APP_PASS
40jenkins                      APP_PASS
40mediawiki                    APP_PASS
40mibew                        APP_PASS
40mongodb                      APP_PASS
40moodle                       APP_PASS
40mumblesupw                   APP_PASS
40observium                    APP_PASS
40odoo                         APP_PASS
40openvas                      APP_PASS
40orangehrm                    APP_PASS
40otrs                         APP_PASS
40phpmumbleadmin               APP_PASS
40plone                        APP_PASS
40sugarcrm                     APP_PASS
40suitecrm                     APP_PASS
40torrentserver                APP_PASS
40trac                         APP_PASS
40typo3                        APP_PASS
40zoneminder                   APP_PASS
40nextcloud                    APP_PASS, APP_DOMAIN
40openldap                     APP_PASS, APP_DOMAIN
40owncloud                     APP_PASS, APP_DOMAIN
40zurmo                        APP_PASS, APP_DOMAIN
40domain-controller            APP_PASS, APP_DOMAIN [, APP_REALM]
40b2evolution                  APP_PASS, APP_EMAIL
40collabtive                   APP_PASS, APP_EMAIL
40concrete5                    APP_PASS, APP_EMAIL
40django                       APP_PASS, APP_EMAIL
40dokuwiki                     APP_PASS, APP_EMAIL
40drupal7                      APP_PASS, APP_EMAIL
40e107                         APP_PASS, APP_EMAIL
40ezplatform                   APP_PASS, APP_EMAIL
40gallery                      APP_PASS, APP_EMAIL
40joomla                       APP_PASS, APP_EMAIL
40kliqqi                       APP_PASS, APP_EMAIL
40limesurvey                   APP_PASS, APP_EMAIL
40mahara                       APP_PASS, APP_EMAIL
40mambo                        APP_PASS, APP_EMAIL
40mantis                       APP_PASS, APP_EMAIL
40mattermost                   APP_PASS, APP_EMAIL
40mayan                        APP_PASS, APP_EMAIL
40moinmoin                     APP_PASS, APP_EMAIL
40omeka                        APP_PASS, APP_EMAIL
40oscommerce                   APP_PASS, APP_EMAIL
40phpbb                        APP_PASS, APP_EMAIL
40processmaker                 APP_PASS, APP_EMAIL
40redmine                      APP_PASS, APP_EMAIL
40roundup                      APP_PASS, APP_EMAIL
40silverstripe                 APP_PASS, APP_EMAIL
40simpleinvoices               APP_PASS, APP_EMAIL
40sitracker                    APP_PASS, APP_EMAIL
40twiki                        APP_PASS, APP_EMAIL
40ushahidi                     APP_PASS, APP_EMAIL
40vanilla                      APP_PASS, APP_EMAIL
40vtiger                       APP_PASS, APP_EMAIL
40wordpress                    APP_PASS, APP_EMAIL
40xoops                        APP_PASS, APP_EMAIL
40canvas                       APP_PASS, APP_EMAIL, APP_DOMAIN
40drupal8                      APP_PASS, APP_EMAIL, APP_DOMAIN
40elgg                         APP_PASS, APP_EMAIL, APP_DOMAIN
40gitlab                       APP_PASS, APP_EMAIL, APP_DOMAIN
40gnusocial                    APP_PASS, APP_EMAIL, APP_DOMAIN
40icescrum                     APP_PASS, APP_EMAIL, APP_DOMAIN
40phplist                      APP_PASS, APP_EMAIL, APP_DOMAIN
40piwik                        APP_PASS, APP_EMAIL, APP_DOMAIN
40prestashop                   APP_PASS, APP_EMAIL, APP_DOMAIN
40punbb                        APP_PASS, APP_EMAIL, APP_DOMAIN
40simplemachines               APP_PASS, APP_EMAIL, APP_DOMAIN
40zencart                      APP_PASS, APP_EMAIL, APP_DOMAIN
40magento                      APP_PASS, APP_EMAIL, APP_DOMAIN [, APP_PRIVKEY, APP_PUBKEY]
40bugzilla                     APP_PASS, APP_EMAIL [, APP_OUTMAIL]
40foodsoft                     APP_PASS, APP_EMAIL [, APP_VARIANT]
40ghost                        APP_PASS, APP_EMAIL, APP_DOMAIN [, APP_UNAME]

如果未预先播种, 用户将被交互询问。 SKIP 和 FORCE 选项应该自解。 请注意, 分集日期在现场演示模式下会自动跳过 。

发展说明

如果你正在创建新的应用设备并希望添加初始化钩子,下面这些示例可以帮助你开始。

非交互式 inithook

以下的例子用于Joomla15 应用设备。它使该物质再生。 密钥,并设置一个对joomla用户的随机mysql密码。

/usr/lib/inithooks/firstboot.d/20regen-joomla-secrets

#!/bin/bash -e
# regenerate joomla secret key and mysql password

. /etc/default/inithooks

updateconf() {
    CONF=/var/www/joomla/configuration.php
    sed -i "s/var $1 = \(.*\)/var $1 = '$2';/" $CONF
}

updateconf '\$secret' $(mcookie)$(mcookie)

PASSWORD=$(mcookie)
updateconf '\$password' $PASSWORD

$INITHOOKS_PATH/bin/mysqlconf.py --user=joomla --pass="$PASSWORD"

交互式 inithook

以下示例用于设置所有 应用设备 的根密码。 如果 ROOTPASS 未设置, 用户将被请求交互输入密码 。

/usr/lib/inithooks/firstboot.d/30rootpass

#!/bin/bash -e
# set root password

. /etc/default/inithooks

[ -e $INITHOOKS_CONF ] && . $INITHOOKS_CONF
$INITHOOKS_PATH/bin/setpasspass.py root --pass="$ROOTPASS"
/usr/lib/inithooks/bin/setpass.py

#!/usr/bin/python
# Copyright (c) 2010 Alon Swartz <alon@turnkeylinux.org>
"""Set account password

Arguments:
    username      username of account to set password for

Options:
    -p --pass=    if not provided, will ask interactively
"""

import sys
import getopt
import subprocess
from subprocess import PIPE

from dialog_wrapper import Dialog

def fatal(s):
    print >> sys.stderr, "Error:", s
    sys.exit(1)

def usage(e=None):
    if e:
        print >> sys.stderr, "Error:", e
    print >> sys.stderr, "Syntax: %s <username> [options]" % sys.argv[0]
    print >> sys.stderr, __doc__
    sys.exit(1)

def main():
    try:
        opts, args = getopt.gnu_getopt(sys.argv[1:], "hp:", ['help', 'pass='])
    except getopt.GetoptError, e:
        usage(e)

    if len(args) != 1:
        usage()

    username = args[0]
    password = ""
    for opt, val in opts:
        if opt in ('-h', '--help'):
            usage()
        elif opt in ('-p', '--pass'):
            password = val

    if not password:
        d = Dialog('TurnKey GNU/Linux - First boot configuration')
        password = d.get_password(
            "%s Password" % username.capitalize(),
            "Please enter new password for the %s account." % username)

    command = ["chpasswd"]
    input = ":".join([username, password])

    p = subprocess.Popen(command, stdin=PIPE, shell=False)
    p.stdin.write(input)
    p.stdin.close()
    err = p.wait()
    if err:
        fatal(err)

if __name__ == "__main__":
    main()
TURNKEYGNU / LINUX

无需从零开始,掌控自己的基础设施。

探索 TurnKey
关于文档常见问题博客GitHub
自由开源默认安全随时可部署