1.問題の声明
与えられた
すぐに使えるDebianサーバー(ディストリビューションからインストール)
挑戦する
サーバー上のいくつかのプロジェクトの作業を整理して、それらを処理する人々が近隣のプロジェクトにアクセスできないようにします。
- ファイルシステムを参照する機能を、プロジェクトユーザーの特定のフォルダーに制限します。
- ユーザーがバイナリを実行する機能を制限する
- サーバーでポートを開く機能を制限します(何らかの方法でそれを異なる方法で作成する必要があります)
- システムへのユーザーの追加の自動化:フォルダー、Apache構成、mysqlまたはpostgresユーザーの作成
2.決定
- 2.0システムアップデート
- 2.1 SSH
- 2.2ファイルシステム
- 2.3 Apache
- 2.3.1ユーザー権利[apache2-mpm-itk]
- 2.3.2サイトごとに個別のtmp
- 2.3.3 Sendmail
- 2.4 FTP
- 2.5 MySQL + Postgres
- 2.6ファイアウォール
- 2.7 chroot
- 2.8自動化
2.0更新
パッケージの最新バージョンを配置します。 リポジトリのリストは次のとおりです。
# file: /etc/apt/sources.list # Yandex deb http://mirror.yandex.ru/debian/ lenny main deb http://mirror.yandex.ru/debian/ lenny contrib non-free deb-src http://mirror.yandex.ru/debian/ lenny main deb-src http://mirror.yandex.ru/debian/ lenny contrib non-free # Security fix deb http://security.debian.org/ lenny/updates main deb http://security.debian.org/ lenny/updates contrib non-free deb-src http://security.debian.org/ lenny/updates main deb-src http://security.debian.org/ lenny/updates contrib non-free
debian:~# apt-get update debian:~# apt-get dist-upgrade
2.1 SSHのキーの生成
パスフレーズを傍受する可能性を排除するために、サーバーに入るためのrsaキーを生成します。
neoveneficus@book:~$ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/neoveneficus/.ssh/id_rsa): /home/neoveneficus/.ssh/id_rsa already exists. Overwrite (y/n)? y Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/neoveneficus/.ssh/id_rsa. Your public key has been saved in /home/neoveneficus/.ssh/id_rsa.pub. The key fingerprint is: cb:07:dd:67:21:37:ab:93:e1:60:40:ce:0e:b8:b8:e3 neoveneficus@book The key's randomart image is: +--[ RSA 2048]----+ | . | | . + | |. . + . + | |.. o . . + + | |+ . o S . oo | |.o . + = . o | |.E . * o | | . o | | . | +-----------------+
注意してください-作業マシン上でキーが生成され、公開キーがサーバーにアップロードされます:
neoveneficus@book:~/.ssh$ scp ~/.ssh/id_rsa.pub root@217.212.252.146:.ssh/authorized_keys neoveneficus@book:~/.ssh$ cat ~/.ssh/id_rsa.pub | ssh root@217.212.252.146 "cat > ~/.ssh/authorized_keys; chmod 600 ~/.ssh/authorized_keys"
これで、設定に応じて、キーを使用して、パスワードの有無にかかわらず、サーバーを入力できます。 パスワードなしでキーを生成した場合、サーバーのセキュリティレベルは、マシン上の秘密キーのセキュリティレベルと同等であることを強調したいと思います。 注意してキーを保管してください。
2.2ファイルシステム。 ユーザーの権利。
ファイルシステムについて話しましょう。 ファイルシステムのルートにあるサイトに個別のフォルダーを割り当てることをお勧めします。
debian:~# cd / debian:/# mkdir -m 755 web
ユーザーのホームフォルダーは次のようになります。
- / web / site1
- / web / site2
ユーザーを作成し、権限を設定します。
debian:~# useradd site1 -b /web/ -m -U -s /bin/false debian:~# passwd site1 debian:~# chmod 754 /web/site1 debian:~# mkdir -p -m 754 /web/site1/public_html/www debian:~# mkdir -p -m 777 /web/site1/tmp debian:~# chmod +t /web/site1/tmp debian:~# chown -R site1:site1 /web/site1/
ユーザーsite1には、ホームフォルダー/ web / site1があります。 -mスイッチは、フォルダーが自動的に作成されることを意味します。 -U-ユーザーが配置される場所と同じグループが作成されます。 ユーザーにはシェルがありません。 Webからアクセスできるすべてのものは、public_htmlフォルダーに配置されます。 サブドメインが必要な場合は、wwwの隣のフォルダーにサブドメインを配置します。
2.3 Apache
2.3.1ユーザーの権利。 Apacheの変更[apache2-mpm-itk]
私たちが知っているように、デフォルトでは、Apache Webサーバーはサーバー上のすべてのサイトの単一ユーザーで実行されます。 これは、Webシェルを使用して、隣接プロジェクトのファイルを読み取ることができることを意味します。
この誤解を修正するには、修正版のapacheをインストールする必要があります。 このパッケージは、apache2-mpm-itkと呼ばれます。 パッケージをインストールした後、ファイルの構成で、サイトを処理するときにどのユーザーとグループのApacheを使用するかを指定できます。
debian:~# apt-get install apache2-mpm-itk
ユーザーとグループは、構成内の行で指定されます。
AssignUserId site1 site1
同時に、Webシェルを使用して、o + w権限を持つファイルを除き、プロジェクトのファイルを編集することはできません。
drwxr-xr-- 2 site1 site1 4096 5 10:17 . drwxr-xr-x 3 site1 site1 4096 5 10:14 .. -rwxr-x--- 1 site1 site1 0 5 10:14 index.php -rwxrw---- 1 site1 site1 0 5 10:17 tmp.txt
これを行うには、設定で次のように記述します。
AssignUserId www-data site1
したがって、Apacheはindex.phpを読み取り、実行してブラウザに送信できますが、変更することはできません。 また、tmp.txtは変更できます。
重要なポイント-ユーザーwww-dataからコンソールを禁止する必要があります
debian:~# usermod -s /bin/false www-data
2.3.2サイトごとに個別のtmp
近隣サイトからのセッションが含まれないようにします。 + phpがユーザーのホームディレクトリ上で終了しないようにします。
私たちのサイトの設定では、ディレクティブopen_basedir、upload_tmp_dir、session.save_pathを追加する必要があります
このような最小限の設定を取得します。
# file: /etc/apache2/sites-available/site1 <VirtualHost *:80> DocumentRoot "/web/site1/public_html/www/" ServerName "test1" ErrorLog /web/site1/error_log CustomLog /web/site1/access_log combined AssignUserId www-data site1 php_admin_value open_basedir "/web/site1/:." php_admin_value upload_tmp_dir "/web/site1/tmp" php_admin_value session.save_path "/web/site1/tmp" </VirtualHost>
構成を作成したら、次のコマンドを使用してサイトをアクティブにする必要があります。
debian:~# a2ensite site1
そして、構成を再読み取りします。
debian:~# /etc/init.d/apache2 reload
2.3.3 Sendmail
Sendmailを別のアイテムとして取り出したのはなぜですか? デフォルトでは機能しなかったからです。 私はいじくり回さなければなりませんでした。 最も簡単な方法をお教えします。 phpがレターを送信できるようにするために、次の操作を実行します。
# file: /etc/php5/apacge2/php.ini [ ] ++ sendmail_path = /usr/sbin/exim4 -t
Exim4構成用のexim4-configパッケージがあります(デフォルトではメール転送エージェントとして使用されます)。 次のように使用できます。
debian:~# dpkg-reconfigure exim4-config
その後、彼らは質問を始めます。 最初の(メール構成の一般的なタイプ)で答えます:
- ウェブサイト SMTPを使用して直接メールを送受信する
そして、構成の最後までEnterキーを押します。 これですべてが機能するはずです。
2.4 vsftpd
次に、FTPを扱いましょう。 Vsftpdがジョブに選択されました。
debian:~# apt-get install vsftpd
次に、構成を変更します。
# file:/etc/vsftpd.conf listen=YES # anonymous_enable=NO # FTP local_enable=YES # write_enable=YES dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES ascii_upload_enable=YES ascii_download_enable=YES ftpd_banner=Welcome to our FTP service. # "" chroot_local_user=YES secure_chroot_dir=/var/run/vsftpd pam_service_name=vsftpd rsa_cert_file=/etc/ssl/certs/vsftpd.pem
vsftpdデーモンに設定を再読み込みするように指示します。
debian:~# /etc/init.d/vsftpd reload
2.5 MySQL + PostgreSQL
MySQLを置きます
debian:~# apt-get install mysql-server phpmyadmin
新しいユーザーを作成します。
debian:~# echo "CREATE USER 'site1'@'localhost' IDENTIFIED BY '___site1'; GRANT USAGE ON * . * TO 'site1'@'localhost' IDENTIFIED BY '___site1' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0; CREATE DATABASE IF NOT EXISTS site1 DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci; ; GRANT ALL PRIVILEGES ON site1 . * TO 'site1'@'localhost';" | mysql --user=root --password=_mysqlroot mysql
Postgresを入れます
debian:~# apt-get install postgressql phppgadmin
postgresユーザーのパスワードを変更します。
debian:~# echo "\password" | sudo -u postgres psql Enter new password: __postgres Enter it again: __postgres
postgresユーザーのrootパスワードを設定した後、設定を修正する必要があります。 デフォルトでは、ローカルユーザーはパスワードを入力せずにスーパーユーザー権限でpsqlを実行できます。 修正中です。
#file /etc/postgresql/8.3/main/pg_hba.conf -- local all postgres ident sameuser -- local all all ident sameuser ++ local all postgres md5 ++ local all postgres md5
/etc/phppgadmin/apache.confで、外部からアクセスを開きます。
order deny,allow deny from all allow from 127.0.0.0/255.0.0.0 ::1/128 # allow from all
変更先:
order deny,allow deny from all allow from 127.0.0.0/255.0.0.0 ::1/128 # allow from all
apacheに設定を再読み込みするよう指示します。
debian:~# /etc/init.d/apache2 reload
Postgresには注意点が1つあります。 ユーザーには常に隣接するデータベースの名前が表示されます。 ユーザーがphppgadminのユーザーに注目しないように、構成を編集します。
# file:/etc/phppgadmin/config.inc.php -- $conf['owned_only'] = false; ++ $conf['owned_only'] = true;
ユーザーは次のコマンドで作成されます。
debian:~# echo "CREATE USER site1 WITH PASSWORD '___site1' NOCREATEDB NOINHERIT NOCREATEUSER ; CREATE DATABASE site1 owner site1;" | sudo -u postgres psql
2.6ファイアウォール
私たちの場合、目標は単純です-攻撃者がポートを開くのを防ぐためです。 したがって、解決策は簡単です。iptablesルールのニュアンスには触れませんが、arno-iptables-firewallパッケージを使用すると、生活が簡素化されます。 彼自身がインストール時に欲しいものを尋ねてきます。 以下の質問への回答。
debian:~# apt-get install arno-iptables-firewall * Do you want to manage the firewall setup with debconf? : * External network interfaces: eth0 * Open external TCP-portrs: 21 22 53 80 443 3128 5432 5001 5900 6881:6889 * Open external UDP-portrs: 53 3130 5001 6881:6889 * Internal network interfaces: < > * firewall'.
2.7 chroot環境でのApache2の起動[libapache2-mod-chroot経由]
chroot'ingとは何ですか? これは、環境から分離された特別な環境(サンドボックス)の作成です。 Apacheプロセスがホームフォルダーにアクセスできないようにします。 同時に、隔離された環境では、作業に必要なすべてのものを用意する必要があります。 最も簡単な方法は、libapache2-mod-chrootを使用することです。
debian:~# apt-get install libapache2-mod-chroot debian:~# a2enmod mod_chroot debian:~# /etc/init.d/apache2 restart
Chrootingは、Apacheに加えて、通常、追加のプログラム、ライブラリ、およびツールの束が通常必要であるという事実に関連した問題の束を持つ興味深いトピックです。 したがって、私は記事に記事を掲載せず、このトピックに関する優れた資料を紹介します。 lddプログラムを使用して、必要なものをすべて隔離された環境に持ち込みます。
sudouser.com/zapusk-web-servera-apache2-v-srede-chroot-v-debian-i-ubuntu.html
2.8新規ユーザーの追加の自動化
私は台本を書き始め、何でもできるモンスターは使うのが不便であることを悟りました。 この記事では、すべてのコマンドは、shスクリプトに簡単に押し込めるように作成されています。 したがって、数分で各ユーザーは自分にとって必要で便利なスクリプトを簡単に作成できると思います。
追記
コメントをお待ちしております。 chrootについての考えは特に興味深いです。 誰が簡単なレシピを知っていますか?