文档
Initihooks - 系统初始化,配置和预播
我们的目标是不断更新这些文件,但 Inithooks 文档来源 (GitHub)应始终更新。
导言
在将一个TurnKey系统暴露于敌对的互联网之前,首先需要初始化. 这将设置密码,安装安全更新,并配置关键应用程序设置.
初始化过程可以是互动的或非互动的,取决于在何种情况下最有效,以及系统如何部署。
交互式系统初始化
配置向导显示一个简短的序列, 简单文本对话框是 look 原始的, 但提供快速的步态进程, 它在任何地方都可行, 只需要赤色的 软件依赖性最小 -- -- 对安全敏感应用的一个巨大优势:

所有软件都有可能被窃听 但我们可以故意让简单化 而不是花哨的眼糖 来降低风险
配置对话框运行在两个位置中 :
首靴上的靴子控制台 建立在构造类型(如ISO,VM,VMDK)上,真实或虚拟机通常提供访问交互式系统控制台的机会.
第一次行政登录 运行的构建类型 无头 虚拟机(如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子目录中的脚本执行条件如下: 执行程序:
如果用户执行根 shell 的“ turnkey- init ” 。 此命令可用于重运行第一个启动. d inithooks , 以便在必要时重新配置 应用设备 。 某些脚本,例如重生成密钥的脚本会被跳过。详情请参见 /usr/sbin/turnkey-init 中的 BLACKLIST 变量 。
当用户首次登录为root时, 将启动“ turnkey- init” 运行, 以便用户能够交互完成 应用设备 初始化 。
当第一次穿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的功能是:
启用 turnkey- init- fence 服务并启动
通过更新 rc.d 启用/禁用服务
激活~$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()