<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet href="/templates/default/atom.css" type="text/css" ?>

<feed 
   xmlns="http://www.w3.org/2005/Atom"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:admin="http://webns.net/mvcb/"
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
   xmlns:wfw="http://wellformedweb.org/CommentAPI/">
    <link href="http://itblog.eckenfels.net/feeds/atom10.xml" rel="self" title="IT Blog" type="application/atom+xml" />
    <link href="http://itblog.eckenfels.net/"                        rel="alternate"    title="IT Blog" type="text/html" />
    <link href="http://itblog.eckenfels.net/rss.php?version=2.0"     rel="alternate"    title="IT Blog" type="application/rss+xml" />
    <title type="html">IT Blog</title>
    <subtitle type="html">Bernd Eckenfels notiert...</subtitle>
    <icon>http://itblog.eckenfels.net/templates/default/img/s9y_banner_small.png</icon>
    <id>http://itblog.eckenfels.net/</id>
    <updated>2012-02-04T16:28:26Z</updated>
    <generator uri="http://www.s9y.org/" version="1.5.3">Serendipity 1.5.3 - http://www.s9y.org/</generator>
    <dc:language>de</dc:language>
    <admin:errorReportsTo rdf:resource="mailto:bernd-2011@eckenfels.net" />

    <entry>
        <link href="http://itblog.eckenfels.net/archives/486-Passwortsicherheit.html" rel="alternate" title="Passwortsicherheit" />
        <author>
            <name>Bernd Eckenfels</name>
            <email>bernd-2011@eckenfels.net</email>        </author>
    
        <published>2012-02-03T04:25:13Z</published>
        <updated>2012-02-04T16:28:26Z</updated>
        <wfw:comment>http://itblog.eckenfels.net/wfwcomment.php?cid=486</wfw:comment>
    
        <slash:comments>7</slash:comments>
        <wfw:commentRss>http://itblog.eckenfels.net/rss.php?version=atom1.0&amp;type=comments&amp;cid=486</wfw:commentRss>
    
            <category scheme="http://itblog.eckenfels.net/categories/8-Sicherheit" label="Sicherheit" term="Sicherheit" />
    
        <id>http://itblog.eckenfels.net/archives/486-guid.html</id>
        <title type="html">Passwortsicherheit</title>
        <content type="xhtml" xml:base="http://itblog.eckenfels.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                Passwörter haben eine Menge Probleme. Deswegen gibt es jede Menge best-practice um diese Probleme etwas zu reduzieren. Eine einfache Regel ist, dass man Passwörter von Benutzern so abspeichern sollte, dass diese nicht wiederhergestellt werden können. Der Grund dafür ist insbesondere dass die Passwörter die ggf. in unterschiedlichen Diensten genutzt werden nicht eventuellen Hackern (oder unehrlichen Administratoren) in die Hände fallen können.<br />
<br />
Dazu werden die Passwörter durch eine Hash Funktion einwegverschlüsselt. Bei der Prüfung des Passwortes wird dann nicht das eingegebene Passwort mit der gespeicherten Version vergleichen, sondern die Einweg-Funktion darauf angewendet und dann verglichen. Eine Konsequenz dieses Verfahren ist es, dass das Passwort von der Anwendung nicht wieder angezeigt oder per Mail an den User gesendet werden kann.<br />
<br />
Bei mehr oder weniger öffentlichen Diensten ist es üblich, dass es dort eine Passwort-vergessen Funktion gibt die eine Reset Mail an den Benutzer versendet. Dieses Verfahren verlässt sich auf die Sicherheit des E-Mail Verkehrs - ist somit keine sonderlich sichere Option - aber bei Diensten die mehr oder weniger öffentlich angeboten werden ist die E-Mail Adresse sowieso die einzige zusätzliche Möglichkeit den User zu erreichen.<br />
<br />
Es gibt im wesentlichen 3 Möglichkeiten für solche Passwort-Zurücksetzungsmails:<br />
<br />
a) aktuelles Passwort per E-Mail zusenden. Das hat den ganz großen Nachteil, dass das Passwort dazu wiederhergestellt werden muss (also nicht Einweg-verschlüsselt sein kann). Außerdem wird das aktuelle Passwort unverschlüsselt per E-Mail versendet. Was besonders problematisch ist wenn dieses wiederverwendet wurde oder weiterverwendet wird.<br />
<br />
b) neues Passwort erzeugen und zumailen. Nachteil bei dieser Methode: jeder kann eine beliebige E-Mail Adresse eingeben um deren Besitzer mit nicht funktionierenden Passwörtern zu nerven.<br />
<br />
c) Reset-Link erzeugen und zumailen. Wenn der Benutzer den Link benutzt, so wird er um Eingabe eines neues Passwortes gebeten. Dies bietet den Vorteil, dass das alte Passwort weiterhin gültig bleibt wenn die Funktion jemand unberechtigt benutzt. Außerdem wird kein Passwort per (unverschlüsselter) Mail versendet.<br />
<br />
Man sieht hier schnell, dass die Methode a) nicht nur die unsicherste und unpraktische ist, sondern auch dass man daraus auch als Endanwender (ohne den Quelltext zu analysieren oder die Datenbank zu kennen) sofort ablesen kann, dass die Web Anwendung eine unsichere Passwort Speicherung verwendet.<br />
<br />
Immer wenn ich eine Passwort Recovery Mail mit einem bestehenden Passwort bekomme regt mich das auf, deswegen muss ich jetzt mal einfach hier im Blog "Fingerpointint" betreiben:<br />
<ul><li> <a href="http://itblog.eckenfels.net/exit.php?url_id=5532&amp;entry_id=486" title="http://software.intel.com"  onmouseover="window.status='http://software.intel.com';return true;" onmouseout="window.status='';return true;">Intel Software Network</a>: speichert und mailt Passwörter an Benutzer</li><li>BMC Servicedesk Express: speichert und mailt Passörter an Benutzer. <a href="http://itblog.eckenfels.net/exit.php?url_id=5534&amp;entry_id=486" title="https://magickb.remedy.com/Helpdesk/MiscPreLoginPages.asp?Module=FORGOTPWD"  onmouseover="window.status='https://magickb.remedy.com/Helpdesk/MiscPreLoginPages.asp?Module=FORGOTPWD';return true;" onmouseout="window.status='';return true;">(Beispiel)</a></li><li> Open Application Group (OAGi) Portal. <a href="http://itblog.eckenfels.net/exit.php?url_id=5535&amp;entry_id=486" title="http://www.oagi.org/dnn2/MembersOnly/MemberLogin/tabid/208/ctl/SendPassword/Default.aspx?returnurl=http%3a%2f%2fwww.oagi.org%2fdnn2%2fMembersOnly%2fMemberLogin.aspx"  onmouseover="window.status='http://www.oagi.org/dnn2/MembersOnly/MemberLogin/tabid/208/ctl/SendPassword/Default.aspx?returnurl=http%3a%2f%2fwww.oagi.org%2fdnn2%2fMembersOnly%2fMemberLogin.aspx';return true;" onmouseout="window.status='';return true;">(Beispiel)</a></li><li>RosettaNet.org <a href="http://itblog.eckenfels.net/exit.php?url_id=5536&amp;entry_id=486" title="http://rosettanet.org/RosettaNetMemberLogin/tabid/3129/ctl/SendPassword/Default.aspx"  onmouseover="window.status='http://rosettanet.org/RosettaNetMemberLogin/tabid/3129/ctl/SendPassword/Default.aspx';return true;" onmouseout="window.status='';return true;">(Beispiel)</a></li><li> kontent.de <a href="http://itblog.eckenfels.net/exit.php?url_id=5537&amp;entry_id=486" title="https://admin.kontent.com/information/pwreminder/-0368a425707befc77681b8e51ea397c7/"  onmouseover="window.status='https://admin.kontent.com/information/pwreminder/-0368a425707befc77681b8e51ea397c7/';return true;" onmouseout="window.status='';return true;">(Beispiel)</a></li></ul><br />
<b>Update:</b> OAGi und Rosettanet.org (danke Christian) hinzugefügt. kontent.de hinzugefügt (danke Robin). 
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://itblog.eckenfels.net/archives/485-E-Mail-versenden-von-Amazon-EC2-SES-mit-Exim.html" rel="alternate" title="E-Mail versenden von Amazon EC2 (SES mit Exim)" />
        <author>
            <name>Bernd Eckenfels</name>
            <email>bernd-2011@eckenfels.net</email>        </author>
    
        <published>2012-01-14T00:06:38Z</published>
        <updated>2012-01-19T23:57:11Z</updated>
        <wfw:comment>http://itblog.eckenfels.net/wfwcomment.php?cid=485</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://itblog.eckenfels.net/rss.php?version=atom1.0&amp;type=comments&amp;cid=485</wfw:commentRss>
    
            <category scheme="http://itblog.eckenfels.net/categories/19-Cloud" label="Cloud" term="Cloud" />
            <category scheme="http://itblog.eckenfels.net/categories/13-Technik" label="Technik" term="Technik" />
    
        <id>http://itblog.eckenfels.net/archives/485-guid.html</id>
        <title type="html">E-Mail versenden von Amazon EC2 (SES mit Exim)</title>
        <content type="xhtml" xml:base="http://itblog.eckenfels.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                Wie ich <a href="http://itblog.eckenfels.net/archives/480-E-Mail-versenden-von-Amazon-EC2.html">bereits berichtet</a> hatte kann es für einen Anwender der IaaS Cloud Amazon EC2 Sinn ergeben den <i>Simple Email Service</i> (<a href="http://itblog.eckenfels.net/exit.php?url_id=5529&amp;entry_id=485" title="http://aws.amazon.com/documentation/ses/"  onmouseover="window.status='http://aws.amazon.com/documentation/ses/';return true;" onmouseout="window.status='';return true;">SES</a>) von Amazon zu verwenden um E-Mails zu versenden.<br />
<br />
Dabei kann man entweder die Amazon API/Tools verwenden, oder inzwischen auch die Mails per smtps an den Amazon Smarthost liefern. Amazon selbst bietet nur einen SMTP-SSL Server auf Port 465 an. Die meisten MTAs können dieses Protokoll nicht mehr sprechen und ziehen STARTTLS vor, deswegen empfiehlt Amazon in seiner <a href="http://itblog.eckenfels.net/exit.php?url_id=5526&amp;entry_id=485" title="http://docs.amazonwebservices.com/ses/latest/DeveloperGuide/SMTP.html"  onmouseover="window.status='http://docs.amazonwebservices.com/ses/latest/DeveloperGuide/SMTP.html';return true;" onmouseout="window.status='';return true;">Anleitung</a> die Verwendung von <i>stunnel</i> als zwischengeschaltenen Proxy.<br />
<br />
Diese Indirektion ist aber unschön, und kann mit einer aktuellen <i>Exim</i> Version vermieden werden. Ab der Version 4.77 unterstützt der SMTP Transport von Exim auch das <a href="http://itblog.eckenfels.net/exit.php?url_id=5530&amp;entry_id=485" title="http://www.exim.org/exim-html-4.77/doc/html/spec_html/ch30.html"  onmouseover="window.status='http://www.exim.org/exim-html-4.77/doc/html/spec_html/ch30.html';return true;" onmouseout="window.status='';return true;">smtps Protokoll</a> (für ausgehende Verbindungen).<br />
<br />
Mit folgenden Exim Einstellungen (Auszug) kann also ein EC2 Linux Rechner direkt an den Amazon Dienst die E-Mail ausliefern (wichtig: die Envelop-From und From: Addresse der versendeten Mails müssen in der Liste der verifizierten SES Absender sein. Als Empfänger kommen nur dann beliebige E-Mail Addressen in Frage, wenn man diese Funktion bei Amazon explizit freischalten hat lassen.<br />
<br />
1. Alle Mails an dem Amazon Server leiten (dnslookup entfernen):<br />
<pre>smarthost:
  driver = manualroute
  domains = ! +local_domains
  transport = remote_smtps
  route_data = email-smtp.us-east-1.amazonaws.com
  no_more</pre><br />
2. Einen neuen SMTP/SSL Transport definieren:<br />
<pre>remote_smtps:
  driver = smtp
  protocol = smtps
  #port = 465
  hosts_require_auth = &#42;
  hosts_require_tls = &#42;</pre><br />
3. Zusätzlich einen Authenticator mit dem SES User/Passwort definieren:<br />
<pre>client_login:
  driver = plaintext
  public_name = LOGIN
  client_send = : xxxxI6CIH2YIWSNxxxxx : Agcq00AEvA2ZDiQHNrDvTEODE3FWa1rxxxxx</pre><br />
Ich habe das ganze unter Amazon Linux mit Exim 4.77 aus dem AltCent Repository getestet:<br />
<pre>wget http://centos.alt.ru/repository/centos/6/i386/exim-4.77-1.el6.i686.rpm
rpm -i exim-4.77-1.el6.i686.rpm</pre><br />
Es bietet sich an Exim so zu konfigurieren, dass nur auf localhost auf dem Submission Port E-Mails angenommen werden:<br />
<pre>daemon_smtp_ports = 587
local_interfaces = 127.0.0.1</pre><br />
Dies stellt sicher, dass der Dienst nicht für Spam oder Sicherheitsangriffe ausgenutzt werden kann. 
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://itblog.eckenfels.net/archives/484-Java-7-Probleme-mit-neuen-JSSE-Features.html" rel="alternate" title="Java 7 - Probleme mit neuen JSSE Features" />
        <author>
            <name>Bernd Eckenfels</name>
            <email>bernd-2011@eckenfels.net</email>        </author>
    
        <published>2012-01-07T10:36:35Z</published>
        <updated>2012-01-07T12:25:16Z</updated>
        <wfw:comment>http://itblog.eckenfels.net/wfwcomment.php?cid=484</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://itblog.eckenfels.net/rss.php?version=atom1.0&amp;type=comments&amp;cid=484</wfw:commentRss>
    
            <category scheme="http://itblog.eckenfels.net/categories/7-Java-Programming" label="Java Programming" term="Java Programming" />
            <category scheme="http://itblog.eckenfels.net/categories/8-Sicherheit" label="Sicherheit" term="Sicherheit" />
    
        <id>http://itblog.eckenfels.net/archives/484-guid.html</id>
        <title type="html">Java 7 - Probleme mit neuen JSSE Features</title>
        <content type="xhtml" xml:base="http://itblog.eckenfels.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                Mit Java 7 sind in den SSL/TLS Provider von Oracle einige <a href="http://itblog.eckenfels.net/exit.php?url_id=5519&amp;entry_id=484" title="http://docs.oracle.com/javase/7/docs/technotes/guides/security/enhancements7.html"  onmouseover="window.status='http://docs.oracle.com/javase/7/docs/technotes/guides/security/enhancements7.html';return true;" onmouseout="window.status='';return true;">neue Funktionen</a> eingezogen. Darunter der schon lange erwartete Support für TLSv1.1 und TLSv1.2, aber auch die Unterstützung der <a href="http://itblog.eckenfels.net/exit.php?url_id=5520&amp;entry_id=484" title="http://www.ietf.org/rfc/rfc3546.txt"  onmouseover="window.status='http://www.ietf.org/rfc/rfc3546.txt';return true;" onmouseout="window.status='';return true;">TLS Extensions</a> u.A. für die Server Name Indication(SNI).<br />
<br />
Letzteres wird dazu verwendet virtuelle Hosts auf einem SSL Port zu unterstützen: Bisher konnte ein SSL Server nämlich nicht wissen an welchen (der potentiell vielen) virtuellen Dienste hinter einer IP Adresse sich der SSL Client wenden will. Besonders ärgerlich ist dies im Fall von HTTP/s, dort ist es die Regel dass Hoster sehr viele Kunden-Domains hinter ein und der selben IP-Adresse betreiben. In HTTP/1.1 wird der gewünschte Servername in der Anfrage mitgegeben (Host: Header). So kann der HTTP Server entscheiden welche Webseiten er ausliefern soll. <br />
<br />
Im Falle des SSL Server Zertifikats (welches im SSL Handshake schon vor der HTTP Anfrage ausgetauscht wird), kann dies der Webserver aber nicht. Er muss raten welches Zertifikat er dem Client präsentieren soll, und das schlägt natürlich in der Regel fehl. Mit der Extension wird der Servername auch im Handshake mitgeschickt, und der Server kann sein Zertifikat passend auswählen.<br />
<br />
Problem bei der Geschichte ist: der Server darf auf eine solche Namensanfrage mit einem SSL Alert (Warning) reagieren. In dieser sagt er, dass er sich für den angefragten Host nicht zuständig fühlt. Das kommt bei aktuellen Webserver Installationen häufig vor, weil diese einfach nicht korrekt eingerichtet sind (und die modernen Browser die SNI unterstützen diese Warnung auch einfach ignorieren). Da das zurückgelieferte Default Zertifikat oftmals den richtigen Hostnamen (in einer der Attribute) enthält, klappt der gesicherte Handschlag im Alltag dennoch. Nicht jedoch mit Java 7 SSL Clients, JSSE macht daraus eine fatale Exception:<br />
<pre><code>javax.net.ssl.<b>SSLProtocolException: handshake alert: unrecognized_name</b>
	at sun.security.ssl.ClientHandshaker.handshakeAlert
	at sun.security.ssl.SSLSocketImpl.recvAlert
	at sun.security.ssl.SSLSocketImpl.readRecord
	at sun.security.ssl.SSLSocketImpl.performInitialHandshake
	at sun.security.ssl.SSLSocketImpl.startHandshake
	at sun.security.ssl.SSLSocketImpl.startHandshake
	at sun.net.www.protocol.https.HttpsClient.afterConnect
	at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect
	at sun.net.www.protocol.http.HttpURLConnection.getOutputStream
	at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream</code></pre><br />
Ich habe deswegen einen <a href="http://itblog.eckenfels.net/exit.php?url_id=5521&amp;entry_id=484" title="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7127374"  onmouseover="window.status='http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7127374';return true;" onmouseout="window.status='';return true;">Bugreport</a> aufgemacht, jedoch wurde dieser wieder kommentarlos geschlossen. Falls Sie nun trotz Oracle's widerstreben die Notwendigkeit haben mit einem Web Server zu kommunizieren der SNI nicht richtig eingerichtet hat, so bleiben nur 2 Möglichkeiten über:<br />
<br />
a) TLS aus der Liste der unterstützten Protokolle entfernen - mit einem SSLv3 Handshake wird kein Extension Record übertragen, und entsprechend klappt auch der Handshake (solange der Server SNI nicht benötigt).<br />
<br />
b) den SSL Socket so initialisieren, dass die SSLEngine den Host nicht kennt. Dieser sogenannte Host hint wird für mehrere Dinge verwendet, kann aber auch weggelassen werden. Erreichen kann man dies, indem man den Socket statt mit <code>s=factory.createSocket(name, port);</code> mit "s=factory.createSocket(); s.connect(name,port);" erzeugt.<br />
<br />
Übrigens ist dies ein ziemlich unerwartetes Verhalten: SSL mit Kerberos Authentifizierung würde nur auf die erste Art und Weise funktionieren, da hierfür die Identität des Servers bekannt sein muss.<br />
<br />
Der Punkt a) ist ein schneller Fix, kommt aber in der Praxis eigentlich nicht in Frage, da man mit Java 7 ja eher daran Interesse hat TLSv1.1 oder TLSv1.2 zu verwenden um Lücken wie z.B. den <a href="http://itblog.eckenfels.net/archives/478-SSLTLS-BEAST-Luecke.html">BEAST-Angriff</a> auszuschließen. Daher bleibt es nur übrig entweder den Anwendungscode zu ändern (oder wenn man diesen nicht selbst geschrieben hat, wie im Falle einer häufig verwendeten URLConnection oder beim Apache HTTPClient) oder aber mindestens eine eigene SSLSocketFactory zu implementieren, die auf die 2-stufige Erzeugung des SSLSockets aufsetzt.<br />
<br />
<b>Update</b>: Ich habe in den Sourcen grade eine System Property gefunden, mit der man abschalten kann, dass der ClientHandshaker die SNI Extention sendet. Dies lässt sich als Work around gut verwenden: System.setProperty("jsse.enableSNIExtension", "false"); (muss vor der Verwendung von SSL Klassen im Programm, oder auf der Command Line gesetzt werden).<br />
 
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://itblog.eckenfels.net/archives/483-Eckpunktepapier-der-BNetzA-zu-Smart-Grids-und-Markets.html" rel="alternate" title="Eckpunktepapier der BNetzA zu Smart Grids und Markets" />
        <author>
            <name>Bernd Eckenfels</name>
            <email>bernd-2011@eckenfels.net</email>        </author>
    
        <published>2012-01-03T06:47:40Z</published>
        <updated>2012-01-03T07:34:03Z</updated>
        <wfw:comment>http://itblog.eckenfels.net/wfwcomment.php?cid=483</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://itblog.eckenfels.net/rss.php?version=atom1.0&amp;type=comments&amp;cid=483</wfw:commentRss>
    
            <category scheme="http://itblog.eckenfels.net/categories/19-Cloud" label="Cloud" term="Cloud" />
            <category scheme="http://itblog.eckenfels.net/categories/11-Hardware" label="Hardware" term="Hardware" />
            <category scheme="http://itblog.eckenfels.net/categories/13-Technik" label="Technik" term="Technik" />
    
        <id>http://itblog.eckenfels.net/archives/483-guid.html</id>
        <title type="html">Eckpunktepapier der BNetzA zu Smart Grids und Markets</title>
        <content type="xhtml" xml:base="http://itblog.eckenfels.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                Die Bundesnetzagentur hat ein <a href="http://itblog.eckenfels.net/exit.php?url_id=5515&amp;entry_id=483" title="http://www.bundesnetzagentur.de/cln_1912/DE/Sachgebiete/ElektrizitaetGas/Sonderthemen/SmartGridEckpunktepapier/SmartGridPapier_Basepage.html"  onmouseover="window.status='http://www.bundesnetzagentur.de/cln_1912/DE/Sachgebiete/ElektrizitaetGas/Sonderthemen/SmartGridEckpunktepapier/SmartGridPapier_Basepage.html';return true;" onmouseout="window.status='';return true;">Eckpunktepapier</a> zum Thema Smart Grids und Markets veröffentlicht. Damit will die Bundesbehörde<br />
<blockquote>durch dieses Papier eine intensivere Diskussion der Thematik anstoßen zu können und die Veränderungen des Energieversorgungssystems weiter voran zu bringen. Dieses Eckpunktepapier soll die Diskussion zu dieser Thematik weiter befördern und besser strukturieren.</blockquote><br />
Das "Eckpunktepapier der Bundesnetzagentur zu den Aspekten des sich verändernden Energieversorgungssystems" enthält Leitgedanken und Begriffsdefinitionen und ist schon aus diesem Grund sehr lesenswert. Ob die einzelnen Thesen (Abnahme des Gesamtenergieverbrauchs) nun zutreffen wird sich zeigen, von einer Zunahme der Stromabnahme wird aber ausgegangen. Auch bei intelligenteren Verbrauchern (da zunehmend andere Energieformen verdrängt werden, was angesichts der Endlichkeit von fossilen Energieträgern nur logisch ist).<br />
<br />
Das Paper baut darauf, dass Verbraucher sich über Marktsignale (Preise) steuern lassen. Das wird sich zeigen wie gut das funktioniert... <br />
<br />
Ein wenig sehr optimistisch dürfte die Annahme der Transaktionskostensenkung bei "kleinteiliger Interaktion" sein (<a href=""http://www.econbiz.de/archiv1/2009/95110_gasmarkt_zaehler.pdf">Fehlschläge im Smartmeter Markt wie in den Niederlanden oder Großbritannien</a> deuten ja eher darauf hin, dass es sinnvoll sein kann alternative Lösungswege anzustreben und nicht alles über Informationstechnologie lösen zu wollen. Größtenteils wird der Smartmetermarkt von Anbietern getrieben die sich neue Einnahmequellen versprechen und die Vorteile werden in den meisten Haushalten weder gesehen - noch existieren diese). Das BNetzA Papier sieht dies aber auch (Leitgedanke 4). <br />
<br />
Was mir persönlich im Papier fehlt ist ein klarere Fokus auf das Thema Datenschutz, Schutz von kritischen Infrastrukturen und Monokultur. Die Notwendigkeit von Datendrehscheiben wird nicht hinterfragt, und eine Vermischung der Messdaten von Prosumenten oder Industrieabnehmern mit den Messstellen in Haushalten führt meiner Meinung nach zu einer Übertechnisierung der Haushalte. Für eine zuverlässige Demand-Site Prognose ist meiner Meinung nach nicht notwendig den Tagesverlauf jedes einzelnen Haushaltes zu betrachten - ganz im Gegenteil das ist eher schädlich. Der Nutzen von mehr Transparenz beim Stromverbrauch eines einzelnen Haushaltes kann auch durch eine rein lokale Informationsanwendung (deutlich besser) gelöst werden. Eine feingranulare Übermittlung von Messwerten erscheint mir nicht zwingend notwendig und vor allem nicht Ökonomisch.<br />
<br />
<i>In dem Zusammenhang verweise ich auch auf den Artikel in der aktuellen <a href="http://itblog.eckenfels.net/exit.php?url_id=5516&amp;entry_id=483" title="http://ds.ccc.de"  onmouseover="window.status='http://ds.ccc.de';return true;" onmouseout="window.status='';return true;">Datenschleuder</a> #95 (Power to the People, Das Stromnetz der Zukunft, Mathias Dalheimer, Seite 35-48) und die Projekte <a href="http://itblog.eckenfels.net/exit.php?url_id=5517&amp;entry_id=483" title="https://www.mysmartgrid.de/content/das-projekt"  onmouseover="window.status='https://www.mysmartgrid.de/content/das-projekt';return true;" onmouseout="window.status='';return true;">mySmartGrid</a> sowie <a href="http://itblog.eckenfels.net/exit.php?url_id=5518&amp;entry_id=483" title="http://www.volkszaehler.org"  onmouseover="window.status='http://www.volkszaehler.org';return true;" onmouseout="window.status='';return true;">volkszaehler.org</a>.</i> 
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://itblog.eckenfels.net/archives/482-SQL-Server-JDBC-Probleme.html" rel="alternate" title="SQL Server JDBC Probleme" />
        <author>
            <name>Bernd Eckenfels</name>
            <email>bernd-2011@eckenfels.net</email>        </author>
    
        <published>2012-01-01T02:31:37Z</published>
        <updated>2012-01-01T03:30:31Z</updated>
        <wfw:comment>http://itblog.eckenfels.net/wfwcomment.php?cid=482</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://itblog.eckenfels.net/rss.php?version=atom1.0&amp;type=comments&amp;cid=482</wfw:commentRss>
    
            <category scheme="http://itblog.eckenfels.net/categories/7-Java-Programming" label="Java Programming" term="Java Programming" />
            <category scheme="http://itblog.eckenfels.net/categories/8-Sicherheit" label="Sicherheit" term="Sicherheit" />
    
        <id>http://itblog.eckenfels.net/archives/482-guid.html</id>
        <title type="html">SQL Server JDBC Probleme</title>
        <content type="xhtml" xml:base="http://itblog.eckenfels.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                Von den Änderungen in Java SE 6.0 Update 29 zum Schutz vor SSL BEAST Angriffen hatte ich schon <a href="http://itblog.eckenfels.net/exit.php?url_id=5510&amp;entry_id=482" title="http://itblog.eckenfels.net/archives/478-SSLTLS-BEAST-Luecke.html"  onmouseover="window.status='http://itblog.eckenfels.net/archives/478-SSLTLS-BEAST-Luecke.html';return true;" onmouseout="window.status='';return true;">berichtet</a>. Ein Opfer dieser Kompatibilitätsänderung sind die JDBC Treiber für den Microsoft SQL Server (<a href="http://itblog.eckenfels.net/exit.php?url_id=5511&amp;entry_id=482" title="http://jtds.sourceforge.net/"  onmouseover="window.status='http://jtds.sourceforge.net/';return true;" onmouseout="window.status='';return true;">jTDS</a> und <a href="http://itblog.eckenfels.net/exit.php?url_id=5512&amp;entry_id=482" title="http://msdn.microsoft.com/en-us/sqlserver/aa937724"  onmouseover="window.status='http://msdn.microsoft.com/en-us/sqlserver/aa937724';return true;" onmouseout="window.status='';return true;">Microsoft JDBC Driver for SQL Server</a> sind betroffen).<br />
<br />
Beim Aufbau der Verbindung (TCP) direkt mit dem <strong>jTDS</strong> Treiber kommt es zu folgendem Fehler:<br />
<pre>java.sql.SQLException: I/O Error: Software caused connection abort: recv failed
  State  : 08S01
  Error  : 0</pre><br />
Und die folgende Exception wirft der <strong>Microsoft JDBC Driver for SQL Server</strong>:<br />
<pre>com.microsoft.sqlserver.jdbc.SQLServerException: Connection reset
  State  : 08S01
  Error  : 0</pre><br />
Wenn die Treiber durch einen Connection Pool benutzt werden, oder innerhalb einer Datasource, so kann es sogar zum Hängen (wegen Endlosschleife) kommen.<br />
<br />
Eine Möglichkeit ist es, beim jTDS Treiber anzugeben, dass man kein SSL machen möchte (sollte aber eigentlich auch der default sein, laut <a href="http://itblog.eckenfels.net/exit.php?url_id=5513&amp;entry_id=482" title="http://jtds.sourceforge.net/faq.html#urlFormat"  onmouseover="window.status='http://jtds.sourceforge.net/faq.html#urlFormat';return true;" onmouseout="window.status='';return true;">jTDS FAQ</a>). Dies kann man mit dem JDBC URL Property "<code>;ssl=no</code>" erreichen. Wenn der Server allerdings auf "Force Encryption" konfiguriert ist, so wird er dann die Logins ablehnen. Beim Microsoft Treiber würde das property "<code>encrypt=false</code>" lauten, dies half aber in meinen Versuchen (mit MS SQL Server 2008 R2 Express) nicht.<br />
<br />
Eine weitere Möglichkeit ist es den SSL/TLS CBC-Fix per Java System Property abzuschalten: <code>-Djsse.enableCBCProtection=false</code><br />
<br />
Dies wirkt sich aber auf alle anderen SSL Verbindungen innerhalb dieser VM ebenfalls aus. Es gibt Berichte, dass dieses Problem mit JavaSE 6.0 Update 30 behoben sei, das kann ich aber weder nachvollziehen, noch lassen die ReleaseNotes darauf schließen. Ich habe mal einen <a href="http://itblog.eckenfels.net/exit.php?url_id=5514&amp;entry_id=482" title="https://sourceforge.net/tracker/?func=detail&amp;aid=3468079&amp;group_id=33291&amp;atid=407762"  onmouseover="window.status='https://sourceforge.net/tracker/?func=detail&amp;aid=3468079&amp;group_id=33291&amp;atid=407762';return true;" onmouseout="window.status='';return true;">Fehlerbericht bei jTDS</a> dazu geöffnet. 
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://itblog.eckenfels.net/archives/481-Facebook-Events-im-Google-Kalender.html" rel="alternate" title="Facebook Events im Google Kalender" />
        <author>
            <name>Bernd Eckenfels</name>
            <email>bernd-2011@eckenfels.net</email>        </author>
    
        <published>2011-12-30T00:11:26Z</published>
        <updated>2011-12-30T01:56:56Z</updated>
        <wfw:comment>http://itblog.eckenfels.net/wfwcomment.php?cid=481</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://itblog.eckenfels.net/rss.php?version=atom1.0&amp;type=comments&amp;cid=481</wfw:commentRss>
    
            <category scheme="http://itblog.eckenfels.net/categories/19-Cloud" label="Cloud" term="Cloud" />
            <category scheme="http://itblog.eckenfels.net/categories/13-Technik" label="Technik" term="Technik" />
    
        <id>http://itblog.eckenfels.net/archives/481-guid.html</id>
        <title type="html">Facebook Events im Google Kalender</title>
        <content type="xhtml" xml:base="http://itblog.eckenfels.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                Wer ein Smartphone mit sich rumschleppt wird schon auf die Idee gekommen sein einen Web Kalender wie z.B. <a href="http://www.google.com/calendar">Google Calendar</a> zu synchronisieren, um immer alle Termine im Blick zu haben. In meinem Fall habe ich einen Google Calendar Account in dem ich einige andere Kalender zusammenfasse, dieser wird dann per CalDAV auf dem iPhone eingebunden. So sehe ich zum Beispiel die <a href="http://ka.stadtblog.de/it-termine">Karlsruher IT Termine</a>, die Familientermine und die <a href="https://www.google.com/calendar/b/0/embed?src=zusammenkunft.net_pvml7h19o94i47kmn9sjsu7ufg@group.calendar.google.com&ctz=Europe/Berlin">Termine der Karlsruher Piraten</a>.
<P>
<a class="serendipity_image_link" title="Screenshot Facebook Event Export" href='http://itblog.eckenfels.net/uploads/screen/screenshot_fbcal_export.jpg'><!-- s9ymdb:152 --><img class="serendipity_image_right" width="110" height="65"  src="http://itblog.eckenfels.net/uploads/screen/screenshot_fbcal_export.serendipityThumb.jpg" title="Screenshot Facebook Event Export" alt="Screenshot Facebook Event Export" /></a>Was mir bisher noch gefehlt hat, waren meine <a href="http://www.facebook.com/events/">Facebook Events</a>, da hier immer auch mal wieder eine Einladung dabei ist, der ich zwar bei Facebook zusage, diese dann aber nicht in einen der Google Calender übernehme. Es gibt hier aber eine einfache Möglichkeit, man kann die Events in Facebook als webcal/ical Feed exportieren. Diese URL kann man dann in Google als neuen Kalender von einer URL importieren.
<P>
Das hat aber leider das Problem, dass Google bei einigen Einträgen kein Titel oder Beschreibung anzeigt. Das ist ein <a href="http://www.google.com/support/forum/p/Calendar/thread?tid=781090b7218296a6&hl=en">bekanntes Problem</a>, und es gibt im Web auch <a href="http://www.neowin.net/forum/topic/928466-modified-facebook-fbcal-to-show-private-events-in-gmail-calendar/">Anleitungen</a> wie man das beheben kann. Bei mir hat das auch geklappt (allerdings musste ich nicht CLASS:CONFIDENTIAL in CLASS:PUBLIC ändern, sondern bei mir waren es CLASS:PRIVATE Einträge die Facebook produziert hat:
<pre>&lt;?php
$ical="http://www.facebook.com/ical/u.php?uid=XXX&key=XXX";
$file=file_get_contents($ical);
$replace="CLASS:PUBLIC";
$output=str_replace("CLASS:CONFIDENTIAL",$replace,$file);
$output=str_replace("CLASS:PRIVATE",$replace,$output);
header("Content-Type: text/Calendar");
// Give the file a name and force download
header("Content-Disposition: inline; filename=events.ics");
print_r($output);
?&gt;</pre>
Diese Lösung setzt allerdings voraus, dass man irgendwo ein PHP Script ablegen kann. Damit muss man jetzt nur die Export-URL von Facebook in dem PHP Script hinterlegen ("webcal:" in "http:" ändern), und in Google die PHP URL als Kalender importieren. Dabei ist zu beachten, dass jeder der das Script kennt und aufrufen kann so an alle Facebook Termine rankommt (auch die privaten).
<P>
Wer das mit dem eigenen PHP Script nicht machen will, der kann auch <a href="http://pipes.yahoo.com">Yahoo! Pipes</a> verwenden. Das ist ein Dienst bei den man eine Verarbeitungspipeline für Feeds zusammenstellen kann. Im Falle von ICS Dateien reicht es bei Yahoo aus diese nur als Source zu definieren, und dann direkt wieder zurückzugeben, denn die Yahoo Quelle für Feeds (die ICS versteht) filtert automatisch die CLASS Attribute ganz raus. 
<P>
<!-- s9ymdb:156 --><img class="serendipity_image_center" width="560" height="357"  src="http://itblog.eckenfels.net/uploads/screen/screenshot_fbcal_pipe.jpg"  alt="" />
<P>
Bei Yahoo Pipes muss man immer etwas tricksen wenn man einzelne Komponenten verbinden möchte (auf den Typ achten), deswegen hat die von mir verwendete Pipe noch den Zwischenschritt mit dem URL-Builder. Die URL selbst ist in einem "Private String" abgelegt, damit niemand der die Sourcen sehen kann an meine Facebook Events herankommt. (Leider lässt sich aber die Pipe trotzdem nicht sinnvoll Sharen, aber ich denke mit dem Screenshot könnt Ihr Euch leicht eine eigene zusammenbauen). Beim Aufruf der Pipe ist es wichtig den Parameter "_render=ical" mitzugeben. Früher gab es hierfür wohl einen Menueintrag bei Yahoo, der scheint aber entfernt worden zu sein. Auch hier gilt, wer die Addresse Eurer Pipe kennt, kann Eure Facebook Terminzusagen lesen. 
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://itblog.eckenfels.net/archives/480-E-Mail-versenden-von-Amazon-EC2.html" rel="alternate" title="E-Mail versenden von Amazon EC2" />
        <author>
            <name>Bernd Eckenfels</name>
            <email>bernd-2011@eckenfels.net</email>        </author>
    
        <published>2011-12-19T01:31:55Z</published>
        <updated>2011-12-21T08:10:01Z</updated>
        <wfw:comment>http://itblog.eckenfels.net/wfwcomment.php?cid=480</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://itblog.eckenfels.net/rss.php?version=atom1.0&amp;type=comments&amp;cid=480</wfw:commentRss>
    
            <category scheme="http://itblog.eckenfels.net/categories/19-Cloud" label="Cloud" term="Cloud" />
            <category scheme="http://itblog.eckenfels.net/categories/6-Infrastruktur" label="Infrastruktur" term="Infrastruktur" />
            <category scheme="http://itblog.eckenfels.net/categories/13-Technik" label="Technik" term="Technik" />
    
        <id>http://itblog.eckenfels.net/archives/480-guid.html</id>
        <title type="html">E-Mail versenden von Amazon EC2</title>
        <content type="xhtml" xml:base="http://itblog.eckenfels.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <a href="http://itblog.eckenfels.net/exit.php?url_id=5498&amp;entry_id=480"  onmouseover="window.status='http://aws.amazon.com/ec2/';return true;" onmouseout="window.status='';return true;" title="AWS EC2 Homepage">Amazon EC2</a> ist ein IaaS Anbieter bei dem man eigene virtuelle Systeme starten kann. Diese Systeme können dann alle Systemfunktionen die eine Anwendung benötigt bereitstellen. Dazu gehört zum Beispiel auch der E-Mail Versand (z.B. root Mails oder eben E-Mails der Anwendung wie z.B. Passwort Reminder oder Notifications).<br />
<br />
Um sicherzustellen, dass die E-Mails die von einem Amazon EC2 System abgeschickt werden auch ankommen, und nicht in Spam Filter der Provider hängenbleiben sind folgende Punkte zu beachten:<br />
<br />
a) wenn man einen Mailserver (MTA) verwendet der die Mails versendet so sollte dieser natürlich sicher konfiguriert sein, und kein Relaying von E-Mails zulassen - da sonst der EC2 Server zur Spamschleuder wird (was nicht nur Ärger mit Amazon nach sich zieht).<br />
<br />
b) Der SMTP Server meldet sich mit einem Rechnername. Dort sollte er nicht den internen Amazon EC2 Namen verwenden der dem Rechner zugewiesen wird, denn dir dort verwendete .internal Domain wird von vielen E-Mail Empfängern als ungültig abgelehnt.<br />
<br />
c) Die E-Mail Adresse des SMTP Servers (also in dem Fall der virtuelle EC2 Host) sollte in einen gültigen Hostnamen aufgelöst werden, denn sonst springt der Spamschutz der Empfänger an. Dies ist bei Amazon nur sinnvoll machbar wenn man eine Elastic IP verwendet. Dieses Verfahren wird PTR oder auch "reverse DNS" checks genannt.<br />
<br />
d) Der Envelop-From (im Falle von Cron Mails z. B. root@host) der versendeten E-Mails sollte eine gültige E-Mail Adresse sein. Insbesondere prüfen E-Mail Server beim Empfang, ob die Domain existiert. Hier sollte also auch nicht der .internal Hostname von AWS verwendet werden.<br />
<br />
e) Die Domain einer Absender E-Mail Adresse sollten nicht nur gültig sein, sondern mit dem <a href="http://itblog.eckenfels.net/exit.php?url_id=5499&amp;entry_id=480"  onmouseover="window.status='http://en.wikipedia.org/wiki/Sender_Policy_Framework';return true;" onmouseout="window.status='';return true;" title="Wikipedia SPF">SPF Mechanismus (Sender Policy Framework)</a> kann der Betreiber der Domain auch angeben von welchen Rechnern legalerweise Mails mit dem Absender versendet werden. Einige Empfänger benutzen das, um das Spamaufkommen zu reduzieren. In der Regel kommt in der Liste der zugelassenen Server nur die MX Server der Domain vor, und eben nicht beliebige IP-Adressen aus den Amazon AWS Netzen. Es bietet sich auch nicht an das komplette EC2 Netz in die Liste aufzunehmen, da sonst alle Amazon Kunden wiederum E-Mails am SPF Filter vorbei versenden können (das ist zwar weniger ein Problem aber eben unschön).<br />
<br />
Aus diesen Punkten ergeben sich zwar einige Konfigurationen die man vornehmen kann um von einem EC2 Host direkt an Endempfänger Mails zu versenden. Die Wahrscheinlichkeit dass diese aber häufig als Spam erkannt werden ist groß. Deshalb ist es anzuraten, dass ein Smarthost verwendet wird. (Das hat auch administrative Vorteile wenn die EC2 Hosts Ihre Mails schnell loswerden und man nicht mehrere Mailwarteschlangen überwachen muss).<br />
<br />
Um kein eigenes Relay betreiben zu müssen bietet es sich z.B. an den Simple E-Mail Service (SES) von Amazon zu verwenden. Dann muss man nur die SES E-Mail Server von Amazon AWS zusätzlich in die SPF Liste der Absenderdomain aufnehmen. Dies ist hier beschrieben: <a href="http://itblog.eckenfels.net/exit.php?url_id=5500&amp;entry_id=480"  onmouseover="window.status='http://docs.amazonwebservices.com/ses/latest/DeveloperGuide/SPF.html';return true;" onmouseout="window.status='';return true;" title="AWS SES Developer Guide: SPF"">http://docs.amazonwebservices.com/ses/latest/DeveloperGuide/SPF.html</a>. Im Gegensatz zum kompletten IP-Subnetz von Amazon EC2 hat man bei dieser Vorgehensweise den Vorteil, dass Amazon ein hohes Interesse daran hat, dass nur autorisierte Benutzer die Absenderadresse verwenden. (Gleiches gilt übrigens auch für Google App Engine, hier kann man auch Mail Relays in die SPF Liste aufnehmen). Zudem kann man sich danke Amazon IAM ein Benutzername/Passwort erzeugen der außer dem E-Mail Versand keine weiteren Rechte hat. Dieser kann man dann bedenkenlos im EC2 Image hinterlegen - zumindest solange man dieses nicht mit anderen Amazon Anwendern teilt. Sonst bietet es sich eher an diese Credentials beim Start mit anzugeben.<br />
<br />
Im nächsten Post beschreibe ich, wie man bei einem AMI auf Basis von Amazon Linux diese Varianten realisieren kann.<br />
 
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://itblog.eckenfels.net/archives/479-Java-Stream-mit-Puffer-einlesen.html" rel="alternate" title="Java Stream mit Puffer einlesen" />
        <author>
            <name>Bernd Eckenfels</name>
            <email>bernd-2011@eckenfels.net</email>        </author>
    
        <published>2011-12-09T22:45:31Z</published>
        <updated>2011-12-17T00:01:37Z</updated>
        <wfw:comment>http://itblog.eckenfels.net/wfwcomment.php?cid=479</wfw:comment>
    
        <slash:comments>2</slash:comments>
        <wfw:commentRss>http://itblog.eckenfels.net/rss.php?version=atom1.0&amp;type=comments&amp;cid=479</wfw:commentRss>
    
            <category scheme="http://itblog.eckenfels.net/categories/7-Java-Programming" label="Java Programming" term="Java Programming" />
    
        <id>http://itblog.eckenfels.net/archives/479-guid.html</id>
        <title type="html">Java Stream mit Puffer einlesen</title>
        <content type="xhtml" xml:base="http://itblog.eckenfels.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                Bin heute zufällig über folgende Methode gestolpert:<code><pre>String readToString1(InputStream in)  throws IOException
{
    byte[]buf = new byte[256];
    StringBuilder sb = new StringBuilder();
    int n;
    do {
      n = in.read(buf, 0, 256);
      if (n > 0) {
        String s = new String(buf, 0, n, "UTF-8");
        sb.append(s);
      }
    } while(n > 0);
    return sb.toString();
}</pre></code>Diese Funktion soll einen InputStream dessen Zeichen UTF-8 codiert sind in einen String lesen. Problem (mal abgesehen von der unnötigen Verwendung des if und den temporär angelegten String Objekten) bei dieser Funktion ist allerdings, dass der 256-byte Puffer in einen String umgewandelt wird, denn dabei werden ein oder mehrere Bytes durch den Zeichenkonverter gelesen. Falls der Zeichenkonverter dabei am ende des Puffers anlangt, so ist das Zeichen unvollständig. Das führt dann dazu dass ein Ersetzungszeichen (das Fragezeichen) am Ende des String steht. Man sollte solche starren bytepuffer also vermeiden, wenn man diese in Zeichen umwandeln will.<br />
<br />
Besser ist folgendes Vorgehen:<code><pre>String readToString2(InputStream in) throws IOException
{
    char[] buf = new char[128];
    StringBuilder sb = new StringBuilder();
    Reader r = new InputStreamReader(in, "UTF-8");
    int n;
    while((n = r.read(buf, 0, 128)) != -1)
    {
       sb.append(buf, 0, n);
    }
    return sb.toString();
}</pre></code>Um das unterschiedliche Verhalten zu testen, erzeuge ich einen InputStream der an ungeraden Byte Positionen Umlaute hat (also zuerst ein 1 byte Zeichen und dann lauter 2 byte Umlaute) und übergebe beiden Testmethoden diese Streams. Zusätzlich benutze ich noch Mockito, um zu ermitteln welche Methoden wie aufgerufen wurden:<code><pre>import static org.mockito.Mockito.*;
public static void main(String[] args) throws IOException
{
    byte[] umlaut = "ö".getBytes("UTF-8");
    byte[] inbuf   =  new byte[513];
    inbuf[0] = 'X'; for(int i = 0;i<256;i++)
    {inbuf[i*2+1] = umlaut[0]; inbuf[i*2+2] = umlaut[1]; }
		
    InputStream in1 = spy(new ByteArrayInputStream(inbuf));
    System.out.println(" readToString1()=" + readToString1(in1));
	// make sure the inputstream was used with efficient block reads
	verify(in1, times(4)).read(any(byte[].class), eq(0), eq(256));
	verifyNoMoreInteractions(in1);

    InputStream in2 = spy(new ByteArrayInputStream(inbuf));
    System.out.println(" readToString2()=" + readToString2(in2));
	// make sure the inputstream was used with efficient block reads
	verify(in2, atMost(2)).read(any(byte[].class), eq(0), eq(8192));
	verify(in2, atMost(1)).available();
	verifyNoMoreInteractions(in2);
}</pre></code>Und hier das Ergebnis (gekürtzt):<code><pre> readToString1()=Xööö...ööö??ööö...ööö??
 readToString2()=Xööö...öööööööö...ööööö</pre></code>Am Ende jeden Puffers zerschneidet die erste Methode die 2 Bytes eines Umlauts, und deswegen erscheinen an diesen Stellen das Füllzeichen des Character Konverters. Bei UTF-8 streams ist es unwahrscheinlich dass ein multi-byte Zeichen ausgerechnet genau auf eine Blockgrenze fällt - umso unwahrscheinlicher ist es, dass ein Problem damit beim Testen auffällt.<br />
<br />
Übrigens ist es nicht notwendig hier einen BufferedInputStream oder BufferedReader zu verwenden. Der Reader wird ja bereits mit einem char array buffer (und nicht einzelnen Zeichen) gelesen. Zudem liest der InputSreamReader() aus dem darunterliegenden InputStream mit einem StreamDecoder der einen eigenen Lesepuffer (bei den Sun Klassen ist das ein 8kb Puffer) hat.<br />
 
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://itblog.eckenfels.net/archives/478-SSLTLS-BEAST-Luecke.html" rel="alternate" title="SSL/TLS BEAST Lücke" />
        <author>
            <name>Bernd Eckenfels</name>
            <email>bernd-2011@eckenfels.net</email>        </author>
    
        <published>2011-12-03T09:49:12Z</published>
        <updated>2011-12-03T14:09:40Z</updated>
        <wfw:comment>http://itblog.eckenfels.net/wfwcomment.php?cid=478</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://itblog.eckenfels.net/rss.php?version=atom1.0&amp;type=comments&amp;cid=478</wfw:commentRss>
    
            <category scheme="http://itblog.eckenfels.net/categories/7-Java-Programming" label="Java Programming" term="Java Programming" />
            <category scheme="http://itblog.eckenfels.net/categories/8-Sicherheit" label="Sicherheit" term="Sicherheit" />
            <category scheme="http://itblog.eckenfels.net/categories/4-Vernetzung" label="Vernetzung" term="Vernetzung" />
    
        <id>http://itblog.eckenfels.net/archives/478-guid.html</id>
        <title type="html">SSL/TLS BEAST Lücke</title>
        <content type="xhtml" xml:base="http://itblog.eckenfels.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>Im September 2011 haben die Sicherheitsforscher Duong und Rizzo <a href="http://itblog.eckenfels.net/exit.php?url_id=5491&amp;entry_id=478" title="http://vnhacker.blogspot.com/2011/09/beast.html"  onmouseover="window.status='http://vnhacker.blogspot.com/2011/09/beast.html';return true;" onmouseout="window.status='';return true;">nachgewiesen</a>, dass eine - seit <a
href="http://itblog.eckenfels.net/exit.php?url_id=5496&amp;entry_id=478" title="http://www.mail-archive.com/openssl-dev@openssl.org/msg10664.html"  onmouseover="window.status='http://www.mail-archive.com/openssl-dev@openssl.org/msg10664.html';return true;" onmouseout="window.status='';return true;">2002 bekannte</a> und in TLS 1.1 behobene - Schwachstelle in den SSL 3.0 und TLS 1.0 Verschlüsselungsprotokollen nicht nur theoretisch ist, sonder wirklich ausgenutzt werden können. Unter bestimmten Bedingungen erlaubt diese Schwachstelle einem Angreifer Teile aus einer SSL/TLS geschützten Übertragung zu ermitteln.</p>

<p>Gezeigt wurde dies am Beispiel eines abgefangenen paypal http Session Cookies, was erlaubte eine Browser Sitzung zu übernehmen. Das Problem ist unter dem Namen „BEAST“ (Browser Exploit Against SSL/TLS) bekannt, und wird unter der Common Vulnerability ID  <a href="http://itblog.eckenfels.net/exit.php?url_id=5492&amp;entry_id=478" title="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2011-3389"  onmouseover="window.status='http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2011-3389';return true;" onmouseout="window.status='';return true;">CVE-2011-3389</a> geführt. Bei der Demonstration wurde ein Java Applet verwendet um die notwendigen Daten einzuschleusen, nach Duong/Rizzo es soll aber auch mit WebSockets oder JavaScript XHR Aufrufen möglich sein.</p>

<p>Dies zugrundeliegende kryptografische Schwäche ist ein generelles Problem vom SSL 3.0/TLS 1.0. Es wurde aber als 2002 nur als theoretischer Angriff gesehen, jetzt sind Angriffe mit Hilfe der erweiterten Funktionen des WebBrowsers bekannt geworden. Da es für einen erfolgreichen Angriff nicht nur notwendig ist, dass die verschlüsselte Verbindung abgehört werden kann, sondern auch, dass der Angreifer in den Klartext eigene Stück einfügen kann (Chosen Plaintext). Dies ist durch die Verwendung von JavaScript auf Webseiten relativ einfach möglich.</p>

<p>Wird bei SSL/TLS eine Blockchiffre im CBC (Cipher Block Chaining) Modus verwendet, so benutzt SSL 3.0 und TLS 1.0 einen vom Vorgängerblock abgeleiteten Initialisierungsvektor. Da sich dieser ermitteln lässt ist hier ein Problem gegeben, das durch geschicktes einfügen von Füllzeichen in den Klartext erlaubt Inhalte zeichenweise an den Blockgrenzen zu ermitteln.</p>

<p>Dies zu behaben bedarf es einer neuen Protokollversion: TLS  1.1. Aber in TLS 1.0 und SSL 3.0 kann es nicht so einfach verhindert werden. Somit hilft mittelfristig nur ein Update auf diese „neuen“ Protokolle, die zwar schon Jahrelang verfügbar sind, sich aber in der Praxis in den meisten WebServern und WebBrowsern noch nicht durchgesetzt haben (vor allem nicht per default aktiviert sind).</p>

<p>Mögliche Gegenmaßnahmen zu BEAST (und deren Probleme) sind:</p>

<ol>
<li>SSL/TLS Ciphers nicht im CBC Modus verwenden. Diese können in den gängigen Browsern und Servern abgeschalten werden. Die Gefahr dass dann Gegenstellen keine gemeinsame Verschlüsselung aushandeln können ist allerdings groß. Sollte also nur bei einer kleinen Anzahl von bekannten Kommunikationsgegenstellen benutzt werden.</li>

<li>Statt die CBC Chiffren abzuschalten kann auf jedenfall die Stromchiffre RC4 (TLS_RSA_WITH_RC4_128_SHA) bevorzugt werden. Diese verwendet kein CBC und ist damit nicht betroffen. Dies macht Google z.B. schon seit einiger Zeit. RC4 ist nicht unumstritten, es gibt Angriffe gegen das Verfahren, die aber in SSL <a
href="http://itblog.eckenfels.net/exit.php?url_id=5497&amp;entry_id=478" title="http://blog.ivanristic.com/2009/08/is-rc4-safe-for-use-in-ssl.html"  onmouseover="window.status='http://blog.ivanristic.com/2009/08/is-rc4-safe-for-use-in-ssl.html';return true;" onmouseout="window.status='';return true;">nicht auftreten</a>.</li>

<li>Oracle Java (JSSE) ab Version 1.6.0_29 und 7.0.0_1 implementiert einen CBC Schutz (der
mit dem System Property jsse.enableCBCProtection aus kompatibilitätsgründen wieder
abgeschalten werden kann) bei dem der erste Block in zwei mit der Länge 1 und (n-1)
gesplittet wird. Erst mit Java 7 wird TLS 1.1 und 1.2 unterstützt.</li>

<li>Der gleiche Fix wird gerade in Chrome Beta 15 getestet, es gab schon <a href="http://itblog.eckenfels.net/exit.php?url_id=5493&amp;entry_id=478" title="http://code.google.com/p/chromium/issues/detail?id=98202"  onmouseover="window.status='http://code.google.com/p/chromium/issues/detail?id=98202';return true;" onmouseout="window.status='';return true;">Kompatiblitätsprobleme</a>.</li>

<li>Für Opera 10.51 war der Fix geplant, ist aktuell noch nicht vorhanden (Opera benutzt keine WebSockets).</li>

<li>Dieser Schutz wird auch in Mozilla Firefox (via <a href="http://itblog.eckenfels.net/exit.php?url_id=5494&amp;entry_id=478" title="https://bugzilla.mozilla.org/show_bug.cgi?id=665814"  onmouseover="window.status='https://bugzilla.mozilla.org/show_bug.cgi?id=665814';return true;" onmouseout="window.status='';return true;">NSS library</a>) eingebaut, wartet dort aber noch auf eine Lösung der Kompatibilitätsprobleme und ist somit nicht Bestandteil von Firefox 7 (Mozilla sagt die WebSockets sind nicht verwundbar).</li>

<li>Es ist zu erwarten dass Microsoft für den Internet Explorer nachzieht, bisher <a href="http://itblog.eckenfels.net/exit.php?url_id=5495&amp;entry_id=478" title="http://blogs.technet.com/b/srd/archive/2011/09/26/is-ssl-broken-more-about-security-advisory-2588513.aspx"  onmouseover="window.status='http://blogs.technet.com/b/srd/archive/2011/09/26/is-ssl-broken-more-about-security-advisory-2588513.aspx';return true;" onmouseout="window.status='';return true;">empfehlen</a> sie nur die RC4 Chiffre zu bevorzugen (Windows XP scheint dies zu tun), Vorsicht bei dem Umgang mit http Seiten walten zu lassen und ggf. TLS 1.1 auf
Client und Server zu aktivieren (immerhin unterstützen Microsoft Produkte dies schon, wird nur aus Kompatibilitätsgründen nicht aktiviert).</li>

<li>Die Option TLS 1.1 (oder neuer) zu verwenden wird leider noch einige Zeit auf sich warten lassen. Besonders da SSL 3.0 und TLS 1.0 abgeschalten werden müssten, um zu verhindern das Angreifer diese erzwingen. Leider hängt openssl der TLS 1.1 Entwicklung nach, so dass auch Apache hier nur mit der RC4 Cipher gerettet werden kann (alternativ kann man mod_gnutls oder mod_nss verwenden, die sind aber beide weniger stark in der Nutzung).</li></ol> 
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://itblog.eckenfels.net/archives/477-2-wege-Authentifizierung.html" rel="alternate" title="2-wege Authentifizierung" />
        <author>
            <name>Bernd Eckenfels</name>
            <email>bernd-2011@eckenfels.net</email>        </author>
    
        <published>2011-11-22T23:33:21Z</published>
        <updated>2011-11-22T23:33:21Z</updated>
        <wfw:comment>http://itblog.eckenfels.net/wfwcomment.php?cid=477</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://itblog.eckenfels.net/rss.php?version=atom1.0&amp;type=comments&amp;cid=477</wfw:commentRss>
    
    
        <id>http://itblog.eckenfels.net/archives/477-guid.html</id>
        <title type="html">2-wege Authentifizierung</title>
        <content type="xhtml" xml:base="http://itblog.eckenfels.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                Das Passwort als Mechanismus für die Authentifizierung von Benutzern ist tot, es hat es nur noch nicht bemerkt. Benutzer sind es gewohnt mit Passwörtern umzugehen, und sie funktionieren für eine breite Palette an Anwendungen, Protokollen und Geräten. Allerdings ist "funktionieren" zu viel gesagt. Denn die Sicherheits- und Supportprobleme bei vergessenen, erratenen, weitergegebenen, zu einfachen oder wiederverwendeten Passwörtern sind sehr hoch.<br />
<br />
Auch die großen sozialen Dienstbetreiber haben dies schon bemerkt, und versuchen auf zusätzliche Sicherheitsmerkmale zu setzen. So versucht Facebook zum Beispiel zu erraten welcher Login aus einem fremden Netzwerk unerwartet ist, oder welches Endgerät noch nicht benutzt wurde. Google und Amazon (bei den AWS Diensten) gehen hier schon einen Schritt weiter. Beide setzen auf Mehrfaktoren Authentifizierung. Google nennt es entsprechend <a href="http://itblog.eckenfels.net/exit.php?url_id=5486&amp;entry_id=477"  onmouseover="window.status='http://www.google.com/support/accounts/bin/topic.py?hl=en&amp;topic=28786';return true;" onmouseout="window.status='';return true;" title="google.com help">2-wege Verifizierung</a> und Amazon AWS nennt es kurz <a href="http://itblog.eckenfels.net/exit.php?url_id=5487&amp;entry_id=477" title="http://aws.amazon.com/mfa/"  onmouseover="window.status='http://aws.amazon.com/mfa/';return true;" onmouseout="window.status='';return true;">MFA</a> (für Multi Factor Authentication).<br />
<br />
Beiden gemeinsam ist die Option einmalpasswörter von einem (Hardware) Token erzeugen zu lassen, das sind 6-stellige Zahlen die sich alle 30 Sekunden ändern. Neben dem traditionellen Passwort muss dieser Code angegeben werden. Somit können sich nur Anwender anmelden, die das Hardware Gerät besitzen und das Passwort kennen. Statt einem Hardware Gerät bieten beide Anbieter auch an eine App auf dem Mobilfunkgerät zu verwenden. Google bietet dazu zum Beispiel den freien und kostenloses <a href="http://itblog.eckenfels.net/exit.php?url_id=5488&amp;entry_id=477"  onmouseover="window.status='http://www.google.com/support/a/bin/answer.py?answer=1037451';return true;" onmouseout="window.status='';return true;" title="google.com help">Google Authenticator</a> für Android, iPhone oder Blackberry an.<br />
<br />
Einmalig überträgt dabei der Dienstanbieter ein gemeinsames Geheimnis via QR-Code (zum abfotografieren) oder als base32 String zum abtippen an das Soft Token (oder Virtuelles Token wie Amazon es nennt). Das Token gerät benutzt dieses Geheimnis und die aktuelle Uhrzeit (in 30 Sekunden Intervallen seit Unix Epoche) um daraus eine dezimale Ziffernfolge ähnlich einer PIN zu erzeugen.<br />
<br />
Alternativ bietet Google an mittels SMS den Code zugeschickt zu bekommen, oder aber eine Liste von Abstreichcodes (vergleichbar mit einer TAN Liste) für Notfälle auszudrucken. Alles in allem ein gutes Konzept bei Google, das man nutzen sollte. Im Web Browser kann ein Cookie nach jeder erfolgreichen Token Authentifizierung hinterlegt werden, so dass man diese Prozedur nur alle 30 Tage durchführen muss. Anwendungen wie Messenger, E-Mail Clients oder Mobile Apps können mit einem von Google erzeugten sekundären Passwort betrieben werden, das dann in einer Liste der bekannten Anwendungen steht und dort jederzeit wieder gesperrt werden kann. Amazon bietet auch eine ganze Reihe von zusätzlicher Authentifizierungsverfahren (Zertifikate und Zugriffsschlüssel) für Anwendungen an.<br />
<br />
Übrigens verwenden Google als auch Amazon dasselbe Token Protokoll TOTP das in <a href="http://itblog.eckenfels.net/exit.php?url_id=5489&amp;entry_id=477" title="http://tools.ietf.org/html/rfc6238"  onmouseover="window.status='http://tools.ietf.org/html/rfc6238';return true;" onmouseout="window.status='';return true;">RFC 6238</a> spezifiziert wird. Die 20byte Geheimnisse werden dabei in base32 codiert, erzeugt wird ein 6 stelliger Response Code mit dynamischer Offsetberechnung und die im HMAC eingesetzte Hashfunktion ist SHA-1.<br />
<br />
<img src="https://github.com/ecki/et-otp/raw/master/doc/screenshot.jpg" align="right"> Genau für diese Parameter habe ich auch eine kleine Java (Swing) Anwendung für den Desktop geschrieben. Ich habe diese sowohl mit Google als auch Amazon getestet und sie funktioniert. Aktuell wird das dabei notwendige Geheimnis noch AES-128 verschlüsselt auf der Platte abgelegt, was die Sicherheit dieses Verfahrens im Vergleich zu einem reinen Hardware Token natürlich etwas einschränkt. Ich denke aber ich werde es noch um ein DPAPI oder TPM Modul zur Aufbewahrung des Geheimnisses erweitern. Das Projekt findet sich bei GitHub unter dem Namen <a href="http://itblog.eckenfels.net/exit.php?url_id=5490&amp;entry_id=477" title="http://ecki.github.com/et-otp/"  onmouseover="window.status='http://ecki.github.com/et-otp/';return true;" onmouseout="window.status='';return true;"><b>et-otp</b></a>.<br />
<br />
<br />
<br />
 
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://itblog.eckenfels.net/archives/476-Rechner-im-AD-LDAP-mit-Powershell-auflisten.html" rel="alternate" title="Rechner im AD LDAP mit Powershell auflisten" />
        <author>
            <name>Bernd Eckenfels</name>
            <email>bernd-2011@eckenfels.net</email>        </author>
    
        <published>2011-08-10T02:27:40Z</published>
        <updated>2011-08-10T22:39:17Z</updated>
        <wfw:comment>http://itblog.eckenfels.net/wfwcomment.php?cid=476</wfw:comment>
    
        <slash:comments>3</slash:comments>
        <wfw:commentRss>http://itblog.eckenfels.net/rss.php?version=atom1.0&amp;type=comments&amp;cid=476</wfw:commentRss>
    
            <category scheme="http://itblog.eckenfels.net/categories/6-Infrastruktur" label="Infrastruktur" term="Infrastruktur" />
            <category scheme="http://itblog.eckenfels.net/categories/3-Intranet" label="Intranet" term="Intranet" />
            <category scheme="http://itblog.eckenfels.net/categories/13-Technik" label="Technik" term="Technik" />
    
        <id>http://itblog.eckenfels.net/archives/476-guid.html</id>
        <title type="html">Rechner im AD LDAP mit Powershell auflisten</title>
        <content type="xhtml" xml:base="http://itblog.eckenfels.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                Ich hab ein wenig mit Powershell herumgespielt (weil ich das <a href="http://itblog.eckenfels.net/exit.php?url_id=5482&amp;entry_id=476" title="http://blog.stefan-macke.com/2008/03/19/active-directory-mit-der-powershell-auslesen/"  onmouseover="window.status='http://blog.stefan-macke.com/2008/03/19/active-directory-mit-der-powershell-auslesen/';return true;" onmouseout="window.status='';return true;">Script</a> das auch in <a href="http://itblog.eckenfels.net/exit.php?url_id=5483&amp;entry_id=476" title="http://de.hakin9.org/magazine/1753-keine-angst-vor-online-banking"  onmouseover="window.status='http://de.hakin9.org/magazine/1753-keine-angst-vor-online-banking';return true;" onmouseout="window.status='';return true;">de.Hackin9.org 08/2011</a> abgebildet war nicht verstanden habe).<br />
<br />
Dabei kam dann folgendes funktionierendes Script heraus, es sortiert mit alle Rechner des AD LDAPs und zeigt diese in einem grafischen Viewer mit Betriebsystemversion und Servicepack Level an:<br />
<br />
<pre>$ldapSearcher = new-object directoryservices.directorysearcher;
$ldapSearcher.filter = "(objectclass=computer)";
$computers = $ldapSearcher.findall();
$pcs = @();
foreach ($c in $computers) {
  $pc = "" | Select-Object Name,OS,SP,SPN;
  $pc.Name=$c.properties["cn"];
  $pc.OS=$c.properties["operatingsystem"];
  $pc.SP=$c.properties["operatingsystemservicepack"];
  $pc.SPN=$c.properties["serviceprincipalname"];
  $pcs += $pc;
}
$pcs | sort-object OS,SP,Name | Out-GridView;</pre><br />
Ich habe aber keine Ahnung wie man einfacher aus den Dictionary Entries des <code>$c.Properties</code> Member direkte Properties machen kann ohne diese mit einer foreach Schleife und direktem Assignment aufwändig zu kopieren. Ich hoffe ein mitlesender Powershell Guru kann mir das kurz sagen? :)<br />
<br />
<b>Update:</b> <a href="http://itblog.eckenfels.net/exit.php?url_id=5484&amp;entry_id=476" title="http://www.maxtblog.com/"  onmouseover="window.status='http://www.maxtblog.com/';return true;" onmouseout="window.status='';return true;">Max Trinidad</a> (<a href="http://itblog.eckenfels.net/exit.php?url_id=5485&amp;entry_id=476" title="http://twitter.com/MaxTrinidad"  onmouseover="window.status='http://twitter.com/MaxTrinidad';return true;" onmouseout="window.status='';return true;">@MaxTrinidad</a>) hat mich auf die Idee mit New-Object gebracht, damit lässt sich das Script etwas vereinfachen und die Attribute in Strings konvertieren:<br />
<br />
<pre>$ldapSearcher = new-object directoryservices.directorysearcher;
$ldapSearcher.filter = "(objectclass=computer)";
$computers = $ldapSearcher.findall();
[Array] $pcs = $null;
foreach($c in $computers) {    
    $pcs += New-Object PSobject -property @{
        Name = [string]$c.properties["cn"];
        OS = [string]$c.properties["operatingsystem"];
        SP = [string]$c.properties["operatingsystemservicepack"];
        SPN = [string]$c.properties["serviceprincipalname"]; }
}</pre><br />
Und darauf aufbauend (aber ohne String Konvertierung) dann die Lösung mit der Automatischen Übernahme aller Dictionary Einträge aus dem AD Objekt:<br />
<br />
<pre>$ldapSearcher = New-Object directoryservices.directorysearcher;
$ldapSearcher.filter = "(objectclass=computer)";
$computers = $ldapSearcher.findall();
[Array] $pcs = $null;
$computers | ForEach-Object { $pcs += New-Object PSobject -property $_.Properties; }
$pcs | Out-GridView;</pre> 
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://itblog.eckenfels.net/archives/475-STRIDE-vs.-CIA.html" rel="alternate" title="STRIDE vs. CIA" />
        <author>
            <name>Bernd Eckenfels</name>
            <email>bernd-2011@eckenfels.net</email>        </author>
    
        <published>2011-08-05T19:56:47Z</published>
        <updated>2011-08-05T21:33:13Z</updated>
        <wfw:comment>http://itblog.eckenfels.net/wfwcomment.php?cid=475</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://itblog.eckenfels.net/rss.php?version=atom1.0&amp;type=comments&amp;cid=475</wfw:commentRss>
    
            <category scheme="http://itblog.eckenfels.net/categories/8-Sicherheit" label="Sicherheit" term="Sicherheit" />
    
        <id>http://itblog.eckenfels.net/archives/475-guid.html</id>
        <title type="html">STRIDE vs. CIA</title>
        <content type="xhtml" xml:base="http://itblog.eckenfels.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                Microsoft hat mit Ihrem <a href="http://itblog.eckenfels.net/exit.php?url_id=5479&amp;entry_id=475" title="http://www.microsoft.com/security/sdl/default.aspx"  onmouseover="window.status='http://www.microsoft.com/security/sdl/default.aspx';return true;" onmouseout="window.status='';return true;">Security Development Lifecycle</a> für eine deutliche Steigerung der Sicherheit Ihrer Produkte gesorgt. Zudem ist die Methodik offen zugänglich und verbessert somit die Software Entwicklung auch in anderen Firmen. Ein Konzept das bei der Analyse und Modellierung von Risiken und Bedrohungen im Ramen von SDL eingesetzt wird ist die STRIDE-Klassifizierung von Bedrohungen:<br />
<br />
<table><tr><th>Threat</th><th>Definition</th></tr>
<tr><td><b>S</b>poofing</td><td>Impersonating something or someone else.</td></tr>
<tr><td><b>T</b>ampering</td><td>Modifying data or code</td></tr>
<tr><td><b>R</b>epudiation</td><td>Claiming to have not performed an action.</td></tr>
<tr><td><b>I</b>nformation Disclosure</td><td>Exposing information to someone not authorized to see it</td></tr>
<tr><td><b>D</b>enial of Service</td><td>Deny or degrade service to users</td></tr>
<tr><td><b>E</b>levation of Priviledge</td><td>Gain capabilities without proper authorization</td></tr></table><br />
Diese Klassifizierung finde ich nicht sonderlich nützlich. Die Klassen der Bedrohungen überlappen sich. Es ist eine Mischung aus Angriffen auf primäre und sekundäre Schutzziele. Viel besser finde ich es daher, bei der Betrachtung von Bedrohungen deren Auswirkungen auf die Primären Schutzziele der Informationssicherheit (<a href="http://itblog.eckenfels.net/exit.php?url_id=5480&amp;entry_id=475" title="http://en.wikipedia.org/wiki/CIA_triad"  onmouseover="window.status='http://en.wikipedia.org/wiki/CIA_triad';return true;" onmouseout="window.status='';return true;">CIA</a>) zu betrachten:<br />
<br />
<table><tr><td><b>C</b>onfidentiality (Vertraulichkeit)</td></tr><tr><td><b>I</b>ntegrity (Integrität)</td></tr><tr><td><b>A</b>vailability (Verfügbarkeit)</td></tr></table><br />
Wenn alle drei Schutzziele erfüllt sind so stellt ein Informationssystem sicher, dass die richtige Person unverfälschte Daten jederzeit nutzen kann. Das CIA Trippel steht auch in der Kritik nicht alle Fälle abzudecken, so wird z.B. immer wieder angeführt dass Zurechnungsfähigkeit oder Nicht-Abstreitbarkeit (Accountability, Non-Repudiation) damit nicht abgedeckt werden. Das sehe ich allerdings nicht so, denn wenn eine Anforderung an ein IT System ist, dass man nachvollziehen kann wer etwas gemacht hat, so werden dazu eigene Daten erfasst, und deren Integrität (kann nicht verändert werden) und Verfügbarkeit (kann nicht unterdrückt werden) stellen sicher, dass authorisierte Nutzer diese Daten einsehen können.<br />
<br />
<br />
Die STRIDE Eigenschaften lassen sich mit CIA gut ausdrücken:<br />
<br />
<table><tr><td>Spoofing</td><td>Benutzer die sich als andere Nutzer ausgeben können sind nur ein Problem wenn daraufhin Daten unerlaubterweise weitergegeben werden (Vetraulichkeit) oder wenn andere Benutzer sich auf die Urheberschaft von Informationen verlassen (Integrität).</td></tr>
<tr><td>Tampering</td><td>Unerwünschtes ändern von Daten oder Code ist ein Angriff auf die Integrität des Systems</td></tr>
<tr><td>Repudiation</td><td>Ein System das Nachvollziehbarkeit benötigt kann darüber unverfälschte (Integrität) Aufzeichnung führen sie sich nicht unterdrücken (Availability) lassen.</td></tr>
<tr><td>Information Disclosure</td><td>Ein Verstoss gegen die Vertraulichkeit</td></tr>
<tr><td>Denial of Service</td><td>Ein Angriff auf die Verfügbarkeit des Systems</td></tr>
<tr><td>Elevation of Priveledge</td><td>Angreifer erlangt mehr Rechte als Ihm zustehen. Dies ist ein Problem wenn damit Angriff auf Integrität oder Vertraulichkeit erfolgt</td></tr></table><br />
Anhand der Gegenüberstellung wird klar, dass mit den 3 Schutzzielen die meisten Bedrohungen besser klassifizieren lassen.<br />
<br />
David LeBlanc, einer der Väter der STRIDE Methode gibt dies in einem <a href="http://itblog.eckenfels.net/exit.php?url_id=5481&amp;entry_id=475" title="http://blogs.msdn.com/b/david_leblanc/archive/2007/08/13/dreadful.aspx"  onmouseover="window.status='http://blogs.msdn.com/b/david_leblanc/archive/2007/08/13/dreadful.aspx';return true;" onmouseout="window.status='';return true;">Blogpost</a> auch offen zu. Er sieht trotzdem einen Anwendungsfall für die Methode in der Praxis. Ich persönlich würde mir wünschen, wenn SDL hier angepasst wird. Nützlicher sind hier eher Checklisten mit typischen Bedrohungen (und deren Auswirkungen auf die Primären Schutzziele). 
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://itblog.eckenfels.net/archives/474-IPv6-default-address-selection-in-Java.html" rel="alternate" title="IPv6 default address selection in Java " />
        <author>
            <name>Bernd Eckenfels</name>
            <email>bernd-2011@eckenfels.net</email>        </author>
    
        <published>2011-06-28T03:59:00Z</published>
        <updated>2011-06-28T04:08:51Z</updated>
        <wfw:comment>http://itblog.eckenfels.net/wfwcomment.php?cid=474</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://itblog.eckenfels.net/rss.php?version=atom1.0&amp;type=comments&amp;cid=474</wfw:commentRss>
    
            <category scheme="http://itblog.eckenfels.net/categories/7-Java-Programming" label="Java Programming" term="Java Programming" />
            <category scheme="http://itblog.eckenfels.net/categories/13-Technik" label="Technik" term="Technik" />
    
        <id>http://itblog.eckenfels.net/archives/474-guid.html</id>
        <title type="html">IPv6 default address selection in Java </title>
        <content type="xhtml" xml:base="http://itblog.eckenfels.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                Da bei IPv6 Nodes (also Rechner und andere Teilnehmer an einem Netzwerk) schon konzeptionell mehrere Adressen haben ist die Auswahl welche Quell- und Zieladresse verwendet werden soll eine wichtige Funktion. Insbesondere dann wenn ein Rechner im Dual-Stack Betrieb sowohl IPv4 als auch IPv6 Adressen erreichen kann.<br />
<br />
Bei IPv6 kann jedes Netzwerkinterface mehrere IPv6 Adressen haben, die dann entweder in unterschiedlichen Bereichen (Scopes) genutzt werden können (localhost, link, site, global) oder die unterschiedliche Bevorzugt (valid, prefered) sind. Durch die Unterstützung von Renumbering (stateless autoconfiguration) haben Adressen unterschiedliche Lebenszeiten. Zudem gibt es Adressen die über eine Migrations-/Tunnel Technologie wie Toredo, ISATAP oder 6to4 bereitgestellt werden, und nicht immer benutzt werden sollen.<br />
<br />
Idealerweise würde eine Anwendung oder das Betriebssystem alle möglichen Quell/Ziel-Adresskombinationen ermitteln, und alle (aussichtsreichsten zuerst) durchprobieren. <a href="http://itblog.eckenfels.net/exit.php?url_id=5475&amp;entry_id=474" title="http://www.ietf.org/rfc/rfc3484.txt"  onmouseover="window.status='http://www.ietf.org/rfc/rfc3484.txt';return true;" onmouseout="window.status='';return true;">RFC 3484</a> beschreibt ein Verfahren für die <i>Default Address Selection für IPv6</i>. Der von Microsoft Research verfasste Entwurf gibt Regeln vor wie die Auswahl von Ziel- und Quelladressen zu geschehen hat, und definiert auch eine Möglichkeit dass der Administrator eines Systems eigene Gewichtungen definieren kann.<br />
<br />
Ideal wäre eine Laufzeit Funktion, der man einen Hostnamen übergibt, und die dann die Verbindung zur Gegenstelle herstellt und dabei alle Regeln des RFC 3484 (und dringend notwendiger <a href="http://itblog.eckenfels.net/exit.php?url_id=5478&amp;entry_id=474" title="http://tools.ietf.org/html/draft-ietf-6man-addr-select-considerations-03"  onmouseover="window.status='http://tools.ietf.org/html/draft-ietf-6man-addr-select-considerations-03';return true;" onmouseout="window.status='';return true;">zukünftiger Verbesserungen</a>) beachtet. Durch die Trennung zwischen Kernel und Usermode, und aus Gründen der Kompatibilität mit existierendem Netzwerkcode verwenden die meisten* Systeme allerdings ein anderes Verfahren. Bestehende Funktionen wie z.B. <code>getaddrinfo(3)</code> wurden erweitert: die Auflösung von Hostnamen in Adressen liefert jetzt eine nach Präferenzen sortierte Liste der Zieladressen zurück. Dabei greift die Bibliotheksfunktion auf Adress- und Routinginformationen des Kernels zurück. Denn es müssen für jede zurückgelieferte Zieladresse auch die potentiellen Quelladressen bestimmt und bewertet werden.<br />
<br />
Unter Windows kann die Sortierung mit der prefixpolicy (<code>netsh.exe interface ipv6 show prefixpolicies</code>) angezeigt werden. Linux Systeme speichern die Konfiguration in /etc/gai.conf, aktuelle Einstellungen können mit dem iproute2 Paket angesehen werden (<code>ip addrlabel</code>). Das ganze ist im Kernel und der <a href="http://itblog.eckenfels.net/exit.php?url_id=5476&amp;entry_id=474" title="http://www.akkadia.org/drepper/linux-rfc3484.html"  onmouseover="window.status='http://www.akkadia.org/drepper/linux-rfc3484.html';return true;" onmouseout="window.status='';return true;">glibc</a> implementiert.<br />
<br />
Auch bei Java wurde kein komplett neues Verfahren für den Verbindungsaufbau für IPv6 definiert**. Die Anwendung selbst ist dafür zuständig alle möglichen Zieladressen der Reihe nach durchzuprobieren. Wenn die Anwendung keine Quelladresse angibt (was sie vermeiden sollte) so wird dann der Kernel für jeden der Zieladressen eine Quelladresse auswählen. Wenn eine Adresse nicht erreichbar ist, so muss die nächste Adresse verwendet werden. Wenn alle Adressen nicht erreichbar sind, so sollte eine Fehlermeldung zurückgegeben werden die alle probierten Zieladressen benennt und den ersten (oder alle) Fehlermeldungen benennt.<br />
<br />
Beispielhaft kann dies so aussehen:<br />
<br />
<pre>Socket connectToHost(String host, int port)
	throws UnknownHostException, SocketException
{
	IOException firstException = null;

	InetAddress[] <strong>addressArray = InetAddress.getAllByName(host)</strong>;
	<strong>for(InetAddress addr : addressArray)</strong>
	{
		try {
			<strong>return new Socket(addr, port)</strong>;
		} catch (IOException ex) {
			if (firstException == null)
				firstException = ex;
		}
	}

        // build informative error message
	StringBuilder msg = new StringBuilder("Unable to connect to host=");
	msg.append(host); msg.append(" port="); 
        msg.append(String.valueOf(port)); msg.append(" [");
	
	for(int i=0;i &lt; addressArray.length;i++)
	{
		if (i != 0)
			msg.append(',');
		msg.append(addressArray[i]);
	}
	msg.append("]: "); msg.append(firstException.getMessage());
	SocketException se = new SocketException(msg.toString());
	se.initCause(firstException);
	throw se;
}</pre><br />
<br />
Dieser Code überlässt die Auswahl einer Quelle dem Kernel (es werden also nicht alle möglichen Kombinationen durchprobiert). Ebenso ist kein Handling für Timeouts enthalten, und ein Cache der Verbindungszustände erinnert oder gar ein paralleler Aufbau zu mehreren Zielen ist noch nicht enthalten. Trotzdem ist der Code schon recht komplex, sollte also nicht mehrfach implementiert werden müssen.<br />
<br />
Von <code>InetAddress.getByName(String host)</code> würde ich auf jeden Fall Abstand nehmen. Diese Methode gibt nur die bevorzugte Addresse zurück, und führt bei DualStack Anwendungen dazu, dass nicht IPv6 und IPv4 Adressen durchprobiert werden.<br />
<br />
<br />
* Microsoft ist typischerweise Entwicklerfreundlicher und muss weniger Rücksicht nehmen auf etablierte APIs, deswegen gibt es die Funktion <a href="http://itblog.eckenfels.net/exit.php?url_id=5477&amp;entry_id=474" title="http://msdn.microsoft.com/en-us/library/ms737937"  onmouseover="window.status='http://msdn.microsoft.com/en-us/library/ms737937';return true;" onmouseout="window.status='';return true;">WSAConnectByName()</a> die alle Addressen selbst durchprobiert.<br />
<br />
** Java kennt <code>Socket(String name, int port)</code>, dieser Konstruktor verwendet aber keine Schleife um alle möglichen Adressen zu kontaktieren. 
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://itblog.eckenfels.net/archives/473-Windows-7-hosts-file-ignoriert-IP-Addressen-mit-0-prefix.html" rel="alternate" title="Windows 7 hosts-file ignoriert IP Addressen mit 0 prefix" />
        <author>
            <name>Bernd Eckenfels</name>
            <email>bernd-2011@eckenfels.net</email>        </author>
    
        <published>2011-06-24T01:58:15Z</published>
        <updated>2011-06-24T02:04:19Z</updated>
        <wfw:comment>http://itblog.eckenfels.net/wfwcomment.php?cid=473</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://itblog.eckenfels.net/rss.php?version=atom1.0&amp;type=comments&amp;cid=473</wfw:commentRss>
    
            <category scheme="http://itblog.eckenfels.net/categories/6-Infrastruktur" label="Infrastruktur" term="Infrastruktur" />
            <category scheme="http://itblog.eckenfels.net/categories/13-Technik" label="Technik" term="Technik" />
    
        <id>http://itblog.eckenfels.net/archives/473-guid.html</id>
        <title type="html">Windows 7 hosts-file ignoriert IP Addressen mit 0 prefix</title>
        <content type="xhtml" xml:base="http://itblog.eckenfels.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                Mir ist gerade zufällig aufgefallen (als ich diesen <a href="http://itblog.eckenfels.net/exit.php?url_id=5474&amp;entry_id=473" title="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5092451"  onmouseover="window.status='http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5092451';return true;" onmouseout="window.status='';return true;">Bugreport</a> nachgestellt habe) dass Windows 7 IPv4 Address-Einträge die eine führende 0 haben im hosts file ignoriert:<br />
<br />
<pre>C:\Windows\system32>echo 9.20.187.<b>0</b>6 TestHost
  >> %SystemRoot%\system32\Drivers\etc\hosts

C:\Windows\system32>ipconfig /displaydns | find "A-Eintrag"
    AAAA-Eintrag  . . . . : 2001::1
    AAAA-Eintrag  . . . . : fe80::20d:60ff:fe49:47
    AAAA-Eintrag  . . . . : 2001::2
    (Host-)A-Eintrag  . . : 9.20.187.96

C:\Windows\system32>echo 9.20.187.6 TestHost
  >> %SystemRoot%\system32\Drivers\etc\hosts

C:\Windows\system32>ipconfig /displaydns | find "A-Eintrag"
    AAAA-Eintrag  . . . . : 2001::1
    AAAA-Eintrag  . . . . : fe80::20d:60ff:fe49:47
    AAAA-Eintrag  . . . . : 2001::2
    (Host-)A-Eintrag  . . : 9.20.187.96
    <b>(Host-)A-Eintrag  . . : 9.20.187.6</b></pre> 
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://itblog.eckenfels.net/archives/472-jarsigner-mit-Tokens.html" rel="alternate" title="jarsigner mit Tokens" />
        <author>
            <name>Bernd Eckenfels</name>
            <email>bernd-2011@eckenfels.net</email>        </author>
    
        <published>2011-06-02T21:37:01Z</published>
        <updated>2011-06-06T14:40:18Z</updated>
        <wfw:comment>http://itblog.eckenfels.net/wfwcomment.php?cid=472</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://itblog.eckenfels.net/rss.php?version=atom1.0&amp;type=comments&amp;cid=472</wfw:commentRss>
    
            <category scheme="http://itblog.eckenfels.net/categories/7-Java-Programming" label="Java Programming" term="Java Programming" />
            <category scheme="http://itblog.eckenfels.net/categories/8-Sicherheit" label="Sicherheit" term="Sicherheit" />
    
        <id>http://itblog.eckenfels.net/archives/472-guid.html</id>
        <title type="html">jarsigner mit Tokens</title>
        <content type="xhtml" xml:base="http://itblog.eckenfels.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <a class="serendipity_image_link" title="jarsigner mit ASEKey Token Dialog unter Windows 7" href='http://itblog.eckenfels.net/uploads/screen/screenshot-token.png'><!-- s9ymdb:151 --><img class="serendipity_image_right" width="110" height="86"  src="http://itblog.eckenfels.net/uploads/screen/screenshot-token.serendipityThumb.png" title="jarsigner mit ASEKey Token Dialog unter Windows 7" alt="jarsigner mit ASEKey Token Dialog unter Windows 7" /></a>Um Java Applets und JAR Files zu signieren nutzt man den jarsigner, der normalerweise ein Java-Keystore (.jks) file nutzt. Es ist allerdings ungünstig Codesigning Zertifikate einfach so in Files herumliegen zu haben (auch wenn man diese gesondert sichert). Es ist anzuraten ein Zertifikat besser in einer SmartCard oder einem Token zu speichern.<br />
<br />
Der Oracle jarsigner.exe verwendet die Java Security Provider der JCE API. Um damit ein Hardware Token anzusprechen gibt es im wesentlichen 2 Methoden. Entweder den PKCS#11 Provider (benötigt eine PKCS#11 library (.dll oder .so) des Hardwareherstellers) oder unter Windows den Microsoft CryptoAPI (MSCAPI) treiber. Letzteres hat den Vorteil dass die meisten Smartcards unter Windows 7 oder 2008 bereits Treiber beim einstecken installieren. Diese Minitreiber sind nur begrenzt nutzbar, aber für das signieren reicht es aus.<br />
<br />
Bei meinen Versuchen habe ich aber einige Einschränkungen gefunden:<ul><li> Es wird Java 5,6 oder 7(>b144) benötigt.</li><li> Ich habe nur die Java Distribution von Sun/Oracle getestet</li><li> In der 64bit Variante wird der Provider aktuell nur von Java 7 ausgeliefert</li><li> Über MSCAPI wird immer in getrenntem Dialog nach PIN gefragt</li></ul>Anbei Beispielbefehle zum auslesen des Keystores (in dem auch das Codesigning Zertifikat das auf dem USB Token gespeichert ist sichtbar ist) sowie dem Signaturvorgang:<br />
<br />
<pre>c:\Program Files (x86)\Java\jdk1.6.0_24\bin>keytool -list -storetype Windows-MY

Keystore-Typ: Windows-MY
Keystore-Provider: SunMSCAPI

Ihr Keystore enthält 4 Einträge.
...
FIRMA AG, PrivateKeyEntry,
Zertifikatsfingerabdruck (MD5): 57:EF:97:04:EA:91:EE:FF:CF:BF:7F:75:AE:E1:A2:7D
...
c:\Program Files (x86)\Java\jdk1.6.0_24\bin>jarsigner.exe -storetype Windows-MY
%TEMP%\test.jar "FIRMA AG"</pre><br />
<br />
Als Speicher für die Zertifikate verwende ich ein <a href="http://itblog.eckenfels.net/exit.php?url_id=5469&amp;entry_id=472"  onmouseover="window.status='http://cryptoshop.com/de/products/cardtoken/token/4410101006.php';return true;" onmouseout="window.status='';return true;">Athena ASEKey Crypto Token</a> in das ich mit den Athena IDProtect Tools auf einem anderen Computer das <a href="http://itblog.eckenfels.net/exit.php?url_id=5471&amp;entry_id=472" title="https://securitycenter.verisign.com/celp/enroll/retail"  onmouseover="window.status='https://securitycenter.verisign.com/celp/enroll/retail';return true;" onmouseout="window.status='';return true;">Codesigning Zertifikat von Verisign</a> (Promo:WINQUAL99) importiert habe. Das Zertifikat ist übrigens ein Authenticode Class 3 Zertifikat das es aktuell für Teilnehmer am Microsoft WinQual Programm für ein Jahr günstig ($99) gibt. Entgegen den Angaben von Verisign lässt sich dieses auch problemlos für Java Signig verwenden.<br />
<br />
Einziges Problem bei der Sache, mit -storepass oder -keypass lässt sich die PIN für die SmartCard nicht angeben, diese fragt immer mit einem Popup nach entsprechender Freigabe. Ich habe in den Athena Tools keine Möglichkeit gefunden diese abzuschalten (allerdings geht es mit der PKCS#11 API, wie ich im nächsten Beitrag berichten werde).<br />
<br />
<pre>c:\Program Files (x86)\Java\jdk1.6.0_24\bin>jarsigner -verify -certs -verbose %T
EMP%\test.jar

         134 Thu Jun 02 23:27:48 CEST 2011 META-INF/MANIFEST.MF
         258 Fri Jun 03 00:04:02 CEST 2011 META-INF/FIRMA_AG.SF
        4764 Fri Jun 03 00:04:02 CEST 2011 META-INF/FIRMA_AG.RSA
           0 Thu Jun 02 23:23:38 CEST 2011 META-INF/
sm     15104 Sun Mar 06 04:56:06 CET 2011 jarsigner.exe

      X.509, CN=FIRMA AG, OU=Software Development, 
                OU=Digital ID Class 3 - Microsoft Software Validation v2,
                  O=FIRMA AG, ST=Baden-Wuerttemberg, C=DE
      [certificate is valid from 21.12.10 01:00 to 22.12.11 00:59]
      X.509, CN=VeriSign Class 3 Code Signing 2010 CA
      [certificate is valid from 08.02.10 01:00 to 08.02.20 00:59]
      [KeyUsage extension does not support code signing]
      X.509, CN=VeriSign Class 3 Public Primary Certification Authority - G5
      [certificate is valid from 08.11.06 01:00 to 17.07.36 01:59]
      [KeyUsage extension does not support code signing]


  s = signature was verified
  m = entry is listed in manifest
  k = at least one certificate was found in keystore
  i = at least one certificate was found in identity scope

jar verified.</pre><br />
<br />
<b>Update:</b> Ich habe das ganze gerade mit der b144 von Java 7 getestet, und damit lassen sich sowohl mit 32bit als auch mit der 64bit Version der MSCAPI Provider für die Signatur von JAR Files via Smart Token nutzen. 
            </div>
        </content>
        
    </entry>

</feed>
