2008年3月17日月曜日

《OpenSSHのによるセキュアな環境の構築》

リモート環境で拠点間に通信を行う場合は、OpenVPN等でレイヤー2・3で接続すると、完全なLAN環境が構築できる。だが実際サーバのリモートサーバのメンテナンスやリモート側の特定のサービス(ポート)のみを使用したい場合はSSHが手軽で便利である。

OpenSSHのインストール&設定

rpmからサーバをインストール(用途によってはソースからコンパイルすべし)

> yum -y install openssh.i386

/etc/ssh/sshd_configを下記部分を編集

Protocol 2
HostKey /etc/ssh/ssh_host_rsa_key
ServerKeyBits 1024
SyslogFacility AUTHPRIV
PermitRootLogin no
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile      .ssh/authorized_keys
PermitEmptyPasswords no
PasswordAuthentication no
ChallengeResponseAuthentication no
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
UsePAM yes
AllowUsers (ユーザー名)

上記が最低限の設定。RSAのpubkeyのみでの接続を許可。少数人数のユーザーしか使用しない場合はAllowUsersを設定すると良い。また、Bannerなども変更しておくと良い(これは人によって考え方が違うみたい。。

実際のサーバ運用をする際には、swatchによる攻撃や正常ログインの監視及びiptablesを使用したsshblacklist等をお勧めする(別の記事にて今度書きます)

次にクライアントのRSAキーを生成する。

>ssh-keygen -t rsa -b 2048

Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):
Created directory '/home/user/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:省略

生成したキーに対して下記の処理を行う。(権限の設定)

>cd $HOME/.ssh
>cat id_rsa.pub > authorized_keys
>chmod 600 authorized_keys

ssh -l ユーザー名 -i id_rsaキーの場所 ホスト名 などで接続できれば設定成功。

上記のauthorized_keysに下記のオプションを設定することにより、ユーザー毎の接続を制御できる。

  • command="command" ssh接続した際に指定されたコマンドを上書き実行。クライアントからの任意のコマンドを防ぐことができる
  • environment="NAME=value"  ログイン時の環境変数設定
  • no-agent-forwarding agent-forwardingを禁止する
  • no-port-forwarding port-forwardingを禁止する
  • no-pty 仮想端末を割り当てない
  • no-X11-forwarding X11フォワーディングを禁止する
  • permitopen="host:port" 特定のホスト・ポートのみポートフォワードを許可する。Localフォワードはさせずに、Remoteフォワードだけさせる場合は存在しないホスト・ポートを指定すればよい
  • tunnel="n" ssh vpn 接続を許容するかどうか(tunによるsshvpnの接続は別機会に書きます)

Puttyの設定&接続

putty.exe,puttygen.exeをダウンロードする。

ssh-keygenで生成した、id_rsaキーをputtygen.exeにて開く。

image

"Save private key"にてputty用に変換されたキーを保存。

putty.exeを実行し、 Category->Connection->SSH->Authのprivate keyに生成したキーの場所を指定。ホスト・ポート・ユーザー名等を設定後、接続ができればOK

local・remoteのポートフォワーディングは便利で手放せない。またputty自体はレジストリに接続情報を保存するので、別環境で同様な設定を移行するのが面倒だ。これを解決するのが[portaputty]である。単純に設定ファイルを.puttyディレクトリに保存してくれるだけで他は通常のputtyと同機能だ。

WinsSCPの設定&接続

winScpのリンクからダウンロードし、インストールを行う。

後は、ユーザー名・パスワードもしくはprivate keyを設定し、puttyと同様にホスト名・ポートを指定するだけでよくあるFTPのguiソフトと同様な画面が現れる。後はDND経由でもファイルupload&downloadが可能だ。pscp.exeというputtyのツールもあるのだが、これはコマンドラインインターフェイスなのでバッチで処理を組むときに便利だ。

 

Tipsなど

sshを使用する際、rsa/dsa鍵認証でパスフレーズつきで運用している。これはセキュリティ的には良いが、バッチなどで処理の自動化を行いたい場合passphraseに対応したソフトでないといけない。Antやputty.exeなどはパスフレーズに対応しているので非常に便利だ。

2008年3月7日金曜日

《Rails postgres-pr-0.4.0 バグ》

x86_64環境での postgres-pr-0.4.0がなぜかエラーでこける。。

cannot read beyond the end of buffer

/usr/local/lib/ruby/gems/1.8/gems/postgres-pr-0.4.0/lib/buffer.rb:47:in `read'
/usr/local/lib/ruby/gems/1.8/gems/postgres-pr-0.4.0/lib/postgres-pr/message.rb:284:in `parse'
/usr/local/lib/ruby/gems/1.8/gems/activesupport-1.3.1/lib/active_support/dependencies.rb:140:in `collect'
/usr/local/lib/ruby/gems/1.8/gems/postgres-pr-0.4.0/lib/postgres-pr/message.rb:279:in `parse'
/usr/local/lib/ruby/gems/1.8/gems/postgres-pr-0.4.0/lib/postgres-pr/message.rb:67:in `parse'
/usr/local/lib/ruby/gems/1.8/gems/postgres-pr-0.4.0/lib/postgres-pr/message.rb:277:in `parse'

調べたところ、rubyforgeのトラッカーに次のようなバグを発見した。

https://rubyforge.org/tracker/index.php?func=detail&aid=3725&group_id=234&atid=967

結論は、x86_64の環境でpostgres-pr-0.4.0の"buffer.rb:47:in `read'"にバグがあり実行できないようだ。。(はまった)

postgresへのアクセスをruby-postgresに変更することにした。

http://ruby.scripting.ca/postgres/

yum -y install postgresql-devel wget http://ruby.scripting.ca/postgres/archive/ruby-postgres-0.7.1.tar.gz tar xzvf ruby-postgres-0.7.1.tar.gz ruby extconf.rb --with-pgsql-include-dir=<include file directory> \--with-pgsql-lib-dir=<library directory> make su make install

postgres-pr-0.4.0をイントールしたままでも、ruby-postgresで優先的にアクセスされるようだ。

2008年3月6日木曜日

《Eclipse PDTによるPHP開発環境の構築》

今まではjava言語を中心に開発をしてきたが、最近はweb開発ではPHPやrubyを採用することも多くなってきた。

生産性の高い(使い勝手の良い)開発環境を構築することは、品質のよいWEBアプリを作成する上でも重要である。

Eclipse PDTの設定

PDTをダウンロード&解凍し、pdt-all-in-one-R20080103-win32\eclipse\eclipse.exeを起動。(workspaceをプロジェクト毎に設定する場合は、eclipse.exeのショートカットを作成し引数に[-data 使用するworkspaceディレクトリパス]を指定すると楽)

初期起動画面(non project)image

Window->preferences →PHP ->PHP Executable にてPHPランタイム指定image

Window->preferences →PHP ->PHP Servers にてURLの変更(今回はhttp://localhost:8080とした)

image

その他設定

・Code Foldingの Enable foldingのチェックをはずす(関数表示をデフォルトで折りたたむを解除)

PHPプロジェクトの作成

File->new->projectからPHP->PHP project作成を実行(今回はtestProjectとして作成)

testProject配下にphpinfo.phpを作成し、editorにてphpinfo()関数をアシストしてみる。(かなり完成度が高い。。ちなみに追加Library に関しても保管可能)

image 

phpの関数一覧をフィルターで検索することが可能。右クリックでマニュアルページを表示

image 

クラスのOutLine表示

image 

PDTはかなり完成度が高い開発環境だ。

 

実行&Debug環境の構築

apache2.2のhttpd.confを編集し、testProjectをDocumentRootに設定。

下記の設定を同ファイルに追加(phpのインストールディレクトリは環境に合わせる)

LoadModule php5_module C:/php5/php5apache2_2.dll

AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
DirectoryIndex index.php index.html index.html.var
PHPIniDir "C:/php5"

apacheを起動し、http://localhost:8080/phpinfo.phpにて動作が確認できれば実行環境完成。

次にdebug環境を設定する。php.iniを開き、下記を追記する。(phpのインストールディレクトリは環境に合わせる)

zend_extension_ts=C:\php5\ext\ZendDebugger.dll
zend_debugger.allowed_hosts=localhost
zend_debugger.expose_remotely=always

あとは、eclipse上でブレークポイントを設定->対象phpファイルを右クリック->debug -> PHP Web page でPHP Debugパースペクティブが表示されるはず。

その他プラグイン

実際PHPでwebappを作成するとなると、フレームワークをプロジェクトに含めることになると思う。これらをそのままプロジェクトに追加した場合、validataionでエラーが発生する場合がある。それを回避するために、プロジェクトのプロパティ→validataion で html syntax validator等をoffにすると良い。(私は、mojaviやsymfonyなどを使用している。これらの構築howto等は機会があれば書くつもりです)