728x90

sftp 로그를 남겨보자.

sftp 로그는 남지 않습니다. 그 방식이 inet 방식이 되었든 standalone가 되었든 안남습니다.
왜 남지 않을까요?
생각해보았지만, ftp로그에도 별도로 남지는 않더라구요.

ftp 로그는 저는 xferlog로 남기지만, 암튼 남지 않는건 확실합니다. 

 

 

vi /etc/ssh/sshd_config 
루트로 로그인 하여 다음의 설정 상황을 살펴봅시다.
119 # override default of no subsystems
120 Subsystem       sftp    /usr/libexec/openssh/sftp-server -f local2 -l INFO

편의상 set nu로 줄표시를 하였습니다. 

이것과 상관이 있지는 않습니다. 

일단 멘페이지에서 관련된 메뉴얼을 확인해보았습니다. 
번역을 할까 말까 했는데, 우리가 관심있게 봐야 할 것은 로그레벨 설정하는 것과 로그 패실리티 설정하는 것 두개만 존재한다고 보면
될것 같습니다. 


man sftp-server
SFTP-SERVER(8)            BSD System Manager’s Manual           SFTP-SERVER(8)

NAME
     sftp-server - SFTP server subsystem

SYNOPSIS
     sftp-server [-f log_facility] [-l log_level]

DESCRIPTION
     sftp-server is a program that speaks the server side of SFTP protocol to stdout and expects client requests from
     stdin.  sftp-server is not intended to be called directly, but from sshd(8) using the Subsystem option.

     Command-line flags to sftp-server should be specified in the Subsystem declaration.  See sshd_config(5) for more
     information.

     Valid options are:

     -f log_facility
             Specifies the facility code that is used when logging messages from sftp-server.  The possible values
             are: DAEMON, USER, AUTH, LOCAL0, LOCAL1, LOCAL2, LOCAL3, LOCAL4, LOCAL5, LOCAL6, LOCAL7.  The default is
             AUTH.

     -l log_level
             Specifies which messages will be logged by sftp-server.  The possible values are: QUIET, FATAL, ERROR,
             INFO, VERBOSE, DEBUG, DEBUG1, DEBUG2, and DEBUG3.  INFO and VERBOSE log transactions that sftp-server
             performs on behalf of the client.  DEBUG and DEBUG1 are equivalent.  DEBUG2 and DEBUG3 each specify
             higher levels of debugging output.  The default is ERROR.

     For logging to work, sftp-server must be able to access /dev/log.  Use of sftp-server in a chroot configuation
     therefore requires that syslogd(8) establish a logging socket inside the chroot directory.

SEE ALSO
     sftp(1), ssh(1), sshd_config(5), sshd(8)

     T. Ylonen and S. Lehtinen, SSH File Transfer Protocol, draft-ietf-secsh-filexfer-00.txt, January 2001, work in
     progress material.

AUTHORS
     Markus Friedl 〈markus@openbsd.org

HISTORY
     sftp-server first appeared in OpenBSD 2.8 .

BSD                             August 30, 2000                            BSD
(END) 

 

그 다음은 로그를 관리해야 할 부분을 세팅해야 합니다. 

 

 

vi /etc/syslog.conf 
35 local2.*                                        /var/log/sftp.log
가장 바닥에 셋팅하면 됩니다.

여기가 좀 중요한것 같은데,
syslog 재시작 해주고, sshd 재시작해주면 됩니다. 
순서가 중요하다고 이런 저런 사이트에서 보면 있네요.

 

되는지 안되는지 확인해보면 됩니다. 


tail -f /var/log/sftp.log 
Apr 16 17:59:02 www sftp-server[2985]: debug1: request 291: sent names count 1
Apr 16 17:59:02 www sftp-server[2985]: debug1: read eof
Apr 16 17:59:02 www sftp-server[2985]: session closed for local user 

 

되는 것을 확인합니다.


반응형
728x90

1. 먼저 /etc/inetd.conf 파일에서 FTP부분을 수정한다.

마지막 부분에 -l 옵션을 추가한다.


ftp stream tcp6 nowait /usr/sbin/ftpd ftpd -l


2. 그 다음에 /etc/syslog.conf 파일에 다음 1라인을 추가한다.


daemon.info /var/adm/ras/ftp.log


--> 당연히 /var/adm/ras/ftp.log파일은 미리 touch로 만들어놓아야겠죠....


3. 마지막으로 inetd와 syslogd 데몬을 refresh한다.


# touch /var/adm/ras/ftp.log


# refresh -s inetd


# refresh -s syslogd


출처: http://egloos.zum.com/donquite/v/8860506

반응형

'UNIX & LINUX > AIX' 카테고리의 다른 글

IBM JVM 튜닝  (0) 2015.10.27
AIX wget 설치  (0) 2015.10.20
728x90

Linux 에서 Tomcat과 nginx를 연동해 사용하려고 할 때 설정.

Tomcat

초기 설정대로 8080 포트로 실행한다.

nginx

  • /etc/nginx/conf.d/default.conf 수정 : location 정보를 추가해 80포트로 들어오는 요청을 8080 포트로 pass한다.
location = /50x.html {
        root   /usr/share/nginx/html;
    }
    location ~ \.do$ {
      proxy_pass              http://localhost:8080;
      proxy_set_header        X-Real-IP $remote_addr;
      proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header        Host $http_host;
    }
    location ~ \.jsp$ {
      proxy_pass              http://localhost:8080;
      proxy_set_header        X-Real-IP $remote_addr;
      proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header        Host $http_host;
    }
    location ^~/servlets/* {
      proxy_pass              http://localhost:8080;
      proxy_set_header        X-Real-IP $remote_addr;
      proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header        Host $http_host;
    }
    location ^~/* {
      proxy_pass              http://localhost:8080;
      proxy_set_header        X-Real-IP $remote_addr;
      proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header        Host $http_host;
    }

nginx Load Balancer

  • 만약 여러대의 서버로 구성된 애플리케이션 서버들이 있고 그 앞에 LB용(세션 정보 공유) 서버가 있다면 아래와 같이 upstream 정보로 서버 ip를 나열하고 proxy_pass로 upstream 정보를 입력한다.
upstream backend {
    ip_hash;
    server 210.122.7.224:80;
}

server {
    listen       80;
    location /resources/ {
        alias   /home/townus/resources/;
        autoindex off;
        access_log off;
        expires max;
    }
    location / {
        #root   /usr/share/nginx/html;
        #index  index.html index.htm;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass  http://backend;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }


반응형

'WEB & WAS > nginx' 카테고리의 다른 글

NginX를 이용한 static 컨텐츠 서비스 와 캐시 설정  (0) 2022.08.09
728x90

서버 구축시에 iptables를 꺼두고 차후에 관련 사항등을 업데이트 하거나 잊고 사는 분들이 많을꺼라 본다. 처음에 iptables를 접하면 방화벽 규칙 작성하는게 여간 복잡해 보이는 것이 아니기 때문이다. 홈서버의 경우 대부분 공유기를 사용할텐데, 이를 믿고 등한시하기도 할테다. 행여나 iptables가 궁금해졌다면 잘 찾아왔다.

iptalbes란?

iptables란 넷필터 프로젝트에서 개발했으며 광범위한 프로토콜 상태 추적, 패킷 애플리케이션 계층검사, 속도 제한, 필터링 정책을 명시하기 위한 강력한 매커니즘을 제공한다.

서비스 등록과 시작

CentOS 6.4 Minimal에는 iptables가 설치되어 있다. ip6tables도 함께 설치되어 있는데 이는 IPv6 체계에서 사용한다.

BASH
rpm -qa | grep iptables

  iptables-1.4.7-9.el6.x86_64
  iptables-ipv6-1.4.7-9.el6.x86_64

설치되어 있지 않다면 설치

BASH
yum -y install iptables 

상태 확인

BASH
chkconfig --list

  ip6tables 0:해제  1:해제  2:해제  3:해제  4:해제  5:해제  6:해제
  iptables 0:해제  1:해제  2:해제  3:해제  4:해제  5:해제  6:해제

서비스를 시작프로그램에 등록한다.

BASH
chkconfig iptables on

서비스를 시작한다.

BASH
service iptables start

iptables의 파일위치는 /etc/sysconfig/iptables 이다.

iptables 용어

어려운 용어들은 제껴두고 간략히 사용할 부분에 대해서 설명한다.

1) 테이블(tables)

우선 iptables에는 테이블이라는 광범위한 범주가 있는데, 이 테이블은 filter, nat, mangle, raw 같은 4개의 테이블로 구성되며, 이중에서 우리에게 필요한 것은 필터링 규칙을 세우는 filter 테이블이다.

2) 체인(chain)

iptables에는 filter 테이블에 미리 정의된 세가지의 체인이 존재하는데 이는 INPUT, OUTPUT, FORWARD 이다. 이 체인들은 어떠한 네트워크 트래픽(IP 패킷)에 대하여 정해진 규칙들을 수행한다.

가령 들어오는 패킷(INPUT)에 대하여 허용(ACCEPT)할 것인지, 거부(REJECT)할 것인지, 버릴(DROP)것인지를 결정한다.

  • INPUT : 호스트 컴퓨터를 향한 모든 패킷
  • OUTPUT : 호스트 컴퓨터에서 발생하는 모든 패킷
  • FORWARD : 호스트 컴퓨터가 목적지가 아닌 모든 패킷, 즉 라우터로 사용되는 호스트 컴퓨터를 통과하는 패킷

3) 매치(match)

iptables에서 패킷을 처리할때 만족해야 하는 조건을 가리킨다. 즉, 이 조건을 만족시키는 패킷들만 규칙을 적용한다.

  • --source (-s) : 출발지 IP주소나 네트워크와의 매칭
  • --destination (-d) : 목적지 ip주소나 네트워크와의 매칭
  • --protocol (-p) : 특정 프로토콜과의 매칭
  • --in-interface (i) : 입력 인테페이스
  • --out-interface (-o) : 출력 인터페이스
  • --state : 연결 상태와의 매칭
  • --string : 애플리케이션 계층 데이터 바이트 순서와의 매칭
  • --comment : 커널 메모리 내의 규칙과 연계되는 최대 256바이트 주석
  • --syn (-y) : SYN 패킷을 허용하지 않는다.
  • --fragment (-f) : 두 번째 이후의 조각에 대해서 규칙을 명시한다.
  • --table (-t) : 처리될 테이블
  • --jump (-j) : 규칙에 맞는 패킷을 어떻게 처리할 것인가를 명시한다.
  • --match (-m) : 특정 모듈과의 매치

4) 타겟(target)

iptables는 패킷이 규칙과 일치할 때 동작을 취하는 타겟을 지원한다.

  • ACCEPT : 패킷을 받아들인다.
  • DROP : 패킷을 버린다(패킷이 전송된 적이 없던 것처럼).
  • REJECT : 패킷을 버리고 이와 동시에 적절한 응답 패킷을 전송한다.
  • LOG : 패킷을 syslog에 기록한다.
  • RETURN : 호출 체인 내에서 패킷 처리를 계속한다.

REJECT는 서비스에 접속하려는 사용자의 액세스를 거부하고 connection refused라는 오류 메시지를 보여주는 반면 DROP은 말 그대로 telnet 사용자에게 어떠한 경고 메시지도 보여주지 않은 채 패킷을 드롭한다. 관리자의 재량껏 이러한 규칙을 사용할 수 있지만 사용자가 혼란스러워하며 계속해서 접속을 시도하는 것을 방지하려면 REJECT를 사용하는 것이 좋다.

5) 연결 추적(Connection Tracking)

iptables는 연결 추적(connection tracking)이라는 방법을 사용하여 내부 네트워크 상 서비스 연결 상태에 따라서 그 연결을 감시하고 제한할 수 있게 해준다. 연결 추적 방식은 연결 상태를 표에 저장하기 때문에, 다음과 같은 연결 상태에 따라서 시스템 관리자가 연결을 허용하거나 거부할 수 있다.

  • NEW : 새로운 연결을 요청하는 패킷, 예, HTTP 요청
  • ESTABLISHED : 기존 연결의 일부인 패킷
  • RELATED : 기존 연결에 속하지만 새로운 연결을 요청하는 패킷, 예를 들면 접속 포트가 20인 수동 FTP의 경우 전송 포트는 사용되지 않은 1024 이상의 어느 포트라도 사용 가능하다.
  • INVALID : 연결 추적표에서 어디 연결에도 속하지 않은 패킷

상태에 기반(stateful)한 iptables 연결 추적 기능은 어느 네트워크 프로토콜에서나 사용 가능하다. UDP와 같이 상태를 저장하지 않는 (stateless) 프로토콜에서도 사용할 수 있다.

6) 명령어(commond)

  • -A (--append) : 새로운 규칙을 추가한다.
  • -D (--delete) : 규칙을 삭제한다.
  • -C (--check) : 패킷을 테스트한다.
  • -R (--replace) : 새로운 규칙으로 교체한다.
  • -I (--insert) : 새로운 규칙을 삽입한다.
  • -L (--list) : 규칙을 출력한다.
  • -F (--flush) : chain으로부터 규칙을 모두 삭제한다.

  • -Z (--zero) : 모든 chain의 패킷과 바이트 카운터 값을 0으로 만든다.
  • -N (--new) : 새로운 chain을 만든다.
  • -X (--delete-chain) : chain을 삭제한다.
  • -P (--policy) : 기본정책을 변경한다.

7) 기본 동작

  1. 패킷에 대한 동작은 위에서 부터 차례로 각 규칙에 대해 검사하고, 그 규칙과 일치하는 패킷에 대하여 타겟에 지정한 ACCEPT, DROP등을 수행한다.
  2. 규칙이 일치하고 작업이 수행되면, 그 패킷은 해당 규칙의 결과에 따리 처리하고 체인에서 추가 규칙을 무시한다.
  3. 패킷이 체인의 모든 규칙과 매치하지 않아 규칙의 바닥에 도달하면 정해진 기본정책(policy)이 수행된다.
  4. 기본 정책은 policy ACCEPT , policy DROP 으로 설정할 수 있다.

일반적으로 기본정책은 모든 패킷에 대해 DROP을 설정하고 특별히 지정된 포트와 IP주소등에 대해 ACCEPT를 수행하게 만든다.

8) iptables 출력

Iptables의 룰셋을 확인할때 아래와 같이 하면 보기 더 편리하다.

BASH
iptables -nL

  Chain INPUT (policy DROP)
  target     prot opt source               destination
  ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
  ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
  ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:22
  ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:53
  ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:53
  ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80
  ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:443
  ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:3306

  Chain FORWARD (policy DROP)
  target     prot opt source               destination

  Chain OUTPUT (policy ACCEPT)
  target     prot opt source               destination

아래와 같이 각 룰셋의 적용순서까지 확인 가능한 방법도 있다.

BASH
iptables -nL --line-numbers

  Chain INPUT (policy DROP)
  num  target     prot opt source               destination
  1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
  2    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
  3    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:22
  4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:53
  5    ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:53
  6    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80
  7    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:443
  8    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:3306

  Chain FORWARD (policy DROP)
  num  target     prot opt source               destination

  Chain OUTPUT (policy ACCEPT)
  num  target     prot opt source               destination
BASH
iptables -L -v

  Chain INPUT (policy DROP 1626 packets, 214K bytes)
   pkts bytes target     prot opt in     out     source               destination
      0     0 ACCEPT     all  --  lo     any     anywhere             anywhere
    944  194K ACCEPT     all  --  any    any     anywhere             anywhere            state RELATED,ESTABLISHED
      0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere            tcp dpt:ssh
      0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere            tcp dpt:domain
      4   245 ACCEPT     udp  --  any    any     anywhere             anywhere            udp dpt:domain
      6   304 ACCEPT     tcp  --  any    any     anywhere             anywhere            tcp dpt:http
      0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere            tcp dpt:https
      2    88 ACCEPT     tcp  --  any    any     anywhere             anywhere            tcp dpt:mysql

  Chain FORWARD (policy DROP 0 packets, 0 bytes)
   pkts bytes target     prot opt in     out     source               destination

  Chain OUTPUT (policy ACCEPT 179 packets, 22190 bytes)
   pkts bytes target     prot opt in     out     source               destination

iptables 설정

아래는 CentOS 6.4 Minimal의 기본적인 iptables의 설정내용이다.

BASH
iptables -L

  Chain INPUT (policy ACCEPT)
  target     prot opt source               destination
  ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
  ACCEPT     icmp --  anywhere             anywhere
  ACCEPT     all  --  anywhere             anywhere
  ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
  REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

  Chain FORWARD (policy ACCEPT)
  target     prot opt source               destination
  REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

  Chain OUTPUT (policy ACCEPT)
  target     prot opt source               destination

기본 정책이 모든 패킷에 대해 ACCEPT이며, SSH 서비스가 기본적으로 허용되어 있다. 이것을 과감히 날리고! 새로운 정책의 규칙을 작성할 것이다.

기본 정책 수립에 있어 DROP으로 설정할 경우 원격에서 SSH를 접속해 사용중이라면 그 순간 서버에 접속할 수 없게 된다. 그러므로 일단 기본 정책을 ACCEPT로 설정해서 SSH 설정을 마친후 다시 기본 정책을 DROP으로 변경하도록 하자. 현재 iptables 작업을 콘솔(서버컴퓨터로)상으로 작업하고 있다면 문제 될것이 없다.

기본설정

  1. 기본 정책을 ACCEPT 로 변경

    BASH
    iptables -P INPUT ACCEPT
    
  2. 체인에 정의된 모든 규칙을 삭제

    BASH
    iptables -F
    
  3. 확인해보면 규칙이 모두 제거되어 있다.

    BASH
    iptables -L
    
      Chain INPUT (policy ACCEPT)
      target     prot opt source               destination
    
      Chain FORWARD (policy ACCEPT)
      target     prot opt source               destination
    
      Chain OUTPUT (policy ACCEPT)
      target     prot opt source               destination
    
  4. INPUT 체인에 로컬호스트 인터페이스에 들어오는 모든 패킷을 허용 추가

    BASH
    iptables -A INPUT -i lo -j ACCEPT
    

    일반적으로 많은 소프트웨어들이 localhost 어댑터와 통신이 되어야 하기에 필요하다.

  5. INPUT 체인에 state 모듈과 매치되는 연결상태가 ESTABLISHED, RELATED인 패킷에 대해 허용 추가

    BASH
    iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    

    INPUT 체인에 접속에 속하는 패킷(응답 패킷을 가진것)과 기존의 접속 부분은 아니지만 연관성을 가진 패킷 (ICMP 에러나 ftp데이터 접속을 형성하는 패킷)을 허용하는 규칙이다.

  6. INPUT 체인에 프로톨콜이 tcp이며 목적지포트가 22번인 패킷에 대해 허용 추가

    BASH
    iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
    

    이로써 SSH 접속이 허용된다. telnet의 경우는 목적지 포트가 23번

  7. 이제 INPUT 체인에 대한 기본 정책을 버림(DROP)으로 변경

    BASH
    iptables -P INPUT DROP
    
  8. FORWARD 체인에 대한 기본정책을 버림으로 변경

    BASH
    iptables -P FORWARD DROP
    

    서버를 라우팅기기로 사용하지 않기에 모든 포워드에 대한 패킷을 DROP

  9. OUTPUT 체인에 대한 기본정책을 허용으로 변경

    BASH
    iptables -P OUTPUT ACCEPT
    
  10. 설정한 것들에 대한 확인

    BASH
    iptables -L -v
    
      Chain INPUT (policy DROP 108 packets, 12199 bytes)
       pkts bytes target     prot opt in     out     source               destination
          0     0 ACCEPT     all  --  lo     any     anywhere             anywhere
        273 25012 ACCEPT     all  --  any    any     anywhere             anywhere            state RELATED,ESTABLISHED
          0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere            tcp dpt:ssh
    
      Chain FORWARD (policy DROP 0 packets, 0 bytes)
       pkts bytes target     prot opt in     out     source               destination
    
      Chain OUTPUT (policy ACCEPT 9 packets, 1612 bytes)
       pkts bytes target     prot opt in     out     source               destination
    
  11. 설정한 것들 저장

    BASH
    service iptables save
    
    iptables: 방화벽 규칙을 /etc/sysconfig/iptables에 저장 중: [  OK  ]
    

iptables 규칙을 만들 때는 순서가 매우 중요하다. 예를 들어 만일 chain에서 로컬 192.168.100.0/24 서브넷에서 들어오는 모든 패킷을 drop하도록 지정한 후 (drop 하도록 지정된 서브넷에 포함되는) 192.168.100.13에서 들어오는 패킷을 모드 허용하는 chain (-A)을 그 후에 추가하면 뒤에 추가된 추가 규칙이 무시된다. 먼저 192.168.100.13를 허용하는 규칙을 설정한 후 서브넷을 drop하는 규칙을 설정해야한다.

그 밖의 서비스 허용

아래의 설정은 기본 정책을 OUTPUT 체인을 DROP (iptables -P OUTPUT DROP)으로 설정했을 경우를 대비해 OUTPUT도 함께 기술하였다.

네임서버

DNS -- TCP 53 / UDP 53
BASH
iptables -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j ACCEPT

웹서버

HTTP -- TCP 80
BASH
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
HTTPS -- TCP 443
BASH
iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp -m multiport --dports 80,443 -j ACCEPT
MySQL -- TCP 3306
BASH
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT 
FTP(passive mode)
BASH
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A OUTPUT -p tcp –-sport 21 -j ACCEPT

iptables -A INPUT -p tcp --dport 1024:65535 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 1024:65535 -j ACCEPT

메일서버

SMTP -- TCP 25
BASH
iptables -A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
Secure SMTP -- TCP 465
BASH
iptables -A INPUT -p tcp -m tcp --dport 465 -j ACCEPT
POP3 -- TCP 110
BASH
iptables -A INPUT -p tcp -m tcp --dport 110 -j ACCEPT
Secure POP3 -- TCP 995
BASH
iptables -A INPUT -p tcp -m tcp --dport 995 -j ACCEPT
IMAP -- TCP 143
BASH
iptables -A INPUT -p tcp -m tcp --dport 143 -j ACCEPT
Secure IMAP -- 993
BASH
iptables -A INPUT -p tcp -m tcp --dport 993 -j ACCEPT
ICMP 허용 (ping)
BASH
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
NTP 시간동기화
BASH
iptables -A INPUT -p udp --dport 123 -j ACCEPT 

서버 취약점 보안

NULL 패킷 차단

NULL 패킷은 정찰 패킷으로 서버설정의 약한 곳을 찾기위한 방법으로 사용된다.

BASH
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
syn-flood attack 차단

syn-flood attack은 공격자가 새로운 연결을 만들고 빠지고를 반복해 리소스의 소모를 시키는 것

BASH
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP

Anti synflood with iptables

Edit /etc/sysctl.conf to defend against certain types of attacks and append / update as follows:

net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.netfilter.ip_conntrack_max = 1048576
XMAS 패킷 차단

XMAS 또한 정찰 패킷이다.

BASH
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP

기타 사용법

iptables 수정법

등록된 iptables를 수정하는 방법은 /etc/sysconfig/iptables 에서 직접 vi로 수정하거나 iptables 명령어를 사용한다.

실행 순번을 확인하기

BASH
iptables -nL --line-number

아래의 예는 순번 3의 행을 아래와 같이 R(replace) - 수정하게 된다.

BASH
iptables -R INPUT 3 -p tcp --dport 2222 -j ACCEPT

인터페이스 지정

루프백 인터페이스에 대해 모든 패킷을 허용

BASH
iptables -A INPUT -i lo -j ACCEPT

랜카드 지정에 대해 모든 패킷을 허용

BASH
iptables -A INPUT -i eth0 -j ACCEPT

IP 주소 지정

신뢰할 만한 ip에 대해 모든 패킷을 허용

BASH
iptables -A INPUT -s 192.168.0.3 -j ACCEPT

신뢰할 만한 ip 대역에 대해 모든 패킷을 허용

BASH
iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT

신뢰할 만한 ip 대역에 대해 모든 패킷을 허용

BASH
iptables -A INPUT -s 192.168.0.0/255.255.255.0 -j ACCEPT

신뢰할 만한 ip와 MAC주소에 대해 모든 패킷을 허용

BASH
iptables -A INPUT -s 192.168.0.3 -m mac --mac-source 00:50:80:FD:E6:32 -j ACCEPT

포트 범위지정

BASH
iptables -A INPUT -p tcp --dport 6881:6890 -j ACCEPT

자동화 스크립트

자주 방화벽 설정을 초기화하고 재설정해야 한다면 자동화 스크립트를 짜놓는게 좋다. 아래는 그에 대한 예이다.

#!/bin/bash
# iptables 설정 자동화 스크립트
# 입맛에 따라 수정해서 사용합시다.
iptables -F

# TCP 포트 22번을 SSH 접속을 위해 허용
# 원격 접속을 위해 먼저 설정합니다
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT

# 기본 정책을 설정합니다
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# localhost 접속 허용
iptables -A INPUT -i lo -j ACCEPT

# established and related 접속을 허용
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Apache 포트 80 허용
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# 설정을 저장
/sbin/service iptables save

# 설정한 내용을 출력
iptables -L -v
  1. 위 내용을 입맛에 맞게 수정한 후에 저장(myfirewall)
  2. 권한부여

    BASH
    chmod +x myfirewall
    
  3. 실행

    BASH
    ./myfirewall
    


반응형
728x90

출처 : http://kogun82.tistory.com/88


probe  설치


1. psi-probe를 다음의 홈 페이지에서 다운 받는다.(http://code.google.com/p/psi-probe/)


2. 다운 받은 압축 파일을 해제하고 나면 probe.war 파일을 확인 할 수 있다.


3. Tomcat manager에 접속하여 probe.war 파일을 선택하여 업로드하고, deploy를 실행한다.


4. deploy가 완료되면 http://loclahost:8080/probe/ 에 접속하여 확인 할 수 있다. 접속 시 필요한 계정 정보는 Tomcat manager에 계정과 동일하다.





반응형
728x90

출처 : http://stevenjsmin.tistory.com/103


문제점

Linux(혹은 Unix)에서는 1024번 이하의 포트가 보안상의 이유로 root권한을 가지고 있는 로세스만이 포트를 선점할 수 있다.(root reserved ports) root계정이 아닌 일반계정으로 Tomcat을 서비스 할 때정상적으로 Tomcat의 리스너(Listener)가 동작하지 않음을 TOMCAT LOG(logs/catalina.out)를 
통하여 확인 할 수 있다

 

2009. 12. 15 오후 4:14:31 org.apache.coyote.http11.Http11Protocol init
심각: Error initializing endpoint
java.net.BindException: Permission denied<null>:80

 

따라서 일반계정으로 Tomcat 80번 포트(HTTP 기본포트)에서 서비스 하려 한다면, Tomcat HTTP Connector Port 1024이상의 포트번호로 지정해준 뒤80포트로의 모든 인바운딩을 Tomcat HTTP Connector Port로 리다이렉트 해주어야한다아래는 iptables 명령을 이용한 간단한 예제이다.(반드시 root권한으로 수행되어야 한다.)

 

우선 8080포트가 리슨을 하고있는지 확인한다.

# netstat -ntl

The output will look something like

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN
tcp        0      0 ::ffff:127.0.0.1:8005       :::*                        LISTEN
tcp        0      0 :::8009                     :::*                        LISTEN
tcp        0      0 :::8080                     :::*                        LISTEN
tcp        0      0 :::22                       :::* 

예제

TOMCAT 서버가 구동되는 호스트의 IP : 211.110.33.86 또는 localhost
TOMCAT 서버의 HTTP Connector Port : 8080

iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
iptables -t nat -I OUTPUT -p tcp --dport 80 -j REDIRECT --to-ports 8080 

위의 예제는 현재 서버(211.110.33.86) 8080포트에 대한 모든 인바운딩을 80 포트로 리다이렉트(REDIRECT)하는 명령이다.


또는 다음과 같이 명령을 입력한다.

# iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

 

Run the folloing command to verify that redirect is working fine

# iptables -t nat -L

The output will look something like

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
REDIRECT   tcp  --  anywhere             anywhere            tcp dpt:http redir ports 8080

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination

 Run the following command to remove the routing

# iptables -t nat -D PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

 Remember, when you are modifying your running configuration of iptables, you will still need to save your changes in order for it to persist on reboot. Be sure to test your configuration before saving it with "service iptables save" so that you don't lock yourself out

 

생각해보아야할 문제

root권한으로 TOMCAT과 같은 WAS를 구동하였을때 발생 할 수 있는 문제점은?
WEB SERVER없이 TOMCAT과 같은 WAS만으로 서비스하였을때 발생 할 수 있는 문제점은?
SSL(https)의 경우 443번 포트를 해당 프로토콜의 기본 포트로 사용하는데, SSL도 이와같은 처리를 해주어야할까?

반응형
728x90


파이썬을 이용한 시스템 트레이딩 (기초편)

https://wikidocs.net/book/110


https://wikidocs.net/1021


파이썬으로 배우는 알고리즘 트레이딩 (네이버 까페)


http://cafe.naver.com/pystock


시스템 트레이딩을 위한 데이터 사이언스 (파이썬 활용편)

https://wikidocs.net/book/486


반응형

'Language > Python' 카테고리의 다른 글

Python에서 데이터 시각화하는 다양한 방법  (0) 2021.10.21
파이썬으로 구글메일 보내기  (0) 2020.12.24
728x90

Pragma Autonomous_Transaction 사용방법

출처 : http://nagid.egloos.com/2597143

Pragma Autonomous_Transaction

-- 자율 트랜잭션
-- 부모 트랜잭션의 승인/롤백 여부에 상관없이 자신의 작업을 승인하거나 롤백할 수 있다.


-- 프로시저 생성

CREATE OR REPLACE PROCEDURE LOG_MESSAGE( P_MESSAGE VARCHAR2 )
AS
    PRAGMA AUTONOMOUS_TRANSACTION;
    -- 자율 트랜잭션
    -- 부모 트랜잭션의 승인/롤백 여부에 상관없이 자신의 작업을 승인하거나 롤백할 수 있다.
BEGIN
    INSERT INTO LOG_TABLE( USERNAME, DATE_TIME, MESSAGE )
                  VALUES ( USER, CURRENT_DATE, P_MESSAGE );
    COMMIT;
END LOG_MESSAGE;

-- 테이블 생성
CREATE TABLE LOG_TABLE( USERNAME VARCHAR2(30),
                        DATE_TIME TIMESTAMP,
                        MESSAGE VARCHAR2(4000) );

CREATE TABLE TEMP_TABLE( N NUMBER );


-- 프로시저 실행
BEGIN
    LOG_MESSAGE('INSERT INTO TEMP_TABLE');

    INSERT INTO TEMP_TABLE VALUES(12345);

    LOG_MESSAGE('ROLLBACK INSERT');

    ROLLBACK;
END;


반응형
728x90

iPhone에서 하이브리드 앱 개발을 위해 JavaScript와 Objective-C의 상호 호출하는 방법

서론

하이브리드 앱을 개발하기 위해서는 JavaScript와 네이티브 코드간 상호 호출하는 방법을 알아야한다. 이번 포스트에서는 iPhone 개발을 위해 JavaScript 와 Objective-C의 상호 호출하는 방법에 대해서 소개한다.

HTML5의 인기 때문에 요즘 하이브리드 앱의 인기는 계속적으로 상승하는 분위기이다. HTML5에서 추가된 속성으로 마치 네이티브와 같은 개발을 웹 개발 방법으로 할수 있게 되었다. 또한 실제 네이티브 코드로 작성하면 복잡하고 어려운 부분도 JavaScript나 CSS3로 편리하게 구현할 수도 있다.

하지만 내장 브라우저(webkit)에서만 모든 프로세스를 처리하기에는 브라우저 자체도 하나의 app이기 때문에 메모리와 cpu 사용의 한계가 있다. HTML5로 만들어서 사용하는 웹 앱이 과연 성능이 네이티브 앱과 같은 성능을 내어 주는지 궁금하기도 해서 여러 자문을 구하는데 몇몇 기능을 제외하고 순수 JavaScript로만 구현하면 네이티브보다 성능이 좋게 나오지 않는다고 한다는 이야기를 들었다. JavaScript 인터프리터로 모든것을 처리하기에는 한계가 있기 때문에 핵심부분 데이터 처리나 device API를 호출하기 위해서 JavaScript에서 Objective-C 의 메소드를 호출해야하는 경우가 생긴다. iOS는 이러한 webkit의 한계를 극복하기 위해서 Objective-C의 메소드를 호출하는 방법을 제공하고 있다. 물론 Objective-C에서 JavaScript를 호출하는 방법도 제공한다. iOS는 이러한 기능을 만들어 놓았기 때문에 개발자가 보다 더 나은 방법으로 네이티비브 코드의 한계와 웹 코드의 한계를 이해하고 더 나은 방법으로 하이브리드 앱을 개발할 수 있다.

Objective-C에서 Javascript를 호출하는 방법

Objective-C에서 JavaScript를 호출하는 방법은 문자열을 evaluation 시키는 방법이다. AppViewController를 새로 생성하고 Outlet으로 UIWebView인 appWebView를 @property와 @synthesize를 만든다. 그리고 UIBarButtonItem을 누르면 onCallJavascriptButton: 이 호출될수 있게 선언한다. 그리고 구현클래스에서 IBAction와 연결된 onCallJavascriptButton: 메소드를 구현하는데 이때 stringByEvaluationJavascriptFromString: 메소드를 이용해서 JavaScript의 메소드를 문자열로 입력한다. 실제 JavaScript는 app.html 파일 안에 <script>callJavascriptFromObjectiveC()</script>에 구현이 된다. 즉, thestringByEvaluationJavascriptFromString: 메소드를 이용해 JavaScript의 이름을 이용하여 JavaScript 메소드를 호출하는 것이다.

/**
* file: AppViewController.h
* author: SungSwang Song
* email: saltfactory@gmail.com
*/

#import <UIKit/UIKit.h>

@interface AppViewController : UIViewController<UIWebViewDelegate>
@property (retain, nonatomic) IBOutlet UIWebView *appWebView;
- (IBAction)onCallJavascriptButton:(id)sender;
@end

#import "AppViewController.h"

@interface AppViewController ()

@end
/**
* file: AppViewController.m
* author: SungSwang Song
* email: saltfactory@gmail.com
*/

#import <UIKit/UIKit.h>

@interface AppViewController : UIViewController<UIWebViewDelegate>
@property (retain, nonatomic) IBOutlet UIWebView *appWebView;
- (IBAction)onCallJavascriptButton:(id)sender;
@end

#import "AppViewController.h"

@interface AppViewController ()

@end
<!--
file : app.html
-->
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8"/>
        <meta name = "viewport" content = "width = device-width"/>
        <title>Hybrid App</title>
        <script type="text/javascript">

            function callJavascriptFromObjectiveC() {
                alert('called javascript function by objective-c');
            }
        </script>
     </head>
    <body>
        <div id="container">
            Hello Hybrid App
        </div>
    </body>
</html>

JavaScript에서 Objective-C를 호출하는 방법

JavaScript에서 Objective-C를 호출하는 방법은 커스텀 Scheme를 이용하는 방법이다. 안드로이드에서도 URI로 리소스에 접근할수 있는데 이렇게 외부에서 URI scheme를 이용해서 특정 메소드에서 접근하는 방법을 사용하면 웹에서 JavaScript나 hyper text로 어플리케이션의 특정 메소드를 호출할 수 있는 브릿지를 구현할 수 있다. app.html에 button을 하나 만들고 버턴이 눌러지면 JavaScript에 구현한 callObjectiveCFromJavascript() 를 호출한다. 이 메소드 안에는 window.location를 이용해서 커스텀 scheme (ex. jscall://callObjectiveCFromJavascript)로 이동하는 코드를 넣어둔다. 그러면 webView의 delegate 메소드의 webView: souldStartLoadWithRequest:navigationType 메소드를 호출하는데 이때 특정 메소드가 실행되게 구현하면 된다. 예제 코드에서는 Objective-C 메소드 속에 단순하게 Log를 출력하는 것만 넣어 두었다.

<!--
file: app.html
-->
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8"/>
        <meta name = "viewport" content = "width = device-width"/>
        <title>Hybrid App</title>
        <script type="text/javascript">

            function callJavascriptFromObjectiveC() {
                alert('called javascript function by objective-c');
            }

            function callObjectiveCFromJavascript(){
                window.location="jscall://callObjectiveCFromJavascript";
            }

        </script>
     </head>
    <body>
        <div id="container">
            <h3>Hello Hybrid App </h3>

            <button onclick="callObjectiveCFromJavascript();">Call Objective-C</button>

        </div>
    </body>
</html>
/**
* file: AppViewController.m
* author: SungSwang Song
* email: saltfactory@gmail.com
*/

- (void)callObjectiveCFromJavascript {
    NSLog(@"called objective-c from javascript");
}


- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request
                                        navigationType:(UIWebViewNavigationType)navigationType
{
    if ([[[request URL] absoluteString] hasPrefix:@"jscall:"]) {

        NSString *requestString = [[request URL] absoluteString];
        NSArray *components = [requestString componentsSeparatedByString:@"://"];
        NSString *functionName = [components objectAtIndex:1];

        [self performSelector:NSSelectorFromString(functionName)];

        return NO;
    }

    return YES;
}

출처 : salt factory's blog 


반응형
728x90

WEB 서비스를 운영하다 보면 HTTPS SSL 보안 프로토콜을 이용한 서비스를 제공하기 위해 SSL 인증서를 WEB 서버에 설치하여 운용하게 된다.

 

때문에 다수의 WEB 서버 SSL 인증서를 운용, 관리하다보면, 인증서 인증 만료 일자의 관리를 필요로 하게 된다.

 

이때 아래와 같이 Linux OS 이하에 설치된 openssl client와 Shell Script를 통해 다수의 인증서의 만료일자 효율적으로 조회 및 확인이 가능하다.

 

 

1. 조회할 Domain 및 서비스 Port를 기재한 List 파일 작성

 

[root@t-node01 shell]# 
[root@t-node01 shell]# vi ssl.list 
olleh.com 443
yahoo.com 443
google.com 443
tistory.com 443
[root@t-node01 shell]# 

 

 

2. Shell Script 의 실행 예시

 

[root@t-node01 shell]# 
[root@t-node01 shell]# ./check_ssl.sh ssl.list 

 

[ Check SSL - olleh.com / Port - 443 ]
notBefore=Sep 11 09:36:11 2013 GMT
notAfter=Nov 30 05:45:36 2014 GMT

 

[ Check SSL - yahoo.com / Port - 443 ]
notBefore=Apr  9 00:00:00 2014 GMT
notAfter=Apr  9 23:59:59 2015 GMT

 

[ Check SSL - google.com / Port - 443 ]
notBefore=Apr 23 12:16:09 2014 GMT
notAfter=Jul 22 00:00:00 2014 GMT

 

[ Check SSL - tistory.com / Port - 443 ]
notBefore=Apr  9 00:00:00 2014 GMT
notAfter=Jun  8 23:59:59 2015 GMT

 

[root@t-node01 shell]# 

 

 

3. Shell Script Code

 

[root@t-node01 shell]# 
[root@t-node01 shell]# cat check_ssl.sh 
#!/bin/bash

 

LIST_FILE=$1
TMP_CRT=/tmp/tmp.crt
echo

 

while read LIST 
do
 URL=`echo ${LIST} | awk '{print $1}'`
 PORT=`echo ${LIST} | awk '{print $2}'`
 echo "[ Check SSL - ${URL} / Port - ${PORT} ]"
 echo "" | openssl s_client -connect ${URL}:${PORT} > ${TMP_CRT} 2>/dev/null
 openssl x509 -noout -dates -text -in ${TMP_CRT} | egrep 'notBefore|notAfter'
 echo
done < ${LIST_FILE}

 

[root@t-node01 shell]# 

 

출처 : 불량펭귄 - http://blog.helperchoi.com


반응형

+ Recent posts