IPTABLES Black- und Whitelist

Iptables Whitelist
Bei diesem einfachen Beispiel der iptables-Datei (unter CentOS 6 /etc/sysconfig/iptables) werden alle Verbindungen gekappt. Die einzigen Ausnahmen bilden dabei zwei IP-Adressen: 192.168.0.17 und 192.168.0.22. Diese IP-Adressen können sowohl einkommend als auch ausgehend für icmp, tcp und udp bedient werden.

# Generated by iptables-save v1.4.7 
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [166:25321]
 
#192.168.0.17 erlauben
-A INPUT -s 192.168.0.17/32 -p icmp -m icmp -j ACCEPT
-A INPUT -s 192.168.0.17/32 -p tcp -m tcp -j ACCEPT
-A INPUT -s 192.168.0.17/32 -p udp -m udp -j ACCEPT
-A OUTPUT -d 192.168.0.17/32 -p icmp -m icmp -j ACCEPT
-A OUTPUT -d 192.168.0.17/32 -p tcp -m tcp -j ACCEPT
-A OUTPUT -d 192.168.0.17/32 -p udp -m udp -j ACCEPT
 
#192.168.0.22 erlauben
-A INPUT -s 192.168.0.22/32 -p icmp -m icmp -j ACCEPT
-A INPUT -s 192.168.0.22/32 -p tcp -m tcp -j ACCEPT
-A INPUT -s 192.168.0.22/32 -p udp -m udp -j ACCEPT
-A OUTPUT -d 192.168.0.22/32 -p icmp -m icmp -j ACCEPT
-A OUTPUT -d 192.168.0.22/32 -p tcp -m tcp -j ACCEPT
-A OUTPUT -d 192.168.0.22/32 -p udp -m udp -j ACCEPT
 
#localhost erlauben
-A INPUT -s 127.0.0.1 -p icmp -m icmp -j ACCEPT
-A INPUT -s 127.0.0.1 -p tcp -m tcp -j ACCEPT
-A INPUT -s 127.0.0.1 -p udp -m udp -j ACCEPT
-A OUTPUT -d 127.0.0.1 -p icmp -m icmp -j ACCEPT
-A OUTPUT -d 127.0.0.1 -p tcp -m tcp -j ACCEPT
-A OUTPUT -d 127.0.0.1 -p udp -m udp -j ACCEPT
 
COMMIT

IPTABLES-Blacklist
Bei diesem Beispiel wird allen IP-Adressen außer der 192.168.0.17 und 192.168.0.22 erlaubt über icmp, tcp und udp zu kommunizieren.

# Generated by iptables-save v1.4.7 
*filter
:INPUT ACCEPT [42930:57785664]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [42884:57880741]
 
#192.168.0.17 verbieten
-A INPUT -s 192.168.0.17/32 -p icmp -m icmp -j REJECT --reject-with icmp-host-unreachable
-A INPUT -s 192.168.0.17/32 -p tcp -m tcp -j REJECT --reject-with icmp-host-unreachable
-A INPUT -s 192.168.0.17/32 -p udp -m udp -j REJECT --reject-with icmp-host-unreachable
-A OUTPUT -d 192.168.0.17/32 -p icmp -m icmp -j REJECT --reject-with icmp-host-unreachable
-A OUTPUT -d 192.168.0.17/32 -p tcp -m tcp -j REJECT --reject-with icmp-host-unreachable
-A OUTPUT -d 192.168.0.17/32 -p udp -m udp -j REJECT --reject-with icmp-host-unreachable
 
#192.168.0.22 verbieten
-A INPUT -s 192.168.0.22/32 -p icmp -m icmp -j REJECT --reject-with icmp-host-unreachable
-A INPUT -s 192.168.0.22/32 -p tcp -m tcp -j REJECT --reject-with icmp-host-unreachable
-A INPUT -s 192.168.0.22/32 -p udp -m udp -j REJECT --reject-with icmp-host-unreachable
-A OUTPUT -d 192.168.0.22/32 -p icmp -m icmp -j REJECT --reject-with icmp-host-unreachable
-A OUTPUT -d 192.168.0.22/32 -p tcp -m tcp -j REJECT --reject-with icmp-host-unreachable
-A OUTPUT -d 192.168.0.22/32 -p udp -m udp -j REJECT --reject-with icmp-host-unreachable
 
COMMIT

Tomcat-Installation unter CentOS7

Am einfachsten ist die Installation über yum:

yum install tomcat tomcat-webapps tomcat-admin-webapps

Nachdem die Installation abgeschlossen wurde, sollten die notwendigen User/Rollen in der Datei /usr/share/tomcat/conf/tomcat-users.xml angepasst und aktiviert werden.

<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<role rolename="admin-gui"/>
<role rolename="admin-script"/>
<user username="admin" password="xxx" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-gui,admin-script"/>

Anschließend noch den Tomcat neustarten

systemctl restart tomcat.service

-> fertig.

Speicherverbraucher Top10 der Oracle-Objekte

Top10 der Speicherverbraucher einer Oracle-DB ermitteln:

SELECT *
  FROM (  SELECT *
            FROM dba_segments
        ORDER BY bytes DESC)
 WHERE ROWNUM <= 10

TOP10 der größten Lobsegmente mit zugehöriger Tabellen-/Spaltenzuordnung

SELECT *
  FROM (  SELECT l.owner,
                 l.table_name,
                 l.column_name,
                 l.segment_name,
                 l.tablespace_name,
                 l.index_name,
                 ROUND (s.bytes / 1024 / 1024) "SIZE IN MB"
            FROM dba_lobs l, dba_segments s
           WHERE     s.segment_type = 'LOBSEGMENT'
                 AND l.segment_name = s.segment_name
        ORDER BY s.bytes DESC)
 WHERE ROWNUM <= 10;

vi als Hex-Editor

Manchmal benötigt man einen Hex-Editor. Der vi bringt dazu alles notwendige mit.

Um in den Hex-Modus zu wechseln gibt man im Befehlsmodus einfach folgendes ein:

:%!xxd

Um den Hex-Modus wieder zu verlassen, dieses:

:%!xxd –r

Benötigter Platz für Undo-Tablespace berechnen

Um die Größe des Undo-TS zu bestimmen/prüfen, ist folgendes SQL-Statement sehr hilfreich:

SELECT d.undo_size/(1024*1024) "ACTUAL UNDO SIZE [MByte]",
       SUBSTR(e.value,1,25) "UNDO RETENTION [Sec]",
       (TO_NUMBER(e.value) * TO_NUMBER(f.value) *
       g.undo_block_per_sec) / (1024*1024) 
      "NEEDED UNDO SIZE [MByte]"
  FROM (
       SELECT SUM(a.bytes) undo_size
         FROM v$datafile a,
              v$tablespace b,
              dba_tablespaces c
        WHERE c.contents = 'UNDO'
          AND c.status = 'ONLINE'
          AND b.name = c.tablespace_name
          AND a.ts# = b.ts#
       ) d,
      v$parameter e,
       v$parameter f,
       (
       SELECT MAX(undoblks/((end_time-begin_time)*3600*24))
         undo_block_per_sec
         FROM v$undostat
       ) g
 WHERE e.name = 'undo_retention'
  AND f.name = 'db_block_size';

Oracle Tablespace bzw. Databasefiles verkleinern

Um einen Tablespace auf ein Minimum zu reduzieren, kann folgendes SQL-Kommando genutzt werden:

SELECT DECODE (
    end_block_1,
    NULL,    'ALTER TABLESPACE '
          || TABLESPACE_NAME 
          || ' DROP DATAFILE '''
          || FILE_NAME
          || ''';',
       'ALTER DATABASE DATAFILE '''
          || FILE_NAME
          || ''' RESIZE '
          || CEIL ( (NVL (END_BLOCK_1, 1) * 8192) / 1024 / 1024)
          || 'M;')
    RESIZE_COMMAND
FROM (SELECT FILE_NAME,
             TABLESPACE_NAME,
             FILE_ID,
             FILE_BLOCKS,
             SEGMENT_NAME SEGMENT_NAME_1,
             START_BLOCK START_BLOCK_1,
             END_BLOCK END_BLOCK_1,
             LEAD (SEGMENT_NAME, 1)
                  OVER (PARTITION BY FILE_NAME ORDER BY START_BLOCK DESC)
                  SEGMENT_NAME_2,
             LEAD (START_BLOCK, 1)
                  OVER (PARTITION BY FILE_NAME ORDER BY START_BLOCK DESC)
                  START_BLOCK_2,
             LEAD (END_BLOCK, 1)
                  OVER (PARTITION BY FILE_NAME ORDER BY START_BLOCK DESC)
                  END_BLOCK_2,
             LEAD (SEGMENT_NAME, 2)
                  OVER (PARTITION BY FILE_NAME ORDER BY START_BLOCK DESC)
                  SEGMENT_NAME_3,
             LEAD (START_BLOCK, 2)
                  OVER (PARTITION BY FILE_NAME ORDER BY START_BLOCK DESC)
                  START_BLOCK_3,
             LEAD (END_BLOCK, 2)
                  OVER (PARTITION BY FILE_NAME ORDER BY START_BLOCK DESC)
                  END_BLOCK_3,
             POSITION
         FROM (SELECT FILE_NAME,
                      TABLESPACE_NAME,
                      FILE_ID,
                      FILE_BLOCKS,
                      SEGMENT_NAME,
                      BLOCK_ID START_BLOCK,
                      BLOCK_ID + BLOCKS - 1 END_BLOCK,
                      POSITION
                   FROM (SELECT DISTINCT
                                DDF.TABLESPACE_NAME,
                                DDF.FILE_NAME,
                                DDF.FILE_ID,
                                DDF.BLOCKS FILE_BLOCKS,
                                DE.SEGMENT_NAME,
                                DE.BLOCK_ID,
                                DE.BLOCKS,
                                ROW_NUMBER ()
                                OVER (PARTITION BY DDF.FILE_NAME
                                    ORDER BY DE.BLOCK_ID DESC)
                                    POSITION
                             FROM DBA_DATA_FILES DDF, DBA_EXTENTS DE
                             WHERE   DDF.FILE_ID = DE.FILE_ID(+)
                                         AND DDF.TABLESPACE_NAME LIKE 'TS_%')
                   WHERE POSITION <= 3))
         WHERE POSITION = 1
         ORDER BY FILE_ID;

Dabei muss der entsprechende Tablespace-Name angegeben bzw. korrigiert werden (im Beispiel in der viertletzten Zeile: TS_%). Die erzeugte Ausgabe enthält dann die Änderungsbefehle, um die Databasefiles zu verkleinern bzw. zu löschen:

ALTER DATABASE DATAFILE '/home/oracle/datenbanken/DB/TS_ABC/abc_1.dbf' RESIZE 2048M;
ALTER DATABASE DATAFILE '/home/oracle/datenbanken/DB/TS_ABC/abc_2.dbf' RESIZE 740M;

ACHTUNG: Wenn die Kommandos ohne Kontrolle abgesetzt werden, kann der geänderte Tablespace so klein werden, dass keine Inserts mehr möglich sind. Also kann unter Umständen die Datenbank stehen bleiben. Daher bitte immer die abgesetzten Kommandos manuell prüfen!!!

Oracle-Databasefiles unter SAP verkleinern

Databasefiles werden mit Hilfe der brtools verkleinert.

Um die maximal mögliche Verkleinerung zu erzielen, kann folgendes SQL-Kommando genutzt werden:

SELECT DECODE (
    end_block_1,
    NULL,    'brspace -c force -f dfalter -a drop  -f '''
          || FILE_NAME
          || '''',
       'brspace -c force -f dfalter -a resize -f '''
    || FILE_NAME
    || ''' -s  '
    || CEIL ( (NVL (END_BLOCK_1, 1) * 8192) / 1024 / 1024))
    RESIZE_COMMAND
FROM (SELECT FILE_NAME,
             FILE_ID,
             FILE_BLOCKS,
             SEGMENT_NAME SEGMENT_NAME_1,
             START_BLOCK START_BLOCK_1,
             END_BLOCK END_BLOCK_1,
             LEAD (SEGMENT_NAME, 1)
                  OVER (PARTITION BY FILE_NAME ORDER BY START_BLOCK DESC)
                  SEGMENT_NAME_2,
             LEAD (START_BLOCK, 1)
                  OVER (PARTITION BY FILE_NAME ORDER BY START_BLOCK DESC)
                  START_BLOCK_2,
             LEAD (END_BLOCK, 1)
                  OVER (PARTITION BY FILE_NAME ORDER BY START_BLOCK DESC)
                  END_BLOCK_2,
             LEAD (SEGMENT_NAME, 2)
                  OVER (PARTITION BY FILE_NAME ORDER BY START_BLOCK DESC)
                  SEGMENT_NAME_3,
             LEAD (START_BLOCK, 2)
                  OVER (PARTITION BY FILE_NAME ORDER BY START_BLOCK DESC)
                  START_BLOCK_3,
             LEAD (END_BLOCK, 2)
                  OVER (PARTITION BY FILE_NAME ORDER BY START_BLOCK DESC)
                  END_BLOCK_3,
             POSITION
         FROM (SELECT FILE_NAME,
                      FILE_ID,
                      FILE_BLOCKS,
                      SEGMENT_NAME,
                      BLOCK_ID START_BLOCK,
                      BLOCK_ID + BLOCKS - 1 END_BLOCK,
                      POSITION
                   FROM (SELECT DISTINCT
                                DDF.FILE_NAME,
                                DDF.FILE_ID,
                                DDF.BLOCKS FILE_BLOCKS,
                                DE.SEGMENT_NAME,
                                DE.BLOCK_ID,
                                DE.BLOCKS,
                                ROW_NUMBER ()
                                OVER (PARTITION BY DDF.FILE_NAME
                                    ORDER BY DE.BLOCK_ID DESC)
                                    POSITION
                             FROM DBA_DATA_FILES DDF, DBA_EXTENTS DE
                             WHERE   DDF.FILE_ID = DE.FILE_ID(+)
                                         AND DDF.TABLESPACE_NAME LIKE 'PSAPSR3')
                   WHERE POSITION <= 3))
         WHERE POSITION = 1
         ORDER BY FILE_ID;

Die Ausgabe kann dann auf der Kommandozeile ausgeführt werden. Man sollte aber bedenken, dass (falls im Vorfeld die gesamte DB reorganisiert wurde) anschließend kaum noch Platz für neue Daten zur Verfügung steht. Also sollte man die Ausgaben dieses SQL-Statements mit Vorsicht genießen und ggf. noch etwas Kapazität aufschlagen.

Ausgabebeispiel:

brspace -c force -f dfalter -a resize -f '/oracle/X01/sapdata1/sr3_1/sr3.data1' -s  5240
brspace -c force -f dfalter -a resize -f '/oracle/X01/sapdata1/sr3_2/sr3.data2' -s  5140
brspace -c force -f dfalter -a resize -f '/oracle/X01/sapdata1/sr3_3/sr3.data3' -s  5140
brspace -c force -f dfalter -a resize -f '/oracle/X01/sapdata1/sr3_4/sr3.data4' -s  5060
brspace -c force -f dfalter -a resize -f '/oracle/X01/sapdata1/sr3_5/sr3.data5' -s  5000
brspace -c force -f dfalter -a resize -f '/oracle/X01/sapdata1/sr3_6/sr3.data6' -s  7740
brspace -c force -f dfalter -a resize -f '/oracle/X01/sapdata1/sr3_7/sr3.data7' -s  7053

Die hier ausgegebenen Werte werden in GB angegeben.

Speicherverbrauch einzelner Prozesse unter Solaris

Unter Solaris gibt es mehrere Möglichkeiten den Speicherverbrauch einzelner Prozesse zu erkennen:

ps -eo pid,vsz,rss,comm | sort -rnk2 | head -100

zeigt die Top 100 Prozesse sortiert nach Speicherverbrauch. Dabei wird der Speicherverbrauch in KB ausgegeben.

Eine alternative stellt das Verzeichnis /proc da. Darin werden die Prozesse in einzelne Verzeichnisse unterteilt. Innerhalb solch eines Verzeichnisses befindet sich die Datei as, die den Hauptspeicherverbrauch der entsprechenden PID wieder gibt.

ls -lh /proc/*/as

Auch folgender Befehl könnte interessant sein:

prstat -Z 1 1

„Horchende“ Netzwerkports unter Solaris anzeigen

Unter Solaris gibt es leider nicht (wie unter Linux) die Möglichkeit mit einem

netstat -tulpen

sich die offenen Ports mit zugehörigen Programmen anzeigen zu lassen. Unter Solaris kann man dafür das Programm lsof nutzen. Wenn alle offenen TCP-Prots angezeigt werden sollen, einfach folgendes Kommando ausführen:

lsof -Pan -i tcp | grep -i listen

Für UDP-Ports muss man den grep weglassen:

lsof -Pan -i udp

mit dem VI Zeilen mit variablen Inhalt suchen und ersetzen

Wenn man mit dem VI in einer Datei Variablen Inhalt ersetzen will, dann kann man das mit RegExp ganz gut hinbekommen.

z.B.:

Eine Datei mit folgendem Inhalt

abc1234567890xyz
abc0987654321xyz
aaa1234567890xyz
abc0987654321xxx

soll ersetzt werden mit folgendem Inhalt

cba1234567890zyx
cba0987654321zyx
aaa1234567890xyz
abc0987654321xxx

dann ist dafür die suchen und ersetzen Funktion des vi mit entsprechenden RegularExpressions zu füllen:

:%s/abc\(.*\)xyz/cba\1zyx/g

Relevant ist im Suchstring die in auskommentierte runde Klammern gesetzte RegExp. Diese wird im Ersetzstring mit der auskommentierten 1 wieder eingefügt. Sollte es mehrere variable Bereiche geben, so werden die Strings durchnummeriert (1, 2 … n).

Dieses funktioniert so natürlich auch mit dem sed:

sed 's/abc\(.*\)xyz/cba\1zyx/g' [DATEI]