A hingga Z dalam menyiapkan kotak Linux untuk hosting lokal yang aman

12

Saya sedang dalam proses menginstal ulang OS pada mesin yang akan digunakan untuk meng-host beberapa aplikasi untuk bisnis kami. Aplikasi hanya akan bersifat lokal; akses dari klien eksternal hanya akan melalui VPN.

Pengaturan sebelumnya menggunakan panel kontrol hosting (Plesk) untuk sebagian besar admin, dan saya sedang melihat menggunakan perangkat lunak lain yang serupa untuk menginstal ulang - tetapi saya pikir saya akhirnya harus belajar bagaimana semuanya bekerja. Saya dapat melakukan sebagian besar hal yang akan dilakukan oleh perangkat lunak untuk saya, tetapi saya tidak jelas tentang simbiosis dari semuanya. Ini semua adalah upaya untuk menjauhkan diri dari tanah Programmer / Programmer Konfigurasi , jika memungkinkan.

Saya tidak dapat menemukan langkah-langkah lengkap di mana pun untuk apa yang saya cari, jadi saya pikir saya akan mengajukan pertanyaan ini, dan jika orang dapat membantu saya dalam perjalanan saya akan mengedit ini dengan jawaban, dan mendokumentasikan kemajuan saya / perangkap. Semoga suatu hari nanti ini akan membantu seseorang di telepon.

Rinciannya:

  • CentOS 5.5 x86_64
  • httpd: Apache / 2.2.3
  • MySQL: 5.0.77 (akan ditingkatkan)
  • PHP: 5.1 (akan ditingkatkan)

Persyaratan:

  • KEAMANAN!!
    • Transfer file aman
    • Akses klien aman (Sertifikat SSL dan CA)
    • Penyimpanan data yang aman
    • Koneksi aman ke mesin lokal lain (MySQL)
  • Virtualhosts / beberapa subdomain
  • Email lokal akan baik, tetapi tidak kritis

Langkah langkah:

  • Unduh CentOS DVD-iso terbaru (torrent berfungsi baik untuk saya).

  • Instal CentOS:
    Ketika sedang menginstal, saya memeriksa opsi Server Components dengan berpikir saya akan menggunakan admin lain yang mirip Plesk. Kalau dipikir-pikir, mengingat saya telah memutuskan untuk mencoba menempuh jalan saya sendiri, ini mungkin bukan ide terbaik.

  • Konfigurasi dasar:
    Pengaturan pengguna, jaringan / alamat IP, dll. Pembaruan / peningkatan Yum.

  • Upgrade PHP / MySQL:
    Untuk meningkatkan PHP dan MySQL ke versi terbaru, saya harus melihat repo lain di luar CentOS. IUS terlihat hebat dan saya senang saya menemukannya!
  • Tambahkan repositori IUS ke manajer paket kami

    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
    

    Hapus versi lama PHP dan instal versi yang lebih baru dari 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)
    

    Tingkatkan MySQL dari repositori 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
    

    Tingkatkan instruksi milik IUS wiki: http://wiki.iuscommunity.org/Doc/ClientUsageGuide .


  • Instal rssh (shell terbatas) untuk menyediakan scpdan sftpmengakses, tanpa mengizinkan sshmasuk
  • 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
    

    Edit /etc/rssh.confuntuk memberikan akses ke SFTP kepada pengguna rssh.

    vi /etc/rssh.conf
    

    Batalkan komentar atau tambahkan:

    allowscp
    allowsftp
    

    Ini memungkinkan saya untuk terhubung ke mesin melalui protokol SFTP di Transmit (program FTP pilihan saya; saya yakin itu mirip dengan aplikasi FTP lainnya).

    instruksi rssh disesuaikan (dengan apresiasi!) dari http://www.cyberciti.biz/tips/linux-unix-restrict-shell-access-with-rssh.html .


  • Siapkan antarmuka virtual
  • 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 | ubah sehingga terlihat seperti ini:
    PERANGKAT = eth1: 1
    IPADDR = 192.168.1.3
    NETMASK = 255.255.255.0
    NETWORK = 192.168.1.0
    ONBOOT = yes
    NAME = eth1: 1

    Tambahkan lebih banyak antarmuka virtual sesuai kebutuhan dengan mengulangi. Karena ONBOOT=yesbaris dalam file ifcfg-eth1: 1, antarmuka ini akan muncul ketika sistem melakukan boot, atau jaringan memulai / me-restart.

    service network restart
    

    Mematikan antarmuka eth0: [OK]
    Mematikan antarmuka eth1: [OK]
    Mematikan antarmuka loopback: [OK]
    Memunculkan antarmuka loopback: [OK]
    Memunculkan antarmuka eth0: [OK]
    Memunculkan antarmuka eth1: [OK] Memunculkan antarmuka eth1: [OK]

    ping 192.168.1.3
    

    64 byte dari 192.168.1.3: icmp_seq = 1 ttl = 64 waktu = 0,105 ms


  • Virtualhosts
  • Di bagian rssh di atas saya menambahkan pengguna untuk digunakan untuk SFTP. Di direktori home pengguna ini, saya membuat folder bernama 'https'. Di sinilah dokumen untuk situs ini akan hidup, jadi saya perlu menambahkan virtualhost yang akan menunjukkannya. Saya akan menggunakan antarmuka virtual di atas untuk situs ini (di sini disebut dev.site.local).

    vi /etc/http/conf/httpd.conf
    

    Tambahkan berikut ini ke akhir 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>  
    

    Saya meletakkan file index.html dummy di direktori https hanya untuk memeriksa semuanya. Saya mencoba menjelajahinya, dan mendapat izin yang ditolak kesalahannya. Log hanya memberikan referensi yang tidak jelas tentang apa yang sedang terjadi:

    [Senin 17 Mei 14:57:11 2010] [kesalahan] [klien 192.168.1.100] (13) Izin ditolak: akses ke /index.html ditolak

    Saya mencoba chmod 777 et. al., tetapi tidak berhasil. Ternyata, saya perlu chmod + x direktori https dan direktori induknya.

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

    Ini menyelesaikan masalah itu.


  • DNS
  • Saya menangani DNS melalui kotak Windows Server 2003 lokal kami. Namun, dokumentasi CentOS untuk BIND dapat ditemukan di sini: http://www.centos.org/docs/5/html/Deployment_Guide-en-US/ch-bind.html


  • SSL
  • Agar SSL berfungsi, saya mengubah yang berikut di 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>  
    

    Sayangnya, saya terus mendapatkan kesalahan (Kode galat: ssl_error_rx_record_too_long) ketika mencoba mengakses halaman dengan SSL. Seperti yang ditunjukkan oleh James Hannah dengan anggun di bawah ini , saya belum mengatur lokasi sertifikat di httpd.conf, dan dengan demikian mendapatkan halaman yang dilemparkan ke bros sebagai sertifikat membuat browser menolak.

    Jadi pertama-tama, saya perlu mengatur CA dan membuat file sertifikat. Saya menemukan langkah-langkah (jika tua) yang hebat pada proses di sini: http://www.debian-administration.org/articles/284 .

    Berikut langkah-langkah relevan yang saya ambil dari artikel itu:

    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  
    

    Buat openssl.cnffile di /home/CA/dir dan edit per walkthrough yang ditautkan di atas. (Untuk referensi, file openssl.cnf saya yang sudah selesai tampak seperti ini: 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)
    

    Dimodifikasi openssl.cnflagi per petunjuk langkah-langkah.

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

    Dimodifikasi openssl.cnflagi per petunjuk langkah-langkah.

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

    PENTING!

    Pindahkan file dan rujuk dari httpd.conf di lokasi baru

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

    Saya memperbarui httpd.conf untuk mencerminkan sertifikat dan mengaktifkan SSLEngine pada:

    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>  
    

    Masukkan CA cert.pem di tempat yang dapat diakses web, dan unduh / impor ke browser saya. Sekarang saya dapat mengunjungi https: //dev.site.local tanpa kesalahan atau peringatan.


    Dan inilah tempat saya berada. Saya akan terus mengedit ini saat saya membuat kemajuan. Setiap tips tentang cara mengkonfigurasi email SSL, dan / atau mengkonfigurasi koneksi aman ke Box lain yang akan menjadi server MySQL akan dihargai.

    stormdrain
    sumber
    Saya tidak mengerti mengapa Anda membutuhkan antarmuka jaringan virtual?
    Milan Babuškov
    @Milan karena saya akan memiliki beberapa domain / subdomain di mesin ini. Untuk menggunakan VirtualHost dan SSL, Setiap domain / subdomain harus memiliki alamat IP sendiri. httpd.apache.org/docs/2.0/ssl/ssl_faq.html#vhosts
    stormdrain
    Sepertinya saya membuang-buang alamat IP, tapi ok. Atau, Anda dapat menggunakan port TCP / IP yang berbeda untuk setiap domain - semua pada IP tunggal. Dengan begitu server web kurang tergantung pada konfigurasi sistem.
    Milan Babuškov
    1
    @Milan: Karena pengaturannya hanya lokal, saya memiliki kemewahan berupa lebih banyak alamat IP yang tersedia daripada yang saya perlukan. Mengatur antarmuka tambahan, saya temukan, adalah proses yang agak cepat dan tidak menyakitkan dibandingkan. Jika saya menyiapkan sistem ini untuk penggunaan umum, terima kasih untuk peningkatan Apache2.2.x dan TLS, VirtualHost tampaknya bekerja lebih baik dengan SSL: serverfault.com/questions/109766/…
    stormdrain
    1
    Akan sangat merekomendasikan koltsoff.com/pub/securing-centos - panduan yang sangat mendidik tentang pengamanan CentOS (sebagian besar mudah diterapkan ke distro lain) - tidak mencakup hosting, tetapi semua yang ada di sana harus dipahami dan diterapkan ke server CentOS yang tidak berada di belakang firewall yang Anda pahami dan kendalikan.
    dunxd

    Jawaban:

    6

    Panduan ini memiliki banyak jawaban tentang penggunaan SSL dengan Apache, memberi tahu Anda cara membuat sertifikat yang ditandatangani sendiri, cara mendapatkan sertifikat yang tepat dari otoritas sertifikat yang diakui (CA) dan cara membuat CA Anda sendiri, tidak dipercaya untuk membuat sertifikat lengkap. http://httpd.apache.org/docs/2.0/ssl/ssl_faq.html

    Sedangkan untuk host virtual dan SSL, setiap host akan memerlukan alamat IP sendiri atau solusi yang lebih kotor adalah untuk menampung mereka di port yang berbeda, daripada standar :443karena sifat sertifikat SSL, hosting virtual berbasis nama tidak cocok dengan SSL; itulah sebabnya Anda perlu metode lain untuk membedakan; port / IP berbeda.

    Menyiapkan SSH cukup mudah, itu seharusnya sudah berjalan di server Anda. Anda akan ingin melakukan sejumlah hal untuk menguncinya.

    PermitRootLogin no
    AllowGroups admins
    PubkeyAuthentication yes
    PermitEmptyPasswords no
    PasswordAuthentication no
    

    Ini dapat ditambahkan ke Anda /etc/ssh/sshd_configuntuk membatasi akses root jarak jauh, dan menghapus otentikasi kata sandi, alih-alih menggunakan keypairs publik / pribadi untuk masuk.

    Untuk membuat keypair SSH Anda, Anda dapat menggunakannya puttygendi Windows; http://putty.very.rulez.org/download.html atau Anda dapat menciptakan keypair di lingkungan Linux seperti: ssh-keygen -b 2048 -t RSA -f my_keypair. Ini akan membuat my_keypairfile dan my_keypair.pubfile (hanya diberi nama untuk contoh ini, saya mungkin menyarankan penamaan untuk nama pengguna Anda atau meninggalkan -f, dan membiarkannya menghasilkan ~/.ssh/id_rsa).

    Transfer my_keypairke workstation Anda dengan aman, untuk akses SSH di masa depan, ini adalah kunci pribadi, Anda tidak boleh membaginya dengan siapa pun. Kemudian, di server, buat $HOME/.sshjika belum ada,, mkdir ~/.sshlalu salin kunci publik ( my_keypair.pub) ke ~/.ssh/, jika Anda sudah authorized_keysmasuk ~/.sshkarena Anda telah melakukan ini untuk hal-hal lain, Anda dapat lakukan cat my_keypair.pub >> authorized_keysuntuk menambahkan kunci publik Anda, atau cp my_keypair.pub authorized_keysjika itu tidak ada.

    Sekarang jalankan chmod 700 ~/.sshdan chmod 644 ~/.ssh/my_keypair.pub ~/.ssh/authorized_keysuntuk mengatur izin. Anda dapat menyimpan salinan my_keypairdalam ~/.ssh/untuk digunakan saat menghubungkan ke host lain, tetapi Anda harus melakukannya chmod 600 ~/.ssh/my_keypairuntuk memastikan tidak ada orang lain yang dapat mengaksesnya.

    Anda ingin menambahkan akun pengguna normal untuk diri sendiri, dan menambahkan diri Anda ke grup selain users, seperti adminsdalam contoh saya.

    Anda mungkin juga ingin menambahkan pengguna atau grup Anda /etc/sudoersuntuk mengaktifkan sudopenggunaan, jika Anda belum melakukannya. Ini dilakukan dengan perintah visudoyang merupakan satu-satunya cara Anda mengedit file ini. visudomenjalankan kesalahan dan sintaks memeriksa konfigurasi Anda sebelum menuliskannya, mencegah hilangnya sudopenggunaan.

    username ALL=(ALL) ALL
    

    ditambahkan ke /etc/sudoersakan memungkinkan usernameuntuk berjalan sudo yum install blahdan akan meminta Anda untuk kata sandi Anda sendiri. Ini berguna jika Anda memiliki administrator lain atau administrator sementara, Anda tidak perlu membagikan kata sandi root.

    cpbills
    sumber
    Jika Anda membuat keypair di windows dari puttygen, perlu diketahui bahwa Anda harus mengubah format kunci publik setelah Anda mengunggahnya ke server. Saya tidak ingat bagaimana tapi di youtube sebenarnya ada video.
    ESW
    1

    Masalah dengan konfigurasi SSL Anda adalah Anda belum benar-benar mengaktifkan SSL, Anda memerlukan arahan Apache untuk itu:

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

    Tanpa ini Anda akan mendapatkan catatan yang terlalu lama kesalahan, itu karena bukan header SSL yang diharapkan browser Anda, itu mendapatkan hanya halaman web tidak terenkripsi dalam potongan besar.

    James Hannah
    sumber
    1
    (tanpa ini, semua yang Anda buat adalah mendengarkan vhost non-SSL reguler pada port 443)
    JamesHannah
    1

    MySQL dari paket asli mendukung SSL. Untuk memeriksa build MySQL Anda, jalankan

    mysqladmin variables | grep ssl
    

    Anda harus menemukan sesuatu seperti have_ssl yes. Atur opsi ssl-ca, ssl-keydan ssl-cert.

    Buat akun pengguna dengan persyaratan SSL:

    create user@host identified by 'password'
    grant privilegelist on database.tables to user@host require ssl
    
    sumar
    sumber
    Terima kasih atas tanggapannya. Saya lupa menyebutkan, bahwa saya juga akan menyimpan file di server db sehingga sepertinya stunnel akan bekerja lebih baik dalam hal ini.
    stormdrain