Назад | Перейти на главную страницу

От А до Я настройки Linux-бокса для безопасного локального хостинга

Я занимаюсь переустановкой ОС на машине, которая будет использоваться для размещения нескольких приложений для нашего бизнеса. Приложения будут только локальными; доступ от внешних клиентов будет только через VPN.

Предыдущая установка использовала панель управления хостингом (Plesk) для большей части администратора, и я рассматривал возможность использования другого аналогичного программного обеспечения для переустановки, но я решил, что наконец-то должен узнать, как все это работает. Я могу делать большую часть того, что могло бы сделать программное обеспечение для меня, но мне неясен симбиоз всего этого. Все это попытка еще больше дистанцироваться от страны Программист-конфигуратор / программист, если вообще возможно.

Я нигде не могу найти полное пошаговое руководство для того, что я ищу, поэтому я подумал, что поставлю этот вопрос, и если люди могут помочь мне в пути, я отредактирую его с ответами и задокументирую свой прогресс / подводные камни. Надеюсь, когда-нибудь это поможет кому-нибудь в будущем.

Детали:

Требования:

Шаги:

  • Загрузите последнюю версию CentOS DVD-iso (торрент у меня отлично работал).

  • Установите CentOS:
    Во время установки я проверил опцию «Серверные компоненты», думая, что буду использовать другого администратора, подобного Plesk. Оглядываясь назад, учитывая, что я решил пойти своим путем, это, вероятно, не лучшая идея.

  • Базовая конфигурация:
    Настроить пользователей, сеть / IP-адрес и т. Д. Yum update / upgrade.

  • Обновите PHP / MySQL:
    Чтобы обновить PHP и MySQL до последних версий, мне пришлось искать другое репо за пределами CentOS. ВМС выглядит великолепно, и я рада, что нашла его!
  • Добавить репозиторий IUS в наш менеджер пакетов

    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
    

    Удалите старую версию PHP и установите новую версию из 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)
    

    Обновите MySQL из репозитория 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
    

    Инструкции по обновлению любезно предоставлены IUS wiki: http://wiki.iuscommunity.org/Doc/ClientUsageGuide.


  • Установите rssh (ограниченная оболочка), чтобы предоставить scp и sftp доступ, без разрешения ssh авторизоваться
  • 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
    

    редактировать /etc/rssh.conf для предоставления доступа к SFTP пользователям rssh.

    vi /etc/rssh.conf
    

    Раскомментируйте или добавьте:

    allowscp
    allowsftp
    

    Это позволяет мне подключаться к машине через протокол SFTP в Transmit (моя любимая программа FTP; я уверен, что она похожа на другие приложения FTP).

    rssh инструкции, присвоенные (с признательностью!) от http://www.cyberciti.biz/tips/linux-unix-restrict-shell-access-with-rssh.html.


  • Настроить виртуальные интерфейсы
  • 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 | измените так, чтобы он выглядел так:
    УСТРОЙСТВО = eth1: 1
    IPADDR = 192.168.1.3
    NETMASK = 255.255.255.0
    СЕТЬ = 192.168.1.0
    ONBOOT = да
    ИМЯ = eth1: 1

    При необходимости добавьте больше виртуальных интерфейсов, повторив. Из-за ONBOOT=yes в файле ifcfg-eth1: 1, этот интерфейс будет запущен при загрузке системы или при запуске / перезапуске сети.

    service network restart
    

    Завершение работы интерфейса eth0: [OK]
    Выключение интерфейса eth1: [OK]
    Завершение работы интерфейса обратной петли: [OK]
    Запуск интерфейса обратной связи: [OK]
    Вызов интерфейса eth0: [OK]
    Вызов интерфейса eth1: [OK]

    ping 192.168.1.3
    

    64 байта из 192.168.1.3: icmp_seq = 1 ttl = 64 time = 0.105 мс


  • Виртуальные хосты
  • В разделе rssh выше я добавил пользователя, который будет использовать SFTP. В домашнем каталоге этого пользователя я создал папку с названием «https». Здесь будут находиться документы для этого сайта, поэтому мне нужно добавить виртуальный хост, который будет указывать на него. Я буду использовать указанный выше виртуальный интерфейс для этого сайта (здесь он называется dev.site.local).

    vi /etc/http/conf/httpd.conf
    

    Добавьте в конец httpd.conf следующее:

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

    Я помещаю фиктивный файл index.html в каталог https, чтобы все проверить. Я попытался перейти к нему и был встречен с ошибками с отказом в разрешении. Журналы давали лишь непонятную ссылку на то, что происходило:

    [Пн 17 мая, 14:57:11 2010] [ошибка] [клиент 192.168.1.100] (13) В доступе отказано: доступ к /index.html запрещен

    Пробовал chmod 777 et. др., но безуспешно. Оказывается, мне нужно было выполнить команду chmod + x для каталога https и его родительских каталогов.

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

    Это решило эту проблему.


  • DNS
  • Я обрабатываю DNS через наш локальный сервер Windows Server 2003. Однако документацию CentOS для BIND можно найти здесь: http://www.centos.org/docs/5/html/Deployment_Guide-en-US/ch-bind.html


  • SSL
  • Чтобы SSL работал, я изменил следующее в 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 dev@site.local  
        DocumentRoot /home/dev/https  
        ServerName dev.site.local  
        ErrorLog /home/dev/logs/error_log  
        TransferLog /home/dev/logs/access_log  
    </VirtualHost>  
    

    К сожалению, я продолжаю получать ошибки (код ошибки: ssl_error_rx_record_too_long) при попытке доступа к странице с помощью SSL. Как Джеймс Ханна изящно указано ниже, Я не устанавливал расположение сертификатов в httpd.conf и, таким образом, получал страницу, брошенную браузеру, как сертификат, заставляющий браузер блокироваться.

    Итак, сначала мне нужно было настроить CA и сделать файлы сертификатов. Я нашел отличное (если и старое) пошаговое руководство по процессу здесь: http://www.debian-administration.org/articles/284.

    Вот соответствующие шаги, которые я сделал из этой статьи:

    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  
    

    Создать openssl.cnf файл в /home/CA/ dir и отредактируйте его в соответствии с пошаговым руководством, указанным выше. (Для справки, мой готовый файл openssl.cnf выглядел так: 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)
    

    Изменено openssl.cnf снова в соответствии с инструкциями по прохождению.

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

    Изменено openssl.cnf снова в соответствии с инструкциями по прохождению.

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

    ВАЖНЫЙ!

    Переместите файлы и укажите на них ссылку из httpd.conf в новом месте

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

    Я обновил httpd.conf, чтобы отразить сертификаты и включить SSLEngine:

    NameVirtualHost 192.168.1.3:443 
    
    <VirtualHost 192.168.1.3:443>
        ServerAdmin dev@site.local  
        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>  
    

    Поместите CA cert.pem в доступное в Интернете место и загрузите / импортируйте его в свой браузер. Теперь я могу посетить https: //dev.site.local без ошибок и предупреждений.


    И вот где я нахожусь. Я буду редактировать это по мере продвижения. Любые советы о том, как настроить электронную почту SSL и / или настроить безопасное соединение с другим Box, который будет сервером MySQL, будут оценены.

    В этом руководстве есть много ответов об использовании SSL с Apache, рассказывается, как создать самозаверяющий сертификат, как получить правильный сертификат от признанного центра сертификации (ЦС) и как создать свой собственный ненадежный ЦС для создания полный сертификат. http://httpd.apache.org/docs/2.0/ssl/ssl_faq.html

    Что касается виртуальных хостов и SSL, каждому хосту потребуется свой собственный IP-адрес, или более грязное решение - разместить их на разных портах, чем стандартные. :443 из-за природы SSL-сертификатов виртуальный хостинг на основе имен не работает с SSL; вот почему вам нужен другой метод, чтобы различать; разные порты / IP-адреса.

    Настроить SSH довольно просто, он уже должен быть запущен на вашем сервере. Вам нужно будет сделать несколько вещей, чтобы заблокировать его.

    PermitRootLogin no
    AllowGroups admins
    PubkeyAuthentication yes
    PermitEmptyPasswords no
    PasswordAuthentication no
    

    Его можно добавить в свой /etc/ssh/sshd_config для ограничения удаленного корневого доступа и удаления аутентификации по паролю, вместо этого для входа в систему используются общедоступные / закрытые пары ключей.

    Чтобы создать свою пару ключей SSH, вы можете использовать puttygen в Windows; http://putty.very.rulez.org/download.html или вы можете создать пару ключей в среде Linux следующим образом: ssh-keygen -b 2048 -t RSA -f my_keypair. Это создаст my_keypair файл и my_keypair.pub файл (назван только для этого примера, я мог бы предложить назвать ваше имя пользователя или оставить -f, и позволяя ему генерировать ~/.ssh/id_rsa).

    Надежно передать my_keypair на вашу рабочую станцию, для будущего доступа по SSH, это закрытый ключ, вы не должны никому его передавать. Затем на сервере создайте $HOME/.ssh если он еще не существует, mkdir ~/.ssh, затем скопируйте открытый ключ (my_keypair.pub) к ~/.ssh/, если у вас уже есть authorized_keys в ~/.ssh потому что вы сделали это для других вещей, вы можете сделать cat my_keypair.pub >> authorized_keys чтобы добавить свой открытый ключ, или cp my_keypair.pub authorized_keys если его не существует.

    Теперь беги chmod 700 ~/.ssh и chmod 644 ~/.ssh/my_keypair.pub ~/.ssh/authorized_keys установить разрешения. Вы можете сохранить копию my_keypair в ~/.ssh/ для использования при подключении к другим хостам, но вы должны сделать chmod 600 ~/.ssh/my_keypair чтобы убедиться, что никто другой не может получить к нему доступ.

    Вы захотите добавить для себя обычную учетную запись пользователя и добавить себя в группу, отличную от users, лайк admins в моем примере.

    Возможно, вы также захотите добавить своего пользователя или группу в /etc/sudoers включить sudo использование, если вы еще этого не сделали. Это выполняется с помощью команды visudo это единственный способ отредактировать этот файл. visudo выполняет проверку ошибок и синтаксиса в вашей конфигурации перед записью, предотвращая потерю sudo использование.

    username ALL=(ALL) ALL
    

    добавлен к /etc/sudoers позволит username бежать sudo yum install blah и запросит у вас собственный пароль. Это удобно, если у вас есть другие администраторы или временные администраторы, вам не нужно сообщать пароль root.

    MySQL из исходного пакета поддерживает SSL. Чтобы проверить свою сборку MySQL, запустите

    mysqladmin variables | grep ssl
    

    Вы должны найти что-то вроде have_ssl yes. Параметры настройки ssl-ca, ssl-key и ssl-cert.

    Создайте учетные записи пользователей с требованиями SSL:

    create user@host identified by 'password'
    grant privilegelist on database.tables to user@host require ssl
    

    Проблема с вашей конфигурацией SSL в том, что вы на самом деле не включен SSL, для этого вам понадобятся директивы Apache:

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

    Без этого вы получите слишком длинные записи с ошибками, потому что вместо заголовков SSL, которые ожидал ваш браузер, вместо этого он получает просто незашифрованную веб-страницу в большом фрагменте.