Ir para o conteúdo
TURNKEYGNU / LINUX
AplicativosDocumentaçãoBlogCapturas de telaGitHubTurnKey Hub
文Português
EnglishEspañol中文日本語PortuguêsDeutsch
Principal/Iniciações - Inicialização, configuração e preseed do sistema

Documentação

Iniciações - Inicialização, configuração e preseed do sistema

O nosso objectivo é manter esta documentação actualizada, mas Fonte de documentação Inithooks (em GitHub) deve estar sempre atualizado.

Introdução

Antes de expormos um sistema TurnKey a uma Internet hostil, precisamos inicializá-lo. Isso configurará senhas, instalará atualizações de segurança e configurará as configurações das aplicações chave.

Este processo de inicialização pode ser interativo ou não-interativo dependendo do que funciona melhor dado onde e como o sistema é implantado.

Inicialização do sistema interativo

Um assistente de configuração mostra uma sequência curta de diálogos de texto simples que parecem primitivos, mas fornecem um processo passo a passo rápido que funciona em qualquer lugar e requer apenas o desnudo mínimo de dependências de software - uma grande vantagem para aplicações sensíveis à segurança:

root password dialog

Todo o software é potencialmente buggy, mas podemos minimizar o risco, intencionalmente favorecendo a simplicidade sobre doces de olhos extravagantes.

As janelas de configuração são executadas em um de dois lugares:

  1. A consola de arranque na primeira inicialização Em tipos de compilação (por exemplo, ISO, VM, VMDK) onde a máquina real ou virtual normalmente fornece acesso a uma consola de sistema interativa.

  2. O primeiro login da administração sobre tipos de compilação em execução sem cabeça máquinas virtuais (por exemplo, mercado AWS, OpenStack, Xen). que não fornecem a opção de interagir com o sistema no momento do arranque.

    Após o arranque, uma cerca virtual redireciona as tentativas de acesso a serviços potencialmente vulneráveis para uma página web explicando como para SSH na máquina pela primeira vez para inicializar o sistema. Após a inicialização a cerca virtual desce e todos os serviços podem ser acessados normalmente.

Inicialização do sistema não-interactivo

A TurnKey Hub simplifica a implantação através de configurações de inicialização do sistema de pré-seeding com valores que o usuário fornece antes de lançar uma instância através do aplicativo web de implantação em nuvem do Hub.

Isto significa que quando o sistema inicia pela primeira vez, ele não precisa interagir com o usuário através de diálogos de texto.

O preseeding está bem documentado e pode ser usado por outros provedores de hospedagem ou nuvens privadas de forma similar para simplificar a implantação.

Sob o capô: tudo o que você queria saber, mas tinha medo de perguntar

Pare! A introdução anterior explicou tudo que meros mortais precisam saber sobre o processo de inicialização do sistema.

O resto da documentação destina-se a:

  • Os hackers appliance interessados em aprender como o TurnKey funciona sob o capô e desenvolver seus próprios ganchos de configuração.

  • Usuários especialistas que querem entender como a inicialização do sistema funciona em profundidade.

  • Prestadores de hospedagem e ninjas fullstack de nuvem privada interessados em implementar uma integração apertada entre TurnKey e painéis de controle personalizados.

    Isto não é um requisito, é apenas um bónus. Sem qualquer integração especial, as imagens TurnKey podem ser implantadas como qualquer outra imagem baseada em Debian ou Debian, usando seus scripts de implementações existentes. Se você pode implantar Debian ou Ubuntu, deve ser trivial para implantar TurnKey.

Objetivos de design de pacotes Inithooks

O pacote inithooks executa scripts de inicialização do sistema que:

  • Regenerar chaves secretas (por exemplo, SSH, certificado SSL padrão): Isto não é apenas uma boa ideia, é necessário evitar o homem nos ataques do meio.
  • Definir senhas (por exemplo, root, base de dados, aplicação)• necessário para evitar o risco de senhas padrão com ligação por fios
  • Configurar as configurações básicas do aplicativo (por exemplo, domínio, e-mail de administrador): especialmente útil quando configurar o aplicativo exigiria a busca para baixo o formato de um arquivo de configuração.

Além disso, Inithooks fornece um mecanismo de pré-seeding projetado para tornar mais fácil integrar TurnKey com painéis de controle personalizados fornecidos por várias soluções de virtualização e nuvem prestadores de alojamento.

Como funciona

O Inithooks em si é o mais genérico e o mais simples possível, deixando a maior parte da funcionalidade para os scripts appliance específicos "hook" eles mesmos,

Estes scripts estão localizados em dois sub-diretórios sob /usr/lib/inithooks - everyboot.d e firstboot.d.

Eles são executados em ordem alfanumérica. Isto significa que um script chamado 1- foo seria executado antes de 2- bar, que seria executado em si antes de 3- foobar. É por isso que scripts nestes diretórios têm números engraçados no início.

O script de init de nível superior inithooks é executado no início da inicialização do sistema, no nível de execução 2 15. Isto permite a configuração do sistema antes de a maioria dos serviços começar. Isso deve ser levado em consideração ao desenvolver scripts de gancho.

scripts do 'inicialboot.d'

Os scripts no subdiretório do firstboot.d são executados sob as seguintes condições:

  1. Se o usuário executar o "turnkey-init" de uma shell root. Este comando pode ser usado para repetir o primeiro buot.d inithooks interativamente para reconfigurar o appliance, se necessário. Certos scripts como aqueles que regeneram as teclas secretas são ignorados. Veja a variável BLACKLIST no /usr/sbin/turnkey-init para mais detalhes.

  2. Quando o usuário faz login como root pela primeira vez em um sistema sem cabeça. Isto ativa o "turnkey-init" para executar para que o usuário possa completar interativamente a inicialização do appliance.

  3. Quando um TurnKey appliance botas pela primeira vez

    inithooks verifica se esta é ou não a primeira inicialização, verificando o valor da bandeira RUN_FIRSTBOOT no /etc/default/inithooks. Se o valor for falso, ele executa os scripts e alterna a bandeira para true.

    Os scripts de primeira inicialização podem ser executados em um dos dois modos, interativos ou não-interativos, dependendo do tipo de compilação.

    Modo interativo em compilações sem cabeça - Live CD ISO, VMDK e OVF: Com estes tipos de imagem o acesso interativo ao console virtual durante o boot é esperado para que alguns dos scripts de inicialização inithooks interaja com o usuário via texto dialoga a primeira vez que o sistema inicia (por exemplo, pedir senhas, configurações de aplicativos, etc.). Estes são os mesmos scripts que são executados se você executar "turnkey-init".

    Modo não- interativo em compilações sem cabeça - OpenStack, OpenVZ, OpenNode, Xen: com estes tipos de imagem o acesso interativo ao console virtual durante o arranque não pode ser assumido. A primeira inicialização tem que ser capaz de rodar de forma não-interativa, caso contrário, arriscamos pendurar a inicialização enquanto espera pela interação do usuário que nunca acontece.

    Assim, em vez de interagir com o usuário, o sistema pré-inicia as configurações de aplicação com padrões de dummy e definir todas as senhas para um valor aleatório. Se uma senha root já foi definida (por exemplo, em um script de pré- implantação) o script de preseeding sem cabeça não irá sobrescrevê-lo, então sua senha root deve funcionar perfeitamente.

    A saída da execução não- interactiva dos scripts do primeiro arranque está registada no /var/log/inithooks.log.

    A configuração interativa do appliance é adiada até a primeira vez que o usuário faz login como root. Isto é realizado com a ajuda do gancho /usr/lib/inithooks/firstboot.d/29preseed, que só existe em construções sem cabeça:

    #!/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
    

    Seca de inicialização: o gancho de preseeding sem cabeça acima também ativa o mecanismo de "inicialização da cerca" que usa iptables para redirecionar tentativas de acessar o servidor web local para uma web estática página servida por inithooks/bin/simplehttpd.py.

    Esta página explica que você precisa fazer login como root primeiramente para terminar de inicializar o sistema. O objetivo da cerca é utilizado para impedir que os usuários acessem aplicações web não iniciadas, que em alguns casos podem representar um risco de segurança.

    Depois que o usuário loga como root e completa o processo de inicialização a "cela de inicialização" é desligada. Os usuários podem então acessar aplicativos em execução no servidor web local.

    O que o firstboot.d/30turnkey-init-fence faz:

    1. habilita o turnkey-init-fence como um serviço e inicia-o

      o serviço está habilitado / desativado através de update-rc.d

    2. ativa ~$USERNAME/.profile.d/turnkey-init-fence

      o script .profile.d lança uma sessão dtach com ligação a um soquete

      se uma sessão já estiver ligada ao 'socket' anexar a ele

      que comando estamos a executar na sessão de dtach?

      turnkey-init -> desactivar a initfence (serviço e perfil.d)

scripts de todos os boot.d

Scripts que estão no sub-directório everyboot.d rodam em cada inicialização. Tentamos minimizar o número de scripts que vivem aqui porque eles são basicamente um script de init de um homem pobre e scripts de init reais são muitas vezes uma ideia melhor.

Definir a senha raiz numa implantação sem cabeça

Em implantações sem cabeça, o usuário precisa se autenticar como root para concluir o processo de inicialização do appliance, mas como você se autentica como root?

Não é um problema se você estiver usando OpenNode ou ProxMox - esses sistemas pedem que você escolha uma senha raiz antes de implantar uma imagem TurnKey.

No OpenStack você pode fazer login como root com seu keypair SSH configurado ou recuperar a senha root aleatória do "registro do sistema".

Outras soluções de virtualização / nuvem privada devem ser capazes de usar seus scripts de implantação existentes para definir a senha root, assim como já fazem com Debian e Ubuntu.

Outra opção mais avançada é "preseed" o arquivo /etc/inithooks.conf no sistema de arquivos do apliance antes de inicializá-lo pela primeira vez. Isso permite que você use inithooks para pré-configurar não apenas a senha do root, mas também o banco de dados e senhas de aplicativos, e-mail de administrador, nome de domínio, etc.

No entanto, note que usar preseed desativa a "esgrima de initilização". Se você estiver usando o preseed TurnKey assume que você já interagiu com o usuário de alguma outra forma (por exemplo, painel de controle web) para obter os valores de configuração preseed.

Preseeding

Por padrão, quando um appliance é executado pela primeira vez, os scripts de primeira inicialização solicitará ao usuário de forma interativa, através do console virtual, para escolher várias senhas e configurações básicas de configuração de aplicativos.

É possível contornar este processo de configuração interativa criando /etc/inithooks.conf no sistema de arquivos appliance e escrevendo variáveis de configuração inithooks nele antes da primeira inicialização do sistema. Por exemplo:

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

Não se preocupe em deixar senhas sensíveis lá dentro: após a primeira inicialização, inithooks em branco /etc/inithooks.conf para fora, então senhas importantes não são acidentalmente deixadas em claro.

Este mecanismo de pré-seeding torna relativamente fácil integrar TurnKey com painéis de controle personalizados, soluções de virtualização, etc.

Como exatamente você cria o /etc/inithooks.conf depende de você e das capacidades da plataforma de virtualização que você está usando. Por exemplo, muitas plataformas de virtualização fornecem uma facilidade através da qual você pode executar scripts ou adicionar arquivos ao sistema de arquivos antes da primeira inicialização.

Lista de ganchos de inicialização e parâmetros de configuração de preseeding

Abaixo está uma lista de ganchos interativos de primeira inicialização. Todos os ganchos interativos têm opções de preseeding para suportar a implantação na nuvem, hospedagem e integração ISV.

Note que quase todos os appliances têm seus próprios ganchos de regeneração secreta específicos de aplicação.

Frequentes de todos os appliances:

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 ]

Específico para construções sem cabeça:

29preseed INITFENCE [ SKIP ]

Específico appliance:

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]

Se não for pré- seed, o usuário será perguntado interactivamente. As opções SKIP e FORCE devem ser autoexplicativas. Lembre- se que os secupdates são automaticamente ignorados quando estiverem em modo de demonstração ao vivo.

Notas de desenvolvimento

Então você está criando um novo appliance e quer adicionar ganchos de inicialização. Impressionante! Aqui estão alguns exemplos para fazê-lo ir.

Inithook não-interactivo

O exemplo a seguir é usado no Joomla15 appliance. Regenera o secreto, e define uma senha mysql aleatória para o usuário joomla.

/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 interativo

O exemplo a seguir é usado para definir a senha raiz em todo o appliances. Se o ROOTPASS não estiver definido, o usuário será solicitado a inserir uma senha interativamente.

/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

Controle sua infraestrutura sem começar do zero.

Explorar o TurnKey
SobreDocumentaçãoPerguntas frequentesBlogGitHub
Livre e de código abertoSeguro por padrãoPronto para implantar