La A a la Z de configurar una caja de Linux para un alojamiento local seguro

12

Estoy en el proceso de reinstalar el sistema operativo en una máquina que se utilizará para alojar un par de aplicaciones para nuestro negocio. Las aplicaciones serán solo locales; El acceso desde clientes externos será solo a través de VPN.

La configuración anterior usaba un panel de control de alojamiento (Plesk) para la mayoría de los administradores, y estaba buscando usar otro software similar para la reinstalación, pero pensé que finalmente debería aprender cómo funciona todo. Puedo hacer la mayoría de las cosas que el software haría por mí, pero no tengo clara la simbiosis de todo. Todo esto es un intento de distanciarme más de la tierra del Programador / Programador de configuración , si es posible.

No puedo encontrar un tutorial completo para lo que estoy buscando, así que pensé en hacer esta pregunta, y si la gente me puede ayudar en el camino, editaré esto con las respuestas y documentaré mi progreso / trampas Esperemos que algún día esto ayude a alguien en el futuro.

Los detalles:

  • CentOS 5.5 x86_64
  • httpd: Apache / 2.2.3
  • MySQL: 5.0.77 (para actualizar)
  • PHP: 5.1 (para ser actualizado)

Los requisitos:

  • ¡¡SEGURIDAD!!
    • Transferencia segura de archivos
    • Acceso seguro al cliente (SSL Certs y CA)
    • Almacenamiento de datos seguro
    • Conexión segura a otra máquina local (MySQL)
  • Virtualhosts / subdominios múltiples
  • El correo electrónico local sería bueno, pero no crítico

Los pasos:

  • Descargue el último DVD-iso de CentOS (torrent funcionó muy bien para mí).

  • Instalar CentOS:
    mientras realizaba la instalación, verifiqué la opción Componentes del servidor pensando que iba a usar otro administrador similar a Plesk. En retrospectiva, considerando que he decidido intentar seguir mi propio camino, esta probablemente no fue la mejor idea.

  • Configuración básica:
    configuración de usuarios, red / dirección IP, etc. Actualización / actualización de Yum.

  • Actualizar PHP / MySQL:
    para actualizar PHP y MySQL a las últimas versiones, tuve que buscar otro repositorio fuera de CentOS. IUS se ve muy bien y estoy feliz de haberlo encontrado.
  • Agregue el repositorio IUS a nuestro administrador de paquetes

    cd /tmp
    wget http://dl.iuscommunity.org/pub/ius/stable/Redhat/5/x86_64/epel-release-1-1.ius.el5.noarch.rpm
    rpm -Uvh epel-release-1-1.ius.el5.noarch.rpm
    wget http://dl.iuscommunity.org/pub/ius/stable/Redhat/5/x86_64/ius-release-1-4.ius.el5.noarch.rpm
    rpm -Uvh ius-release-1-4.ius.el5.noarch.rpm
    yum list | grep -w \.ius\. # list all the packages in the IUS repository; use this to find PHP/MySQL version and libraries you want to install
    

    Elimine la versión anterior de PHP e instale la versión más nueva de IUS

    rpm -qa | grep php # to list all of the installed php packages we want to remove
    yum shell  # open an interactive yum shell
    remove php-common php-mysql php-cli #remove installed PHP components
    install php53 php53-mysql php53-cli php53-common #add packages you want
    transaction solve #important!! checks for dependencies
    transaction run #important!! does the actual installation of packages.
    [control+d] #exit yum shell
    php -v
    PHP 5.3.2 (cli) (built: Apr  6 2010 18:13:45)
    

    Actualice MySQL desde el repositorio IUS

    /etc/init.d/mysqld stop
    rpm -qa | grep mysql # to see installed mysql packages
    yum shell
    remove mysql mysql-server #remove installed MySQL components
    install mysql51 mysql51-server mysql51-devel
    transaction solve #important!! checks for dependencies
    transaction run #important!! does the actual installation of packages.
    [control+d] #exit yum shell
    service mysqld start
    
    mysql -v
    Server version: 5.1.42-ius Distributed by The IUS Community Project
    

    Instrucciones de actualización cortesía de IUS wiki: http://wiki.iuscommunity.org/Doc/ClientUsageGuide .


  • Instale rssh (shell restringido) para proporcionar scpy sftpacceder, sin permitir el sshinicio de sesión
  • cd /tmp
    wget http://dag.wieers.com/rpm/packages/rssh/rssh-2.3.2-1.2.el5.rf.x86_64.rpm
    rpm -ivh rssh-2.3.2-1.2.el5.rf.x86_64.rpm
    useradd -m -d /home/dev -s /usr/bin/rssh dev
    passwd dev
    

    Editar /etc/rssh.confpara otorgar acceso a SFTP a los usuarios de rssh.

    vi /etc/rssh.conf
    

    Descomentar o agregar:

    allowscp
    allowsftp
    

    Esto me permite conectarme a la máquina a través del protocolo SFTP en Transmitir (mi programa FTP preferido; estoy seguro de que es similar a otras aplicaciones FTP).

    instrucciones de rssh apropiadas (con agradecimiento) de http://www.cyberciti.biz/tips/linux-unix-restrict-shell-access-with-rssh.html .


  • Configurar interfaces virtuales
  • ifconfig eth1:1 192.168.1.3 up #start up the virtual interface
    cd /etc/sysconfig/network-scripts/
    cp ifcfg-eth1 ifcfg-eth1:1 #copy default script and match name to our virtual interface
    vi ifcfg-eth1:1 #modify eth1:1 script
    

    # ifcfg-eth1: 1 | modificar para que se vea así:
    DISPOSITIVO = eth1: 1
    IPADDR = 192.168.1.3
    NETMASK = 255.255.255.0
    NETWORK = 192.168.1.0
    ONBOOT = yes
    NAME = eth1: 1

    Agregue más interfaces virtuales según sea necesario repitiendo. Debido a la ONBOOT=yeslínea en el archivo ifcfg-eth1: 1, esta interfaz se abrirá cuando el sistema se inicie o la red se inicie / reinicie.

    service network restart
    

    Cerrar la interfaz eth0: [OK]
    Cerrar la interfaz eth1: [OK]
    Cerrar la interfaz loopback: [OK]
    Abrir la interfaz loopback: [OK]
    Abrir la interfaz eth0: [OK]
    Abrir la interfaz eth1: [OK]

    ping 192.168.1.3
    

    64 bytes de 192.168.1.3: icmp_seq = 1 ttl = 64 tiempo = 0.105 ms


  • Virtualhosts
  • En la sección rssh anterior, agregué un usuario para usar para SFTP. En el directorio de inicio de este usuario, creé una carpeta llamada 'https'. Aquí es donde vivirán los documentos de este sitio, así que necesito agregar un host virtual que lo señale. Usaré la interfaz virtual anterior para este sitio (en este documento llamado dev.site.local).

    vi /etc/http/conf/httpd.conf
    

    Agregue lo siguiente al final de httpd.conf:

    <VirtualHost 192.168.1.3:80>  
        ServerAdmin [email protected]  
        DocumentRoot /home/dev/https  
        ServerName dev.site.local  
        ErrorLog /home/dev/logs/error_log  
        TransferLog /home/dev/logs/access_log  
    </VirtualHost>  
    

    Puse un archivo index.html ficticio en el directorio https solo para verificar todo. Traté de buscarlo, y me encontré con un permiso denegado errores. Los registros solo daban una oscura referencia a lo que estaba sucediendo:

    [Lun 17 de mayo 14:57:11 2010] [error] [cliente 192.168.1.100] (13) Permiso denegado: acceso a /index.html denegado

    Probé chmod 777 et. al., pero fue en vano. Resulta que necesitaba chmod + x el directorio https y sus directorios principales.

    chmod +x /home
    chmod +x /home/dev
    chmod +x /home/dev/https
    

    Esto resolvió ese problema.


  • DNS
  • Estoy manejando DNS a través de nuestro cuadro local de Windows Server 2003. Sin embargo, la documentación de CentOS para BIND se puede encontrar aquí: http://www.centos.org/docs/5/html/Deployment_Guide-en-US/ch-bind.html


  • SSL
  • Para que SSL funcione, cambié lo siguiente en httpd.conf:

    NameVirtualHost 192.168.1.3:443 #make sure this line is in httpd.conf 
    
    <VirtualHost 192.168.1.3:443>  #change port to 443
        ServerAdmin [email protected]  
        DocumentRoot /home/dev/https  
        ServerName dev.site.local  
        ErrorLog /home/dev/logs/error_log  
        TransferLog /home/dev/logs/access_log  
    </VirtualHost>  
    

    Desafortunadamente, sigo recibiendo errores (Código de error: ssl_error_rx_record_too_long) cuando intento acceder a una página con SSL. Como JamesHannah señaló con gracia a continuación , no había configurado las ubicaciones de los certificados en httpd.conf y, por lo tanto, estaba arrojando la página al broswer como el certificado que hacía que el navegador no funcionara.

    Entonces, primero, necesitaba configurar una CA y hacer archivos de certificado. Encontré un excelente (aunque antiguo) tutorial sobre el proceso aquí: http://www.debian-administration.org/articles/284 .

    Estos son los pasos relevantes que tomé de ese artículo:

    mkdir /home/CA
    cd /home/CA/
    mkdir newcerts private
    echo '01' > serial
    touch index.txt #this and the above command are for the database that will keep track of certs  
    

    Cree un openssl.cnfarchivo en el /home/CA/directorio y edítelo según el tutorial vinculado anteriormente. (Como referencia, mi archivo openssl.cnf terminado se veía así: http://pastebin.com/raw.php?i=hnZDij4T )

    openssl req -new -x509 -extensions v3_ca -keyout private/cakey.pem -out cacert.pem -days 3650 -config ./openssl.cnf #this creates the cacert.pem which gets distributed and imported to the browser(s)
    

    Modificado openssl.cnfnuevamente por instrucciones de tutorial.

    #generates certificate request, and key.pem which I renamed dev.key.pem.
    openssl req -sha1 -new -nodes -out dev.req.pem -config ./openssl.cnf 
    

    Modificado openssl.cnfnuevamente por instrucciones de tutorial.

    #create and sign certificate.
    openssl ca -out dev.cert.pem -md sha1 -config ./openssl.cnf -infiles dev.req.pem 
    

    ¡IMPORTANTE!

    Mueva los archivos y haga referencia a ellos desde httpd.conf en la nueva ubicación

    cp dev.cert.pem /home/dev/certs/cert.pem
    cp dev.key.pem /home/certs/key.pem
    

    Actualicé httpd.conf para reflejar los certificados y activar SSLEngine:

    NameVirtualHost 192.168.1.3:443 
    
    <VirtualHost 192.168.1.3:443>
        ServerAdmin [email protected]  
        DocumentRoot /home/dev/https  
        SSLEngine on
        SSLCertificateFile /home/dev/certs/cert.pem
        SSLCertificateKeyFile /home/dev/certs/key.pem
        ServerName dev.site.local
        ErrorLog /home/dev/logs/error_log
        TransferLog /home/dev/logs/access_log
    </VirtualHost>  
    

    Ponga CA cert.pem en un lugar accesible desde la web y descárguelo / impórtelo a mi navegador. Ahora puedo visitar https: //dev.site.local sin errores ni advertencias.


    Y aquí es donde estoy. Seguiré editando esto a medida que avance. Se agradecería cualquier consejo sobre cómo configurar el correo electrónico SSL y / o configurar una conexión segura a otro Box que será el servidor MySQL.

    drenaje pluvial
    fuente
    No entiendo por qué necesita las interfaces de red virtual?
    Milan Babuškov
    @ Milan porque tendré múltiples dominios / subdominios en esta máquina. Para usar VirtualHost y SSL Cada dominio / subdominio deberá tener su propia dirección IP. httpd.apache.org/docs/2.0/ssl/ssl_faq.html#vhosts
    stormdrain
    A mí me parece un desperdicio de direcciones IP, pero está bien. Alternativamente, puede usar diferentes puertos TCP / IP para cada dominio, todo en una sola IP. De esa forma, el servidor web depende menos de la configuración del sistema.
    Milan Babuškov
    1
    @ Milan: Como la configuración es solo local, tengo el lujo de tener muchas más direcciones IP disponibles de las que necesitaré. Descubrí que configurar interfaces adicionales es un proceso relativamente rápido e indoloro comparativamente. Si estuviera configurando este sistema para uso público, gracias a las actualizaciones Apache2.2.xy TLS, VirtualHost parece funcionar mejor con SSL: serverfault.com/questions/109766/…
    stormdrain
    1
    Recomiendo encarecidamente koltsoff.com/pub/securing-centos , un tutorial muy educativo sobre cómo proteger CentOS (la mayoría de los cuales es fácilmente aplicable a otras distribuciones), no cubre el alojamiento, pero todo lo que hay allí debe entenderse y aplicarse a cualquier servidor CentOS que no esté detrás de un firewall que entienda y controle.
    dunxd

    Respuestas:

    6

    Esta guía tiene muchas respuestas sobre el uso de SSL con Apache, le indica cómo crear un certificado autofirmado, cómo obtener un certificado adecuado de una autoridad de certificación (CA) reconocida y cómo crear su propia CA no confiable para crear un certificado certificado completo http://httpd.apache.org/docs/2.0/ssl/ssl_faq.html

    En cuanto a los hosts virtuales y SSL, cada host necesitará su propia dirección IP o una solución más sucia es alojarlos en diferentes puertos, que el estándar :443debido a la naturaleza de los certificados SSL, el alojamiento virtual basado en nombres no se lleva bien con SSL; por eso necesitas otro método para diferenciarte; diferentes puertos / IP.

    Configurar SSH es bastante fácil, ya debería estar ejecutándose en su servidor. Deberá hacer varias cosas para bloquearlo.

    PermitRootLogin no
    AllowGroups admins
    PubkeyAuthentication yes
    PermitEmptyPasswords no
    PasswordAuthentication no
    

    Se puede agregar a su /etc/ssh/sshd_configpara restringir el acceso raíz remoto y eliminar la autenticación de contraseña, en lugar de usar pares de claves públicos / privados para iniciar sesión.

    Para crear su par de claves SSH, puede usarlo puttygenen Windows; http://putty.very.rulez.org/download.html o puede crear el par de claves en un entorno Linux, así: ssh-keygen -b 2048 -t RSA -f my_keypair. Esto creará un my_keypairarchivo y un my_keypair.pubarchivo (solo nombrado para este ejemplo, podría sugerir nombrar su nombre de usuario o dejarlo -fy dejar que se genere ~/.ssh/id_rsa).

    Transfiera de manera segura my_keypaira su estación de trabajo, para acceso SSH futuro, esta es la clave privada, no debe compartirla con nadie. A continuación, en el servidor, crear $HOME/.sshsi no existe ya, mkdir ~/.sshy luego copiar la clave pública ( my_keypair.pub) para ~/.ssh/, si ya tiene authorized_keysen la ~/.sshcausa que haya hecho esto para otras cosas, se puede hacer cat my_keypair.pub >> authorized_keyspara añadir su clave pública, o cp my_keypair.pub authorized_keyssi No existe.

    Ahora ejecuta chmod 700 ~/.sshy chmod 644 ~/.ssh/my_keypair.pub ~/.ssh/authorized_keyspara establecer permisos. Puede guardar una copia de my_keypairen ~/.ssh/para su uso cuando se conecta a otras máquinas, pero que debe hacer chmod 600 ~/.ssh/my_keypairpara asegurarse de que nadie puede acceder lo contrario.

    Deberá agregar una cuenta de usuario normal para usted y agregarse a un grupo que no sea users, como adminsen mi ejemplo.

    Probablemente también desee agregar su usuario o grupo /etc/sudoerspara habilitar el sudouso, si aún no lo ha hecho. Esto se logra con el comando, visudoque es la única forma en que debe editar este archivo. visudoejecuta la comprobación de errores y sintaxis en su configuración antes de escribirla, evitando la pérdida de sudouso.

    username ALL=(ALL) ALL
    

    agregado a /etc/sudoerspermitirá usernameejecutar sudo yum install blahy le pedirá su propia contraseña. Esto es útil en caso de que tenga otros administradores o administradores temporales, no necesita compartir la contraseña de root.

    cpbills
    fuente
    Si crea un par de claves en Windows a partir de puttygen, tenga en cuenta que debe cambiar el formato de la clave pública una vez que la carga en el servidor. No recuerdo cómo, pero en YouTube hay un video.
    ESW
    1

    El problema con su configuración SSL es que en realidad no ha habilitado SSL, necesitaría las directivas de Apache para eso:

    SSLEngine on
    SSLCertificateFile /path/to/cert.pem
    SSLCertificateKeyFile /path/to/key.pem
    

    Sin esto, obtendrá esos errores de registro demasiado largos, porque en lugar de los encabezados SSL que su navegador esperaba, está obteniendo en su lugar solo la página web sin cifrar en una gran porción.

    JamesHannah
    fuente
    1
    (sin esto, todo lo que ha creado es un
    vhost
    1

    MySQL del paquete original es compatible con SSL. Para verificar su compilación MySQL, ejecute

    mysqladmin variables | grep ssl
    

    Deberías encontrar algo así have_ssl yes. Configurar opciones ssl-ca, ssl-keyy ssl-cert.

    Cree cuentas de usuario con requisitos SSL:

    create user@host identified by 'password'
    grant privilegelist on database.tables to user@host require ssl
    
    sumar
    fuente
    Gracias por la respuesta. Sin embargo, olvidé mencionar que también almacenaré archivos en el servidor db, por lo que parece que stunnel funcionará mejor en este caso.
    Stormdrain