SSHで公開鍵認証を使う

1. ssh-keygen コマンドで鍵ペアを作成する

$ ssh-keygen -t rsa

秘密鍵の保存先を聞いてくるので、デフォルトのままEnter。
パスフレーズを2回入力。
すると、以下の鍵ペアのファイルが ~/.ssh/ に作成される。

  • id_rsa
  • id_rsa.pub

2. SSHサーバに公開鍵を登録する

ユーザのホームディレクトリに1.で作成した公開鍵を転送する。(FTPで転送してもよい。)

$ scp ~/.ssh/id_rsa.pub user@host:

サーバ側で、catコマンドとリダイレクションを使って転送した公開鍵を登録する。(登録するファイルは ~/.ssh/authorized_keys)

$ cat id_rsa.pub >> ~/.ssh/authorized_keys

「~/.ssh」ディレクトリと「~/.ssh/authorized_keys」はオーナーだけに読み書き可能なようにパーミッションを設定する。

$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys
  • クライアント側のユーザのホームディレクトリのパーミッションにも注意する。所有者以外の書込み権を設定してあるとだめ。
    たとえば、/home/hogeのパーミッションが777の場合、公開鍵認証でsshログインしようとすると、
    Permission denied (publickey,gssapi-with-mic).
    というエラーになる。この場合、サーバ側のログ(/var/log/secure)では
    Authentication refused: bad ownership or modes for directory /home/hoge
    となっていて、/hoem/hogeのパーミッションに問題があるということ。
    所有者以外の書込み権を設定してあるとだめ。700、711、755にすればOK。

3. 公開鍵認証方式でログインする

$ ssh -l user host

パスフレーズを聞いてくるので、ssh-keygenコマンドで指定したパスフレーズを入力する。
接続先サーバのパスワードではないことに注意

4. クライアント側の設定

id_rsa ファイルをクライアント側にコピーする。
例:
ユーザのホームディレクトリ\.ssh

  • 秘密鍵のパーミッションに注意。秘密鍵のパーミッションがopenすぎるとだめ。
    以下はmacosxでのエラーの例。

    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    @         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    Permissions 0640 for '/Users/xxx/.ssh/id_rsa' are too open.
    It is recommended that your private key files are NOT accessible by others.
    This private key will be ignored.
    bad permissions: ignore key: /Users/xxx/.ssh/id_rsa
    Permission denied (publickey,gssapi-with-mic).
    

    id_rsaを600にすればOK。

  • cwRsyncで公開鍵認証を使用する場合は、環境変数HOMEの下の「.ssh」(known_hostsファイルが作成されるディレクトリ)に秘密鍵ファイル(id_rsa)を置く。
    例:
    HOME=/home/pistolfly
    でcygwinがD:\cygwinの場合、
    D:\cygwin\home\.ssh
    に秘密鍵ファイルを置く。
    (rsyncの-eまたは--rshオプションのsshコマンドで-iオプションで秘密鍵のパスを指定してもよい。)

    rsyncしてパスフレーズの入力を促されたところ

    C:\sfprojects\reserve>symfony sync production
    >> exec      rsync --progress --dry-run -azC...s.net:/usr/local/share/reserve/
    Enter passphrase for key '/cygdrive/c/Documents and Settings/pistolfly/.ssh/id_r
    sa':
    
  • TeraTermでは、ログイン時に「RSA/DSA鍵を使う」を選択して、秘密鍵に上記ディレクトリの秘密鍵ファイルを指定して、秘密鍵のパスフレーズを入力する。

5. パスワード認証を許可しないようする

/etc/ssh/sshd_config (サーバ側) を編集する。

PasswordAuthentication yes

PasswordAuthentication no

にする。

rootのログインも禁止しておく。

PermitRootLogin no

root権限でsshdをreloadする。(rootでログインしたままで)

$ /etc/init.d/sshd reload

参考:
FedoraCore5ビギナーズバイブル11-2-2
最終回 セキュアなSSHサーバーを構築する:ITpro
リモート接続に SSH を使う
@IT:鍵交換方式のsshでアクセスするには

request parameterからの更新

基本パターン

if ($this->hasRequestParameter('xxx'))
{
  $this->model->setXxx($this->getRequestParameter('xxx'));
}

または

if ($this->getRequestParameter('xxx') !== null)
{
  $this->model->setXxx($this->getRequestParameter('xxx'));
}

※チェックボックスの場合は、チェックボックスを含むフォームを処理するアクションで、以下のようにデフォルトをセットする必要がある。

if (!$this->hasRequestParameter('xxx'))
{
  $this->getRequest()->setParameter('xxx', false);
}

または

if ($this->getRequestParameter('xxx') == null)
{
  $this->getRequest()->setParameter('xxx', false);
}

日付
(input_date_tag, select_day_tag+select_month_tag+select_year_tag)

if ($this->hasRequestParameter('date'))
// または if ($this->getRequestParameter('date') !== null)
{
  if ($this->getRequestParameter('date'))
  {
    try
    {
      $dateFormat = new sfDateFormat($this->getUser()->getCulture());
      if (!is_array($this->getRequestParameter('date')))
      {
        $value = $dateFormat->format($this->getRequestParameter('date'), 'i', $dateFormat->getInputPattern('d'));
      }
      else
      {
        $value_array = $this->getRequestParameter('date');
        if (is_numeric($value_array['year']) && is_numeric($value_array['month']) && is_numeric($value_array['day']))
        {
          $value = $value_array['year'].'-'.$value_array['month'].'-'.$value_array['day'].(isset($value_array['hour']) ? ' '.$value_array['hour'].':'.$value_array['minute'].(isset($value_array['second']) ? ':'.$value_array['second'] : '') : '');
        }
        else
        {
          $value = null;
        }
      }
      $this->model->setDate($value);
    }
    catch (sfException $e)
    {
      // not a date
    }
  }
  else
  {
    $this->model->setDate(null);
  }
}

日付時刻
日付とほぼ同じだが、値をテキストで受け取った場合(rich=true)のフォーマット引数が異なる。

$value = $dateFormat->format($this->getRequestParameter('date'), 'i', $dateFormat->getInputPattern('d'));

日付時刻

$value = $dateFormat->format($this->getRequestParameter('date'), 'I', $dateFormat->getInputPattern('g'));

Retrieve information about the current route

symfony PHP5 framework

Retrieve information about the current route
If you need to retrieve information about the current route, for instance to prepare a future 'back to page xxx' link, you should use the methods of the sfRouting object. For instance, if your routing.yml defines:

<code>
my_rule:
  url:   /call_my_rule
  param: { module: mymodule, action: myaction }
</code>

Use the following calls in the action:

<code>
// if you require an URL like
http://myapp.example.com/call_my_rule/param1/xxx/param2/yyy
 
$uri = sfRouting::getInstance()->getCurrentInternalUri();
// will return 'mymodule/myaction?param1=xxx&param2=yyy'
 
$uri = sfRouting::getInstance()->getCurrentInternalUri(true);
// will return '@myrule?param1=xxx&param2=yyy'
 
$route = sfRouting::getInstance()->getCurrentRouteName();
// will return 'myrule'
</code>

The URIs returned by the ->getCurrentInternalUri() method can be used in a call to a link_to() helper.
In addition, you might want to get the first or the last action called in a template. The following variables are automatically updated at each request and are available to templates:
$sf_first_action
$sf_first_module
$sf_last_action
$sf_last_module

Complement complex SQL in SYMFONY

Code Snippets
Complement complex SQL in SYMFONY
http://propel.phpdb.org/trac/ticket/57
集計関数を使用する例

SELECT MIN(reserve.MINUTES_PER_UNIT), reserve.NUMBER_PER_UNIT
FROM reserve
WHERE reserve.TYPE='time' AND reserve.RESERVE_GROUP_ID=1
GROUP BY reserve.TYPE,reserve.RESERVE_GROUP_ID
$c = new Criteria();
$c->add(ReservePeer::TYPE, $reserve_type);
$c->add(ReservePeer::RESERVE_GROUP_ID, $reserve_group_id);
$c->addSelectColumn('MIN('.ReservePeer::MINUTES_PER_UNIT.')');
$c->addGroupByColumn(ReservePeer::TYPE);
$c->addGroupByColumn(ReservePeer::RESERVE_GROUP_ID);
$rs = ReservePeer::doSelectRS($c);
while ($rs->next())
{
  $minutes_per_unit = $rs->getInt(1);
}

「ようこそ」画面に特定のユーザーを表示させないようにする

ITmedia エンタープライズ:Windows Tips「「ようこそ」画面に特定のユーザーを表示させないようにする」

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList
に、非表示にしたいアカウント名のDWORD値を作成して、値を0にする。
Windows Vistaでも同じ方法でアカウントを非表示にできる。

File structure explained

http://www.symfony-project.com/book/trunk/file_structure
symfonyのディレクトリパスは、sfConfigで取得できる。


// root directory structure
'sf_cache_dir_name'   => 'cache',
'sf_log_dir_name'     => 'log',
'sf_lib_dir_name'     => 'lib',
'sf_model_dir_name'   => 'model',
'sf_web_dir_name'     => 'web',
'sf_data_dir_name'    => 'data',
'sf_config_dir_name'  => 'config',
'sf_apps_dir_name'    => 'apps',
 
// global directory structure
'sf_app_dir'        => $sf_root_dir.DIRECTORY_SEPARATOR.'apps'.DIRECTORY_SEPARATOR.$sf_app,
'sf_model_dir'      => $sf_root_dir.DIRECTORY_SEPARATOR.'model',
'sf_lib_dir'        => $sf_root_dir.DIRECTORY_SEPARATOR.'lib',
'sf_web_dir'        => $sf_root_dir.DIRECTORY_SEPARATOR.'web',
'sf_upload_dir'     => $sf_root_dir.DIRECTORY_SEPARATOR.'web'.DIRECTORY_SEPARATOR.'uploads',
'sf_base_cache_dir' => $sf_root_dir.DIRECTORY_SEPARATOR.'cache'.DIRECTORY_SEPARATOR.$sf_app,
'sf_cache_dir'      => $sf_root_dir.DIRECTORY_SEPARATOR.'cache'.DIRECTORY_SEPARATOR.$sf_app.DIRECTORY_SEPARATOR.$sf_environment,
'sf_log_dir'        => $sf_root_dir.DIRECTORY_SEPARATOR.'log',
'sf_data_dir'       => $sf_root_dir.DIRECTORY_SEPARATOR.'data',
'sf_config_dir'     => $sf_root_dir.DIRECTORY_SEPARATOR.'config',