本文へ移動
TURNKEYGNU / LINUX
アプリドキュメントブログスクリーンショットGitHubTurnKey Hub
文日本語
EnglishEspañol中文日本語PortuguêsDeutsch
ふりがな/Initihooks - システム初期化、構成、および事前参照

ドキュメント

Initihooks - システム初期化、構成、および事前参照

ドキュメントを最新の状態に保つことを目指していますが、 Inithooks ドキュメント ソース (GitHubの場合) 常に最新の状態でなければなりません。

導入事例

ユーザがTurnKeyシステムを敵対的なインターネットに公開する前に、まず初期化する必要があります。 パスワードの設定、セキュリティ更新のインストール、およびキーアプリケーション設定を行います。

この初期化プロセスは、システムがどこにどのようにデプロイされるかに応じて、インタラクティブまたは非インタラクティブな処理を行うことができます。

インタラクティブシステム初期化

構成ウィザードは、プリミティブに見えるシンプルなテキストダイアログの短いシーケンスを示していますが、どこでも動作するクイックステップバイステッププロセスを提供し、ベアだけを必要とする ソフトウェア依存関係の最小値 - セキュリティの機密アプリケーションのための大きな利点:

root password dialog

あらゆるソフトウェアは、潜在的にバグが生じるが、ファンシーなアイキャンディよりもシンプルさを意図的に好意することによってリスクを最小限に抑えることができます。

設定ダイアログは2つの場所のいずれかで実行されます。

  1. 起動コンソールで起動します。 実際のマシンや仮想マシンが通常、インタラクティブなシステムコンソールへのアクセスを提供するビルドタイプ(ISO、VM、VMDK)で。

  2. 管理の最初のログイン ビルド型で実行 ヘッドレス 仮想マシン(例えば、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スクリプトは、次の条件下で実行されます。

  1. ユーザーがルートシェルから「turnkey-init」を実行している場合。 このコマンドは、必要に応じてアプライアンスを相互に再構成するために、firstboot.d inithooksを再実行するために使用できます。 秘密鍵を再生するような特定のスクリプトがスキップされます。詳細は/usr/sbin/turnkey-initでBLACKLIST変数を参照して下さい。

  2. ユーザが先頭に root としてログインすると、ヘッドレス システムに最初にログされます。このトリガーは、ユーザーが対話的に アプライアンス 初期化を完了できるように、"turnkey-init" を実行します。

  3. 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 が何をするのか:

    1. turnkey-init-fence をサービスとして有効化し、起動します。

      更新 rc.d でサービスが有効/無効化

    2. アクティブ化 ~$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()
TURNKEYGNU / LINUX

ゼロから始めずに、自分のインフラを管理できます。

TurnKey を見る
概要ドキュメントよくある質問ブログGitHub
フリーでオープンソース初期設定から安全すぐに展開可能