ドキュメント
Initihooks - システム初期化、構成、および事前参照
ドキュメントを最新の状態に保つことを目指していますが、 Inithooks ドキュメント ソース (GitHubの場合) 常に最新の状態でなければなりません。
導入事例
ユーザがTurnKeyシステムを敵対的なインターネットに公開する前に、まず初期化する必要があります。 パスワードの設定、セキュリティ更新のインストール、およびキーアプリケーション設定を行います。
この初期化プロセスは、システムがどこにどのようにデプロイされるかに応じて、インタラクティブまたは非インタラクティブな処理を行うことができます。
インタラクティブシステム初期化
構成ウィザードは、プリミティブに見えるシンプルなテキストダイアログの短いシーケンスを示していますが、どこでも動作するクイックステップバイステッププロセスを提供し、ベアだけを必要とする ソフトウェア依存関係の最小値 - セキュリティの機密アプリケーションのための大きな利点:

あらゆるソフトウェアは、潜在的にバグが生じるが、ファンシーなアイキャンディよりもシンプルさを意図的に好意することによってリスクを最小限に抑えることができます。
設定ダイアログは2つの場所のいずれかで実行されます。
起動コンソールで起動します。 実際のマシンや仮想マシンが通常、インタラクティブなシステムコンソールへのアクセスを提供するビルドタイプ(ISO、VM、VMDK)で。
管理の最初のログイン ビルド型で実行 ヘッドレス 仮想マシン(例えば、AWSマーケットプレイス、OpenStack、Xen)。 起動時にシステムとやり取りするオプションを提供していません。
起動後、仮想フェンスは、SSHを機械に初めて初期化する方法を説明するWebページに潜在的に脆弱なサービスにアクセスしようとする試みをリダイレクトします システム。 仮想塀の初期化の後では降り、すべてのサービスは普通アクセスすることができます。
非相互システム初期化
とりあえず 名称: TurnKey Hub ユーザが Hub のクラウド展開 Web アプリを通じてインスタンスを起動する前に、システム初期化設定を優先してデプロイを合理化します。
つまり、システムが最初に起動するときは、テキストダイアログでユーザーとやり取りする必要はありません。
事前参照はよく文書化され、他のホスティングプロバイダやプライベートクラウドによって、同様に展開を合理化するために使用される場合があります。
フード: 知ってもらいたいものすべて、恐れていた
ストップ!前回導入は、システム初期化プロセスについて知る必要があるという単なる記憶だけを説明しました。
ドキュメントの残りの部分は、次の目的で意図されています。
TurnKeyがフードの下でどのように動作するかを学び、独自の構成ホックを開発することに興味があるアプライアンスハッカー。
システム初期化が深さでどのように機能するかを理解したい専門家のユーザー。
ホスティングプロバイダとプライベートクラウドフルスタック忍者は、TurnKeyとカスタムコントロールパネル間の緊密な統合を実施することに興味を持っています。
ボーナスは、要件ではありません。 特別な統合がなければ、TurnKey のイメージは、既存のデプロイメントスクリプトを使用して、他の Debian や Debian ベースのイメージのようにデプロイできます。 Debian や Ubuntu をデプロイできるなら、TurnKey をデプロイするのはトライバイアルです。
Inithooksパッケージ設計目標
inithooksパッケージは、システム初期化スクリプトを実行します。
- 秘密鍵を再生(例、SSH、デフォルトSSL証明書): これは良い考えではありません。中攻撃の人を避ける必要があります。
- パスワードの設定(例、ルート、データベース、アプリケーション): リスクを回避するために必要な デフォルトパスワードのハードワイヤー
- 基本アプリケーション設定(ドメイン、管理者メールなど)の設定: 特に、アプリケーションの設定が設定ファイルの形式をハンティングする必要がある場合に便利です。
また、Inithooksは、様々な仮想化ソリューションやクラウドが提供するカスタムコントロールパネルでTurnKeyを容易に統合できるように設計された事前のメカニズムを提供します。 ホスティングプロバイダ。
作品の使い方
Inithooks自体は、アプライアンス固有の「ホック」スクリプト自体に機能のバルクを残し、可能な限り汎用的でベアボーンとして、
これらのスクリプトは、/usr/lib/inithooks - allboot.d と firstboot.d の2つのサブディレクトリにあります。
英数字の順番で実行されます。つまり、3-foobar の前に 1-foo という名前のスクリプトが実行されることを意味します。 そのため、これらのディレクトリのスクリプトは、最初は面白い数字を持っている。
初期には、システム初期化のinithooksトップレベルのinitスクリプトが実行されます。実行レベル2 15。これにより、ほとんどのサービスが開始する前に、システムの設定が有効になります。 これをホックスクリプトの開発時に考慮に入れる。
firstboot.d スクリプト
サブディレクトリのfirstboot.dスクリプトは、次の条件下で実行されます。
ユーザーがルートシェルから「turnkey-init」を実行している場合。 このコマンドは、必要に応じてアプライアンスを相互に再構成するために、firstboot.d inithooksを再実行するために使用できます。 秘密鍵を再生するような特定のスクリプトがスキップされます。詳細は/usr/sbin/turnkey-initでBLACKLIST変数を参照して下さい。
ユーザが先頭に root としてログインすると、ヘッドレス システムに最初にログされます。このトリガーは、ユーザーが対話的に アプライアンス 初期化を完了できるように、"turnkey-init" を実行します。
TurnKey アプライアンス ブーツが初めて起動すると
inithooks は、/etc/default/inithooks. の RUN_FIRSTBOOT フラグの値をチェックすることで、これが最初の起動かどうかを確認します。 値が false の場合、スクリプトを実行して、フラグを真に切り替えます。
最初のブートスクリプトは、ビルドの種類に応じて、2つのモード、インタラクティブまたは非インタラクティブのいずれかで実行できます。
非ヘッドレスビルドのインタラクティブモード - ライブCD ISO、VMDK、OVF: これらのイメージは、起動時に仮想コンソールへのインタラクティブなアクセスが期待されるため、inithooks 初期化スクリプトの一部はテキストを介してユーザーと対話します システム ブーツが初めて (例: パスワード、アプリケーション設定など) ダイアログを ダイアログします。"turnkey-init" を実行すれば実行されるスクリプトと同じです。
ヘッドレスビルドの非インタラクティブモード - OpenStack、OpenVZ、OpenNode、Xen: これらのイメージタイプでは、起動時に仮想コンソールへのインタラクティブなアクセスを想定できません。 最初の起動は、非対話的に実行できる必要があります。そうしないと、起動をぶら下げるリスクが発生したり、決して起こりません。
そのため、ユーザとやり取りする代わりに、システムがdummyデフォルトでアプリケーション設定を初期化し、すべてのパスワードをランダムに値するように設定します。 rootパスワードが既に設定されている(例えば、前書きスクリプト)、ヘッドレス述スクリプトが上書きされないので、rootパスワードはうまくいくはずです。
最初の起動スクリプトの非対話的な実行からの出力は、/var/log/inithooks.log. に記録されます
対話型アプライアンスの設定は、ユーザが root でログを初めて起動するまで遅延します。 これは、ヘッドレスビルドにのみ存在する/usr/lib/inithooks/firstboot.d/29preseedのホックの助けを借りて達成されます。
#!/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
初期化フェンス: 上記のヘッドレス述のホックは、iptables を使用してローカル Web サーバーにアクセスする試みを静的 Web にリダイレクトする「初期化フェンス」メカニズムも活性化します。 このページは inithooks/bin/simplehttpd.py が配信されます。
このページでは、システム初期化を完了するために最初にrootとしてログインする必要があります。 フェンスの目的は、ユーザーが初期化されていないWebアプリケーションにアクセスしないようにするために使われます。この場合、セキュリティリスクをポーズすることができます。
ユーザが root でログをログアウトし、初期化プロセスが完了すると、初期化フェンスがオフになります。 ローカルWebサーバーで実行されているアプリケーションにアクセスすることができます。
ファーストブート.d/30turnkey-init-fence が何をするのか:
turnkey-init-fence をサービスとして有効化し、起動します。
更新 rc.d でサービスが有効/無効化
アクティブ化 ~$USERNAME/.profile.d/turnkey-init-fence
.profile.d スクリプトが dtach セッションをソケットにバインドする
セッションがソケットの添付に既に結合されている場合
dtach セッションで実行しているコマンドは?
turnkey-init -> 不当性を非アクティブ化 (サービスおよびプロファイル.d)
allboot.d スクリプト
毎回起動時に実行される、allboot.d サブディレクトリにあるスクリプト。 基本的には、悪い人のinitスクリプトと実際のinitスクリプトがよくあるため、ここに住んでいるスクリプトの数を最小限に抑えるよう努めています。
ヘッドレス展開でrootパスワードを設定する
ヘッドレス展開では、ユーザーはrootとしてログインしてアプライアンス初期化プロセスを完了する必要がありますが、rootとしてログインする方法は?
OpenNode や ProxMox を使用している場合は問題ありません。これらのシステムは、TurnKey イメージを展開する前に root パスワードを選択する必要があります。
OpenStackでは、設定されたSSHキーペアでrootとしてログインしたり、"システムログ"からランダムなrootパスワードを取得することができます。
他の仮想化/プライベートクラウドソリューションは、既存のデプロイメントスクリプトを使用して、rootパスワードを設定することができます。DebianとUbuntuで既に実行しているのと同じように。
もう一つの高度なオプションは、初めて起動する前に、apliance のファイルシステムで /etc/inithooks.conf ファイルを「事前設定」することです。 これは、rootパスワードだけでなく、データベースやアプリケーションパスワード、管理者メール、ドメイン名など、事前設定にinithooksを活用することができます。
しかし、事前の閲覧では「初期化フェンス」が無効になっています。 前述TurnKeyを使用している場合、既にユーザーと他の方法(例、Webコントロールパネル)とやり取りして、事前に設定値を取得することを想定しています。
プレシード
デフォルトでは、アプライアンス が初めて実行されると、まず起動スクリプトは、仮想コンソールを通して、さまざまなパスワードを選択するユーザーをインタラクティブにプロンプト表示します。 基本アプリケーション設定の設定。
アプライアンスファイルシステムで/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 を正確に作成する方法は、使用している仮想化プラットフォームの能力とあなた次第です。 例えば、複数の仮想化プラットフォームは、スクリプトを実行したり、最初の起動前にファイルシステムにファイルを追加したりできる施設を提供します。
初期化のホックおよび事前設定パラメータのリスト
以下は、インタラクティブな firstboot のホックのリストです。すべてのインタラクティブなホックは、クラウド展開、ホスティング、ISV 統合をサポートするオプションを事前参照しています。
ほぼすべてのアプライアンスは、独自のアプリケーション固有の秘密再生のホックを持っていることに注意してください。
すべてのアプライアンスと共通:
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 オプションは、自己説明的である必要があります。 ライブデモモードでは、secupdate が自動的にスキップされることに注意してください。
開発ノート
なので、新しいアプライアンスを作成して、初期化のホックを追加したいです。 素晴らしい! ここに行くいくつかの例があります。
非インタラクティブなインフィック
次の例は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
以下は、アプライアンス の root パスワードを設定するために使用されます。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()