管理画面へのアクセスを「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: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
)
),
-----------------------------------
考慮いたただきましてありがとうございます!
某セキュリティ会社のセキュリティチェックで「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 オブジェクトのインスタンスを生成するより省メモリですよ。
本題とは関係ないですが、 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で外部リソースを使用する必要がある
上記の点は、本来の目的を叶えられていないかも知れません。
5.7.5.1のElementalで動作確認をしてみました。
ただし、この方法ですと、
・非ログイン状態でもSSL化してしまう
→これはメリットかもしれない
・secure属性は設定されない
→リバースプロキシの設定が不足しているのが原因かも
(concrete5側の実装を確認する必要がありそう)
・外部リソース(Webフォントやjsなど)を使用する場合、
httpsで外部リソースを使用する必要がある
上記の点は、本来の目的を叶えられていないかも知れません。
Re: 管理画面へのアクセスを「httpsのみ」にしたい
2015年9月24日 at 14:27
追記・・・
/concrete/config/concrete.php
にある、
上記のcookie_secureを'true'にすると、secuure属性がつきますが、
applicationディレクトリ側にオーバーライドでファイルを置くと、メニューが全て英語に成ってしまいますね。
/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にしてね。
とか、小さい指摘は諸々ありますね。
ありがとうございます!
アプリケーション診断にて、「ログイン情報をCookieに入れている場合は、セキュアな状態にしてね」という指摘がありました。
ログイン画面をhttpsにしても、ログイン後以降がhttpになってしまうのが、悩ましかった部分です。
管理機能全般もSSLで使用することになりますので、
httpsでのアクセス時は、フルページキャッシュをしないような処理も加えています。
SSLが使えるサーバ前提になりますが、セキュリティ診断が入る案件に対しては、幾分調整が必要な感じでした。
他には、細かいですが、
ログイン画面の「パスワード入力」には、オートコンプリートをOFFにしてね。
とか
ログイン後ページは、ブラウザキャッシュもno-cacheにしてね。
とか、小さい指摘は諸々ありますね。
Re: 管理画面へのアクセスを「httpsのみ」にしたい
2015年9月29日 at 12:30
診断にnessusとかを使っていれば世界基準なので、通るようにしておきたいですね。対策されたものをまとめて、プルリクエストを送りたいところです。
Your post has been saved and will be published after approval by the forum moderator.
takuro hishikawa
Re: 管理画面へのアクセスを「httpsのみ」にしたい
とりあえず、application/bootstrap/app.php に記載する方法として考えてみました。
ログイン関連ページと管理画面へのアクセスの場合はHTTPSにリダイレクトするコードです。
httponly属性を付けることを想定し、逆方向(管理画面以外にhttpsでアクセスした際にhttpに戻す)は想定していません。
http://gist.github.com/hissy/7cb3f462f489c118d9fc
ただ、試してみたところ、httpなURLにアクセスすると、セッションが切れてしまいます…。結構不便なので、サイト全体でhttpsを強制するか、httponlyを諦めるか…な気がしてしまいます。