管理画面へのアクセスを「httpsのみ」にしたい

2015年9月14日 at 14:04

いつもお世話になっております。
----------------------------
version : 5.7.5.1 を利用
----------------------------

セキュリティチェックに基づき、ログイン画面以降をhttpsでアクセスしたく思っております。
※CookieにSecure属性を付けて

ログイン画面を「https」 にしても、ログイン成功後に「http」になってしまいます。
ログイン後も「https」にしなおしても、各メニューへのリンクが「http」となっています。

※フロントは、Domain Mapper を使用している関係上、
 カノニカルURL以外のアクセスを、全SSLにする(concrete.seo.canonical_ssl_url)ことはできません。

管理画面をセキュアにする方法がありましたら、回避方法等ないでしょうか。
 

タグ: セキュリティ, SSL

Re: 管理画面へのアクセスを「httpsのみ」にしたい

2015年9月23日 at 15:35
ぜひ、どういう設定がいいのかを議論したいので、他の方からも意見も伺いたいのですが…。
とりあえず、application/bootstrap/app.php に記載する方法として考えてみました。
ログイン関連ページと管理画面へのアクセスの場合はHTTPSにリダイレクトするコードです。
httponly属性を付けることを想定し、逆方向(管理画面以外にhttpsでアクセスした際にhttpに戻す)は想定していません。

use Concrete\Core\Http\Request;
use Concrete\Core\Routing\RedirectResponse;
use Concrete\Core\Url\Url;

Events::addListener('on_before_dispatch', function() {
$app = Core::make('app');
$request = Request::getInstance();

if ($request->getScheme() == 'http') {
if (
$request->getPath() == '/login' ||
$request->matches('/login/*') ||
$request->matches('/dashboard/*')
) {
$url = Url::createFromUrl($request->getUri());
$url->setScheme('https');
$response = new RedirectResponse($url);
}
}

if (isset($response)) {
$response->send();
exit;
}
});

http://gist.github.com/hissy/7cb3f462f489c118d9fc

ただ、試してみたところ、httpなURLにアクセスすると、セッションが切れてしまいます…。結構不便なので、サイト全体でhttpsを強制するか、httponlyを諦めるか…な気がしてしまいます。
 

Re: 管理画面へのアクセスを「httpsのみ」にしたい

2015年9月23日 at 15:38
失礼、HttpOnlyではなくSecure属性の方ですね、たぶん問題なのは。
 

Re: 管理画面へのアクセスを「httpsのみ」にしたい

2015年9月23日 at 16:03
菱川さん >

考慮いたただきましてありがとうございます!

某セキュリティ会社のセキュリティチェックで「MIDDLE」の指摘を受けたところで、
「ログイン以降はhttpsにする」ということで対策を宣言したのですが、
つまずいてしまった次第です。


一旦、こちらでもとりあえずの回避をしたので、共有します。
resolverをいじって、httpsアクセスの時の判定に追加しました。


▼ CanonicalUrlResolver.php
/application/src/Url/Resolver/CanonicalUrlResolver.php へ

・namespace変更

・resolve変更
public function resolve(array $arguments, $resolved = null) {
$url = Url::createFromUrl('');

$url->setHost(null);
$url->setScheme(null);

----ここから追加 -------
$ssl = false;
$u = new \User();
try {
$ssl = $u->isLoggedIn();
} catch (\Exception $e) {
}

$request = \Request::getInstance();
if ($request && strpos($request->getPath(), "/login") === 0){
$ssl = true;
}

----ここからまで -------

if (\Config::get('concrete.seo.canonical_url')) {
$canonical = UrlImmutable::createFromUrl(\Config::get('concrete.seo.canonical_url'));

----ここから追加 -------
if ($ssl && \Config::get('concrete.seo.canonical_ssl_url')) {
$canonical = UrlImmutable::createFromUrl(\Config::get('concrete.seo.canonical_ssl_url'));
}
----ここからまで -------
$url->getHost()->set($canonical->getHost());
$url->getScheme()->set($canonical->getScheme());
if (intval($canonical->getPort()->get()) > 0) {
$url->getPort()->set($canonical->getPort());
}




▼application/bootstrap/app.php
以下を追加
--------------------------------
// CanonicalUrlResolver override
Core::singleton(
'url/canonical/resolver',
function () {
return new \Application\Src\Url\Resolver\CanonicalUrlResolver();
});
Core::singleton(
'url/canonical',
function () {
return \Core::make('url/canonical/resolver')->resolve(array());
});
--------------------------------


▼application/config/concrete.php

・secure属性を有効に(Cookie名/httponlyも変えています)
-----------------------------------
'session' => array(
'name' => 'ssid',
'handler' => 'file',
'save_path' => null,
'max_lifetime' => 7200,
'cookie' => array(
'cookie_path' => false, // set a specific path here if you know it, otherwise it'll default to relative
'cookie_lifetime' => 0,
'cookie_domain' => false,
- 'cookie_secure' => false,
+ 'cookie_secure' => true,
'cookie_httponly' => true
)
),
-----------------------------------
 

Re: 管理画面へのアクセスを「httpsのみ」にしたい

2015年9月23日 at 16:08
リゾルバいじっちゃいますか…ログインページへのリンクをhttpsにするってことですかね?

本題とは関係ないですが、 User::isLoggedIn() というふうに Facade を使って記述した方が、いちいち User オブジェクトのインスタンスを生成するより省メモリですよ。
 

Re: 管理画面へのアクセスを「httpsのみ」にしたい

2015年9月24日 at 14:17
Nginxでリバースプロキシ設定を行い、で全てのリクエストをhttpsで受けるように設定してみました。

5.7.5.1のElementalで動作確認をしてみました。

ただし、この方法ですと、
・非ログイン状態でもSSL化してしまう
  →これはメリットかもしれない
・secure属性は設定されない
  →リバースプロキシの設定が不足しているのが原因かも
   (concrete5側の実装を確認する必要がありそう)
・外部リソース(Webフォントやjsなど)を使用する場合、
 httpsで外部リソースを使用する必要がある

上記の点は、本来の目的を叶えられていないかも知れません。
 

Re: 管理画面へのアクセスを「httpsのみ」にしたい

2015年9月24日 at 14:27
追記・・・

/concrete/config/concrete.php

にある、


'session' => array(

'name' => 'CONCRETE5',
'handler' => 'file',
'save_path' => null,
'max_lifetime' => 7200,
'cookie' => array(
'cookie_path' => false, // set a specific path here if you know it, otherwise it'll default to relative
'cookie_lifetime' => 0,
'cookie_domain' => false,
'cookie_secure' => false,
'cookie_httponly' => false
)
),


上記のcookie_secureを'true'にすると、secuure属性がつきますが、
applicationディレクトリ側にオーバーライドでファイルを置くと、メニューが全て英語に成ってしまいますね。
 

Re: 管理画面へのアクセスを「httpsのみ」にしたい

2015年9月29日 at 11:51
菱川さん 遠藤さん

ありがとうございます!

アプリケーション診断にて、「ログイン情報をCookieに入れている場合は、セキュアな状態にしてね」という指摘がありました。

ログイン画面をhttpsにしても、ログイン後以降がhttpになってしまうのが、悩ましかった部分です。

管理機能全般もSSLで使用することになりますので、
httpsでのアクセス時は、フルページキャッシュをしないような処理も加えています。

SSLが使えるサーバ前提になりますが、セキュリティ診断が入る案件に対しては、幾分調整が必要な感じでした。

他には、細かいですが、
ログイン画面の「パスワード入力」には、オートコンプリートをOFFにしてね。
とか
ログイン後ページは、ブラウザキャッシュもno-cacheにしてね。
とか、小さい指摘は諸々ありますね。
 

Re: 管理画面へのアクセスを「httpsのみ」にしたい

2015年9月29日 at 12:30
診断にnessusとかを使っていれば世界基準なので、通るようにしておきたいですね。対策されたものをまとめて、プルリクエストを送りたいところです。