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

12

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

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

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

Детали:

  • CentOS 5.5 x86_64
  • httpd: Apache / 2.2.3
  • MySQL: 5.0.77 (подлежит обновлению)
  • PHP: 5.1 (будет обновлено)

Требования:

  • БЕЗОПАСНОСТЬ!!
    • Безопасная передача файлов
    • Безопасный клиентский доступ (SSL-сертификаты и CA)
    • Безопасное хранение данных
    • Безопасное соединение с другим локальным компьютером (MySQL)
  • Виртуальные хосты / несколько поддоменов
  • Локальная электронная почта была бы хороша, но не критична

Шаги:

  • Скачайте последнюю версию 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 | изменить так, чтобы это выглядело так:
    DEVICE = eth1: 1
    IPADDR = 192.168.1.3
    NETMASK = 255.255.255.0
    NETWORK = 192.168.1.0
    ONBOOT = yes
    NAME = 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 время = 0,105 мс


  • VirtualHosts
  • В разделе 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. al., но безрезультатно. Оказывается, мне нужно было 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/директории и отредактируйте его в соответствии с пошаговым описанием, указанным выше. (Для справки мой готовый файл 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.

    ливня
    источник
    Я не понимаю, зачем вам виртуальные сетевые интерфейсы?
    Милан Бабушков
    @Milan, потому что у меня будет несколько доменов / поддоменов на этом компьютере. Для использования VirtualHost и SSL Каждый домен / поддомен должен иметь свой собственный IP-адрес. httpd.apache.org/docs/2.0/ssl/ssl_faq.html#vhosts
    stormdrain
    Выглядит как пустая трата IP-адресов для меня, но хорошо. Кроме того, вы можете использовать разные порты TCP / IP для каждого домена - все на одном IP. Таким образом, веб-сервер меньше зависит от конфигурации системы.
    Милан Бабушков
    1
    @Milan: Поскольку настройка только локальная, я могу позволить себе гораздо больше доступных IP-адресов, чем мне когда-либо понадобится. Я обнаружил, что установка дополнительных интерфейсов довольно быстрый и безболезненный процесс. Если бы я настраивал эту систему для публичного использования, благодаря обновлениям Apache2.2.x и TLS, VirtualHost, кажется, лучше работает с SSL: serverfault.com/questions/109766/…
    stormdrain
    1
    Очень рекомендую koltsoff.com/pub/securing-centos - очень познавательное руководство по защите CentOS (большинство из которых легко применимы к другим дистрибутивам) - оно не охватывает хостинг, но все, что там есть, должно быть понято и применено к любой сервер CentOS, который не защищен брандмауэром, который вы понимаете и контролируете.
    dunxd

    Ответы:

    6

    В этом руководстве содержится много ответов об использовании SSL с Apache, рассказывается, как создать самозаверяющий сертификат, как получить надлежащий сертификат из признанного центра сертификации (CA) и как создать собственный ненадежный CA для создания полный сертификат. 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чтобы ограничить удаленный root-доступ и удалить аутентификацию по паролю, вместо этого используя открытые / закрытые пары ключей для входа в систему.

    Чтобы создать вашу пару ключей 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.

    cpbills
    источник
    Если вы создаете в Windows пару ключей из puttygen, имейте в виду, что вам нужно изменить формат открытого ключа, как только вы загрузите его на сервер. Я не помню, как, но YouTube это на самом деле видео.
    ESW
    1

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

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

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

    JamesHannah
    источник
    1
    (без этого все, что вы создали, - это обычные не-SSL хосты, прослушивающие порт 443)
    JamesHannah
    1

    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
    
    сумар
    источник
    Спасибо за ответ. Я забыл упомянуть, однако, что я также буду хранить файлы на сервере БД, так что похоже, что в этом случае stunnel будет работать лучше.
    буря