Spring Security を利用してログインセッション管理を
している方も多いと思います。
Spring Securityデフォルトのままで使うと
アカウント作成後に一度ユーザにログインしてもらわないといけないとか
イケてないので、そういう時に自動でログインセッションを作成する方法です
アカウント作成後に次のようなメソッドを呼びます
AuthenticationProvideのBeanを指定します(自作クラスでも動きます)
@Autowired
AuthenticationProvider authenticationProvider;
HttpServletRequestを予め取得しておいて、username, passwordから
tokenを発行し、authenticationProviderに登録します
private void doAutoLogin(String username, String password,
HttpServletRequest request) {
try {
// Must be called from request filtered by Spring Security,
// otherwise SecurityContextHolder is not updated
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(
username, password);
token.setDetails(new WebAuthenticationDetails(request));
Authentication authentication = this.authenticationProvider
.authenticate(token);
// logger.debug("Logging in with [{}]",
// authentication.getPrincipal());
SecurityContextHolder.getContext()
.setAuthentication(authentication);
} catch (Exception e) {
SecurityContextHolder.getContext().setAuthentication(null);
logger.error("Failure in autoLogin", e);
}
}
AutowiredしなくてもSecurityContextHolderからいけるかも
しれないですね。そのうちやってみよ。
2014年3月28日金曜日
2014年3月25日火曜日
Session Counter Listener
セッション数をカウントするServlet コンテナ用のListenerを自作したので共有
サービスのセッション数 を監視してーという人はどうぞ
thread safeなはず。 Java1.5以上必要です
SessionCounterListener.java:
public class SessionCounterListener implements HttpSessionListener {
private static AtomicInteger totalActiveSessions = new AtomicInteger();
public static int getTotalActiveSession() {
return totalActiveSessions.get();
}
@Override
public void sessionCreated(HttpSessionEvent arg0) {
totalActiveSessions.incrementAndGet();
}
@Override
public void sessionDestroyed(HttpSessionEvent arg0) {
totalActiveSessions.decrementAndGet();
}
}
web.xmlにはListenerとして登録
web.xml :
<listener>
<listener-class>my.package.SessionCounterListener</listener-class>
</listener>
サービスのセッション数 を監視してーという人はどうぞ
thread safeなはず。 Java1.5以上必要です
SessionCounterListener.java:
public class SessionCounterListener implements HttpSessionListener {
private static AtomicInteger totalActiveSessions = new AtomicInteger();
public static int getTotalActiveSession() {
return totalActiveSessions.get();
}
@Override
public void sessionCreated(HttpSessionEvent arg0) {
totalActiveSessions.incrementAndGet();
}
@Override
public void sessionDestroyed(HttpSessionEvent arg0) {
totalActiveSessions.decrementAndGet();
}
}
web.xmlにはListenerとして登録
web.xml :
<listener>
<listener-class>my.package.SessionCounterListener</listener-class>
</listener>
2013年9月16日月曜日
JNDIのカスタムPropertyクラス2
jetty 8.1以降では
JNDI に Array を指定することが可能になっています
次のように指定可能です
<resource-ref>
<description>Maintenance Property</description>
<res-ref-name>maintenance</res-ref-name>
<res-type>java.lang.reflect.Array</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<New id="maintenance" class="org.eclipse.jetty.plus.jndi.Resource">
<Arg></Arg>
<Arg>maintenance</Arg>
<Arg>
<Array type="com.gauuud.Property.MaintenanceProp">
<item><New class="com.gauuud.Property.MaintenanceProp">
<Set name="start">2012/9/11 1:25</Set>
<Set name="end">2012/9/11 1:30</Set>
<Set name="type">10</Set>
<Set name="desc">test</Set>
</New></item>
<item><New class="com.gauuud.Property.MaintenanceProp">
<Set name="start">2012/9/12 1:25</Set>
<Set name="end">2012/9/13 1:30</Set>
<Set name="type">10</Set>
<Set name="desc">test2</Set>
</New></item>
</Array>
</Arg>
</New>
package com.gauuud.Property;
import java.util.Date;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class MaintenanceProp {
private int type;
public int getType() {
return this.type;
}
public void setType(int type) {
this.type = type;
}
private Date start;
public Date getStart() {
return this.start;
}
public void setStart(Date start) {
this.start = start;
}
private Date end;
public Date getEnd() {
return this.end;
}
public void setEnd(Date end) {
this.end = end;
}
private String desc;
public String getDesc() {
return this.desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public MaintenanceProp() {}
}
package com.gauuud.Property;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class MaintenancePropArray {
private static final MaintenanceProp[] array;
public static MaintenanceProp[] get(){
return array;
}
static {
MaintenanceProp[] props = null;
try {
InitialContext ic = new InitialContext();
Context envCtx = (Context) ic.lookup("java:comp/env");
props = (MaintenanceProp[]) envCtx.lookup("maintenance");
} catch (NamingException e) {
e.printStackTrace();
}
array = props;
}
}
JNDI に Array を指定することが可能になっています
次のように指定可能です
web.xml
<resource-ref>
<description>Maintenance Property</description>
<res-ref-name>maintenance</res-ref-name>
<res-type>java.lang.reflect.Array</res-type>
<res-auth>Container</res-auth>
</resource-ref>
jetty-env.xml
<New id="maintenance" class="org.eclipse.jetty.plus.jndi.Resource">
<Arg></Arg>
<Arg>maintenance</Arg>
<Arg>
<Array type="com.gauuud.Property.MaintenanceProp">
<item><New class="com.gauuud.Property.MaintenanceProp">
<Set name="start">2012/9/11 1:25</Set>
<Set name="end">2012/9/11 1:30</Set>
<Set name="type">10</Set>
<Set name="desc">test</Set>
</New></item>
<item><New class="com.gauuud.Property.MaintenanceProp">
<Set name="start">2012/9/12 1:25</Set>
<Set name="end">2012/9/13 1:30</Set>
<Set name="type">10</Set>
<Set name="desc">test2</Set>
</New></item>
</Array>
</Arg>
</New>
MaintenanceProp.java :
package com.gauuud.Property;
import java.util.Date;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class MaintenanceProp {
private int type;
public int getType() {
return this.type;
}
public void setType(int type) {
this.type = type;
}
private Date start;
public Date getStart() {
return this.start;
}
public void setStart(Date start) {
this.start = start;
}
private Date end;
public Date getEnd() {
return this.end;
}
public void setEnd(Date end) {
this.end = end;
}
private String desc;
public String getDesc() {
return this.desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public MaintenanceProp() {}
}
MaintenancePropArray.java:
package com.gauuud.Property;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class MaintenancePropArray {
private static final MaintenanceProp[] array;
public static MaintenanceProp[] get(){
return array;
}
static {
MaintenanceProp[] props = null;
try {
InitialContext ic = new InitialContext();
Context envCtx = (Context) ic.lookup("java:comp/env");
props = (MaintenanceProp[]) envCtx.lookup("maintenance");
} catch (NamingException e) {
e.printStackTrace();
}
array = props;
}
}
Jetty SSL設定
Jetty 8.*での情報です
9.*でも利用可能かもしれません
#証明書作成用キーの作成
openssl genrsa -des3 -out jetty.key
openssl req -new -x509 -key jetty.key -out jetty.crt
#サーバへ送る証明書の作成
openssl req -new -key jetty.key -out jetty.csr
#2048bit以上が必要な場合
#openssl req -nodes -newkey rsa:2048 -keyout jetty.key -out jetty.csr
#keytoolがない場合${JAVA_HOME}/jre/bin/keytool
#証明書の登録
#jetty.csrの内容を証明サーバに送る
#jetty.crtに帰ってきた証明書を保存する
#keystoreへ登録
keytool -keystore keystore -import -alias jetty -file jetty.crt -trustcacerts
#pkcs12形式を登録
openssl pkcs12 -export -inkey jetty.key -in jetty.crt -certfile etc/SSL_CA.cer(中間証明書) -out jetty.pkcs12
keytool -importkeystore -srckeystore jetty.pkcs12 -srcstoretype PKCS12 -destkeystore etc/keystore
#jetty-ssl.xml修正
<New id="sslContextFactory" class="org.eclipse.jetty.http.ssl.SslContextFactory">
<Set name="KeyStore"><Property name="jetty.home" default="." />/etc/keystore</Set>
<Set name="KeyStorePassword">[keystore password]</Set>
<Set name="KeyManagerPassword">[key password]</Set>
<Set name="TrustStore"><Property name="jetty.home" default="." />/etc/keystore</Set>
<Set name="TrustStorePassword">[keystore password]</Set>
</New>
#verify
openssl s_client -connect {対象サーバ}:443 -showcerts
参考
http://wiki.eclipse.org/Jetty/Howto/Configure_SSL
9.*でも利用可能かもしれません
#証明書作成用キーの作成
openssl genrsa -des3 -out jetty.key
openssl req -new -x509 -key jetty.key -out jetty.crt
#サーバへ送る証明書の作成
openssl req -new -key jetty.key -out jetty.csr
#2048bit以上が必要な場合
#openssl req -nodes -newkey rsa:2048 -keyout jetty.key -out jetty.csr
#keytoolがない場合${JAVA_HOME}/jre/bin/keytool
#証明書の登録
#jetty.csrの内容を証明サーバに送る
#jetty.crtに帰ってきた証明書を保存する
#keystoreへ登録
keytool -keystore keystore -import -alias jetty -file jetty.crt -trustcacerts
#pkcs12形式を登録
openssl pkcs12 -export -inkey jetty.key -in jetty.crt -certfile etc/SSL_CA.cer(中間証明書) -out jetty.pkcs12
keytool -importkeystore -srckeystore jetty.pkcs12 -srcstoretype PKCS12 -destkeystore etc/keystore
#jetty-ssl.xml修正
<New id="sslContextFactory" class="org.eclipse.jetty.http.ssl.SslContextFactory">
<Set name="KeyStore"><Property name="jetty.home" default="." />/etc/keystore</Set>
<Set name="KeyStorePassword">[keystore password]</Set>
<Set name="KeyManagerPassword">[key password]</Set>
<Set name="TrustStore"><Property name="jetty.home" default="." />/etc/keystore</Set>
<Set name="TrustStorePassword">[keystore password]</Set>
</New>
#verify
openssl s_client -connect {対象サーバ}:443 -showcerts
参考
http://wiki.eclipse.org/Jetty/Howto/Configure_SSL
Ubuntu 12.* Jetty のマニュアルインストール
Jettyの手動インストール方法です
レポジトリのjettyは古いし動かないし手動でインストールするしかありません
基本は参考文献の多いTomcatのまねをすればいいみたいです
※権限周りは知識がないので要確認です
1.Jettyをダウンロード
http://download.eclipse.org/jetty/stable-9/dist/
2.解凍
tar -xvf jetty-distribution-8.1.11.v20130520.tar.gz
3.移動、リンクはる
sudo mv jetty-distribution-8.1.11.v20130520 /usr/local/
cd /usr/local/
sudo ln -s jetty-distribution-8.1.11.v20130520 jetty
4.スクリプトに権限付与
sudo useradd jetty -U -s /bin/false
#こっちかな?useradd jetty jetty -d /usr/local/jetty/ -s /bin/false -p’*’ -r
sudo chown -R jetty webapps temp logs work conf
sudo chmod a+x /usr/local/jetty/bin/jetty.sh
nano /usr/local/jetty/bin/jetty.sh
#1行目を修正
!/bin/bash
5.init.d登録
sudo cp bin/jetty.sh /etc/init.d/jetty
sudo chmod 755 /etc/init.d/jetty
sudo nano /etc/default/jetty
下記の内容を書き込む
JAVA_HOME=/usr/lib/jvm/jdk1.7.0 # Path to Java
NO_START=0 # Start on boot
PATH=${JAVA_HOME}/bin:${PATH}
JAVA_OPTION=-Duser.timezone="Asia/Tokyo" #TimeZoneの指定が必要なら
JETTY_HOME=/usr/local/jetty
JETTY_USER=jetty # Run as this user
開始してみる
sudo service jetty start
6.自動起動に登録
sudo update-rc.d jetty defaults
参考
http://jensontaylor.blogspot.jp/2010/09/manually-installing-tomcat-7-on-ubuntu.html
その他の設定
#ポート80を開く場合
レポジトリのjettyは古いし動かないし手動でインストールするしかありません
基本は参考文献の多いTomcatのまねをすればいいみたいです
※権限周りは知識がないので要確認です
1.Jettyをダウンロード
http://download.eclipse.org/jetty/stable-9/dist/
2.解凍
tar -xvf jetty-distribution-8.1.11.v20130520.tar.gz
3.移動、リンクはる
sudo mv jetty-distribution-8.1.11.v20130520 /usr/local/
cd /usr/local/
sudo ln -s jetty-distribution-8.1.11.v20130520 jetty
4.スクリプトに権限付与
sudo useradd jetty -U -s /bin/false
#こっちかな?useradd jetty jetty -d /usr/local/jetty/ -s /bin/false -p’*’ -r
sudo chown -R jetty webapps temp logs work conf
sudo chmod a+x /usr/local/jetty/bin/jetty.sh
nano /usr/local/jetty/bin/jetty.sh
#1行目を修正
!/bin/bash
5.init.d登録
sudo cp bin/jetty.sh /etc/init.d/jetty
sudo chmod 755 /etc/init.d/jetty
sudo nano /etc/default/jetty
下記の内容を書き込む
JAVA_HOME=/usr/lib/jvm/jdk1.7.0 # Path to Java
NO_START=0 # Start on boot
PATH=${JAVA_HOME}/bin:${PATH}
JAVA_OPTION=-Duser.timezone="Asia/Tokyo" #TimeZoneの指定が必要なら
JETTY_HOME=/usr/local/jetty
JETTY_USER=jetty # Run as this user
開始してみる
sudo service jetty start
6.自動起動に登録
sudo update-rc.d jetty defaults
参考
http://jensontaylor.blogspot.jp/2010/09/manually-installing-tomcat-7-on-ubuntu.html
その他の設定
#ポート80を開く場合
iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
iptables -t nat -I PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8443 2013年1月4日金曜日
Logbackメモ
Logback を利用してログ出力しているのですが、
これまでサンプルのままだったのを少し見直しました。
次のような要件を満たすように変更、
1.レベルがエラーの場合にメールで送信する
2.ファイル出力、日毎、100M毎 にローリング
main/resource/logback.xml :
<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">
<configuration debug="true" scan="true" scanPeriod="30 seconds">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern>
</layout>
</appender>
<appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<smtpHost>smtp.gmail.com</smtpHost>
<smtpPort>587</smtpPort>
<STARTTLS>true</STARTTLS>
<username>[YOUR_NAME]@gmail.com</username>
<password>[YOUR_PASSWORD]</password>
<to>[TO]</to> <!-- additional destinations are possible -->
<from>[FROM]</from>
<subject>TESTING: %logger{20} - %m</subject>
<layout class="ch.qos.logback.classic.PatternLayout">
<charset>UTF-8</charset>
<Pattern>[%-5level][%d{yyyy-MM-dd HH:mm:ss.SSS}] %class - %msg%n</Pattern>
</layout>
</appender>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>logFile.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover -->
<fileNamePattern>logFile.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- keep 30 days' worth of history -->
<maxHistory>30</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- or whenever the file size reaches 100MB -->
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<charset>UTF-8</charset>
<Pattern>[%-5level][%d{yyyy-MM-dd HH:mm:ss.SSS}] %class - %msg%n</Pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="FILE" />
<appender-ref ref="STDOUT" />
<appender-ref ref="EMAIL" />
</root>
</configuration>
SMTPAppenderを利用してメールを送信します。
サンプルではGMAILで送信する設定にしています。
メールで送信する場合はLevelFilterを利用してERRORの場合のみ送信するようにしています。
File出力に関しては、ここのサンプルのままです。
File出力がネックになりそうな場合は、下のAsyncAppenderをFileAppenderの
前に挟んでAsync処理にする。
SMTPはAsyncで送信されているようなので気にしない 。
<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="FILE" />
</appender>
アクセスログを出力したい場合は、ここを参照する
2011年12月8日木曜日
サーバのブルートフォース攻撃対策
気づいたら結構な頻度でブルートフォース攻撃されているようなので
次のようなiptablesの設定を追加しました。
次のようなiptablesの設定を追加しました。
$ sudo /sbin/iptables -I INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent --set $ sudo /sbin/iptables -I INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP
22ポートにコネクションが60秒に4回アクセスされると60秒アクセスを停止する。
次のような結果が出たら成功。
$ sudo /sbin/iptables --listtarget prot opt source destination DROP tcp -- anywhere anywhere tcp dpt:ssh state NEW recent: UPDATE seconds: 60 hit_count: 4 name: DEFAULT side: source tcp -- anywhere anywhere tcp dpt:ssh state NEW recent: SET name: DEFAULT side: source
認証は128bitキーのみにしてるから気休めですが。
このあたりが詳しそう
iptables の ipt_recent で ssh の brute force attack 対策
登録:
投稿 (Atom)