Creating a simple IP blacklist with mod_rewrite and RewriteMap

I’ve had a lot of URL spam (bots testing URLs for weaknesses and exploits). They haven’t been successful but i have configured my system to send me an e-mail when exceptions occurs and there have a been a lot of e-mails.

I wanted a simple solution with the following features:

  • No additional packages to install
  • No server restarts when the blacklist changes

In the given setup Apache is merely a proxy to my backend and a simple .htaccess inside the root directory with a lot of ip entries wouldn’t work. Instead this would have gone into the vhost definition which means server restarts / reloads.

I came up with the idea using the RewriteMap directive of mod_rewrite.

You can ask a RewriteMap for a value with anything ModRewrite and apache variables give you.

This is what my map (blacklist.txt) looks like:

111.73.45.82    b
111.73.45.151   b
111.73.45.164   b

I use httxt2dbm to create DBM Hash File

httxt2dbm -i blacklist.txt -o blacklist.dbm

and then in my vhost definition:

RewriteMap ipmap dbm:/etc/apache2/sites-available/blacklist.dbm 
RewriteCond ${ipmap:%{REMOTE_ADDR}} ^b$            [NC]
RewriteRule .* - [F,L]

That means:

Use the given blacklist.dbm as map named ipmap. Than ask for the value for the given remote address. If the value is “b” than deny access to all pages.

Simple, but effective.

| Comments (1) »

06-Sep-13


Pretty print XML data within Oracle Databases

Just a short post without further explanation.

Pretty printing xml in Oracle 10g and 11g differences quite a bit:

10g:

SELECT XMLTYPE('<html><body><p>Hallo, Welt.</p></body></html>').extract('/') FROM dual;

11g:

SELECT XMLSERIALIZE(Document XMLTYPE('<html><body><p>Hallo, Welt.</p></body></html>') AS CLOB INDENT SIZE = 2) FROM dual;

| Comments (2) »

05-Jun-13


How to fix jQuery UIs autocomplete width

I recently noticed that the combobox item on an jQuery UI autocomplete grows way beyond the textfield input which is kinda ugly.

This is how i fix it (that is, make it as width as the input item):

$.extend($.ui.autocomplete.prototype.options, {
	open: function(event, ui) {
		$(this).autocomplete("widget").css({
            "width": ($(this).width() + "px")
        });
    }
});

This code applies it to every autocomplete.

| Comments (17) »

02-May-13


Eine Reise in die Vergangenheit

Damals, es muss 1997 gewesen. Ich hatte gefühlt vor wenigen Minuten das Telefon ausgestöpselt, das Modemkabel abgerollt, bis in mein Zimmer verlegt und mich mit einem 56k Modem ins Internet eingewählt und surfte bzw. chattete. Wie jedes Mal waren die Pfeiftöne kaum verklungen, da hörte ich meine Mutter “Bist Du schon wieder im Internet?” oder “Bist Du noch immer im Internet? Ich will telefonieren!”.

So war das früher. Man war nicht always on und wenn man nicht zufällig ISDN zu Hause hatte, auch nicht telefonisch zu erreichen. Von Flatrates konnte man damals nur träumen, entweder zahlte man horrende Minuten(!)preise oder ebenso horrende Datenpreise.

In meiner ersten eigenen Wohnung tat zwar immer noch das Modem seinen Dienst, die Tarife wurden aber um 2000 günstiger. Nichts desto trotz gab es damals zumindest in der Wohnanlage, in der ich lebte, keine Flatrate. Ab 22:00 günstiger.

Irgendwann 2001 ~ 2002 besserte sich das, allerdings hatte ich damals noch kein DSL. Die Wohnanlage gehörter einer großen Gesellschaft mit eigenem TK Anbieter (es gab dort auch keinen “normalen” Telefonanschluss und man konnte auch nicht die “Vor-Vorwahlen” nutzen).

2003 fing in Aachen für mich das DSL und das Flatrate Zeitalter an. 2000Kbps. Flat. Always on! Natürlich hatte ich mich auch für eine Telefonflatrate entschieden und ich fand’ es toll. Endlich keine Gedanken mehr darüber machen.

Wenig später bot Arcor 6Mbps an, immer noch flat.

Was für eine Entwicklung. Steigerung der Geschwindigkeit um mehr als das 100fache von 56Kbps auf 6Mbps, dazu günstiger.

Nach einem Wohnorts- und Anbieterwechsel 2006 kam ich auf 18Mbps. Natürlich flat.

Für mich hätte diese Geschwindigkeit mehr als ausgereicht. Damit laden alle Webseiten ausreichend schnell und für HD-Filme reicht es auch. Auch mit mehreren Personen in einer Wohnung stellt diese Bandbreite kein Problem da.

2009. Erneuter Wohnortswechsel. Ein Eigenheim in Aachen. In einem Neubaugebiet. In meiner grenzenlosen Naivität dachte ich, dass dort moderne Leitungen zur Verfügung stehen. Auf dem Dach des Hauses war natürlich Platz für eine Satellitenschüssel ergo keine laufenden Kosten mehr für’s Fernsehprogramm durch einen Kabelanschluss ergo wurde ein solcher auch nicht verlegt (im ganzen Wohngebiet nicht).

Da ich sehr zufrieden mit meinem damaligem DSL Anbieter (NetCologne) war, wollte ich den natürlich mitnehmen. Und da fing das Leid an: Geht nicht, wir liefern dort nicht. ???? Nach Recherche und einem Besuch bei der Telekom kam ich mit einem Gesicht nach Hause, das meine Frau zur Aussage brachte: “Du würdest das Haus am liebsten wieder verkaufen?”.

Ja, hätte ich am liebsten gemacht: 2009 und jetzt 2013 bin ich immer noch bei gerade 2Mbps DSL und das noch nicht mal konstant, in den Abendstunden ist es deutlich langsamer. 10 Jahre zurück in die Vergangenheit. Mit 3 Personen im Haus teilweise nicht mehr benutzbar. Homeoffice machen und jemand anders guckt etwas auf Youtube? Vergiss es.

Ein Betriebssystemupdate? Muss geplant und in die Nacht verlegt werden.

HD Filme irgendwo kaufen oder leihen? Vergiss es, lohnt nicht. Download dauert 24h.

Alle reden immer vom Ausbau: Es gibt in Aachen Brand weder durchgehend Glasfaser (das wäre ja schon Luxus(!)) noch genügend Plätze in den DSL Verteilern, die Anschlüsse sind mehrfach belegt.

In diesem Stadtteil liefert außer Telekom und Resellern fast keiner. Oder wenn, dann nur ohne ISDN und was soll ich bei 2Mbps mit Voice Over IP anfangen? Da wird die Verständigung über Rauchzeichen besser sein.

Es wird auch in den nächsten Jahren kein Ausbau mehr dort statt finden. Das einzige was gebaut wird, sind noch mehr Häuser. Willkommen in der Internetsteinzeit. 8km entfernt vom Zentrum einer Eliteuniverstätsstadt gibt es kein modernes Internet.

Passend dazu kommen dann 2013 die Drosseltarife der Telekom. An meinem Anschluss brauche ich immerhin knapp 4 Tage, bis die Telekom die Geschwindigkeit auf knapp ein Viertel des gebuchten Wertes drosselt der damit auch nur unwesentlich über dem liegt, was ich bereits Anfang 2000 hatte.

Immerhin geht es mir da noch besser als einem VDSL Kunden mit einem 100Mbps Anschluss. Sein Anschluss liefert nach nur 7(!) Stunden(!!) Nutzung mit maximaler Geschwindigkeit nur noch 0,375% der gebuchten Geschwindigkeit.

Ich weiß nicht, ob ich lachen oder weinen soll.

Wenn ich im Moment die Werbung und Anzeigen für “schnelles” Internet sehe, ist mir eher nach Weinen zu Mute. In jeglicher Hinsicht günstiger und schneller als mein Anschluss. Willkommen in der Vergangenheit, vielleicht ist es ganz gut, dass ich das alte PCI Modem neulich beim Aufräumen noch nicht weggeworfen habe.

| Comments (5) »

25-Apr-13


Vaadin & Spring: Integrating Vaadin with Spring Security

Note: You’ll find the complete working sources here: Vaadin-SpringSecurityViewProvider.

Finally, the 2nd post in my Vaadin & Spring series. This time about describing, instantiating and managing views with
and through Spring Security.

I’m a big fan of Spring Security as it is – at least for my purposes – incredible easy to add some long standing authorization mechanism we have in our databases. Apart from that, it most of the times just works.

I’ve read a lot about Shiro as well, but instead of learning another framework, i wanted to focus on something i already knew quite well to keep things secure. Regarding security i like to be conservative.

For the basic integration i’m using SpringVaadinIntegration by Alexander Fedorov and i’m very content with it, the ru.xpoft.vaadin.SpringVaadinServlet works very well.

My goals with adding custom stuff to it where the following:

  • I want to use Spring Security
  • The application need to use a Navigator
  • No redundant @Component and @Scope on every view

The following code implies a working Spring + AspectJ, Spring Security and Vaadin setup including the above mentioned SpringVaadinServlet.

So the first thing i came up with is my own ViewDescriptor annotation:

import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE;
 
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
 
import com.vaadin.navigator.View;
 
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
@Scope(SCOPE_PROTOTYPE)
public @interface ViewDescription {
  /** The name of the view, also used by the navigator, can be a complete path like /foo/bar/baz */
  String name() default "";
 
  /**
   * @return the Spring-EL expression to be evaluated before the view described here is finally added to the navigator.
   */
  String requiredPermissions() default "";
 
  /**
   * @return Can this view be cached if caching is available?
   */
  boolean cacheable() default false;
}

This thing can be used on every class implementing “com.vaadin.navigator.View” and makes it a managed spring component.

The next step is naturally to provide those view to the application using a custom ViewProvider. Here’s my solution that maps view names to view classes and retrieves them from the application context. As the components are prototype scoped it will be new instances for every application instance. If the views can and should be cached, this is implemented as well.

My first solution was a custom (overwritten) Navigator in conjunction with a specialized ViewProvider. But after writing this post and creating a custom project i thought a while longer.

In the end it just needs a custom view SpringSecurityViewProvider who takes care of finding views, checking permissions and caching the views if necessary. So in the end i used the stuff from my previous post to create a view provider who has an autowired ApplicationContext and is used in the Applications init method like this:

final ComponentContainerViewDisplay viewDisplay = new ComponentContainerViewDisplay(this.mainContent);
this.navigator = new Navigator(UI.getCurrent(), viewDisplay);
this.navigator.addProvider(
  SpringSecurityViewProvider.createViewProvider((Authentication) request.getUserPrincipal())
);

The little factory method became necessary because the Application Context cannot be injected into the constructor through it’s transient nature. If i hadn’t the need for the current authentication i probably would have used a @PostConstruct method instead.

In contrast to the first version of this post, the code for the ViewProvider is omitted as i have created a project on Github called Vaadin-SpringSecurityViewProvider. You’ll find the whole source code there including tests that show how to setup a correct load-time-weaving necessary for @Configurable’s.

Using only a custom ViewProvider (which by the way is an interface) is way better than a combination of Navigator and ViewProvider. That way the user can use all navigator constructors and functions.

Our views now looks like this:

@ViewDescription(
    name=SomeView.VIEW_NAME,
    requiredPermissions=
      "isAuthenticated() and " +
      "@authorizationService.hasExecutionalRight(principal, T(some.enumeration.of.BusinessProcesses).PROCESS_NAME)"
)
@DependsOn("application")
public class SomeView extends Panel implements View {
  public final static String VIEW_NAME = "/some/arbitrary/path";
}

You see all the power of SpEL and Spring Security in the requiredPermissions attribute: Not only checking for authentication but also calling an authorization service with the current principal as parameter and an enum constant describing a business process. The whole thing then actually calls an Oracle stored function by the way.

What do you think about this solution? Any ideas for improvement or comments?

| Comments (4) »

30-Mar-13