[linux] Rsyslog 설정 , 추가 MySQL로 저장하는 법

Rsyslogd

 

시스템 로그를 기록하는 Rsyslog 데몬 동작에 대한 설명

 

참고.1 : # /sbin/rsyslogd -d  [디버깅 모드] 

참고.2 : 참고 문서 URL (http://www.rsyslog.com/doc)

 

Rsyslog 설정 파일 위치

 

/etc/rsyslog.conf

 

Mysql 을 사용하는 방법

yum install rsyslog-mysql 설치

설정을 다음과 같이 수정

$ModLoad ommysql.so

 ## mysql 라이브러리 모듈 로드

## DB 템플릿에 맞춰 넣어주는 센스 

$template dbFormat,”insert into SystemEvents (Message, Facility, FromHost, Priority, DeviceReportedTime, ReceivedAt, InfoUnitID, SysLogTag) values (‘%msg%’, %syslogfacility%, ‘%FROMHOST%’, %syslogpriority%, ‘%timereported:::date-mysql%’, ‘%timegenerated:::date-mysql%’, %iut%, ‘%syslogtag%’)”,SQL

*.* :ommysql:127.0.0.1,디비명,아디,비번;dbFormat

 

예시

포트 접근 허용이되어있어야한다.

$ModLoad ommysql.so

$template dbFormat,”insert into SystemEvents (Message, Facility, FromHost, Priority, DeviceReportedTime, ReceivedAt, InfoUnitID, SysLogTag) values (‘%msg%’, %syslogfacility%, ‘%FROMHOST%’, %syslogpriority%, ‘%timereported:::date-mysql%’, ‘%timegenerated:::date-mysql%’, %iut%, ‘%syslogtag%’)”,SQL

*.info;mail.none;authpriv.none;cron.none :ommysql:10.0.0.60,Syslog,root,tobicom;dbFormat

 

 

 

 

파일을 로드하는법

$ModLoad imfile

 $InputFileName /var/log/test.log

 $InputFileTag Sungho-Tag:

 $InputFileStateFile stat-Custom

 $InputFileSeverity info

 $InputRunFileMonitor

 

# Provides UDP syslog reception

#$ModLoad imudp

#$UDPServerRun 514

# Provides TCP syslog reception

#$ModLoad imtcp

#$InputTCPServerRun 514

*.* @@10.0.0.60:514

 골뱅이 하나면 UDP, 두개면 TCP

[powershell] IP 주소 받아오기, 짝수 홀수 아이피 가르기

Get-WmiObject Win32_NetworkAdapterConfiguration -Namespace “root\CIMV2” | where{$_.IPEnabled -eq “True”}

하고 나서, ip만 뽑을땐?

(Get-WmiObject Win32_NetworkAdapterConfiguration -Namespace “root\CIMV2” | where{$_.IPEnabled -eq “True”}).ipaddress[0]

 

또는

 

(gwmi -query “Select IPAddress From Win32_NetworkAdapterConfiguration Where IPEnabled =  True” | Select-Object IPaddress).ipaddress[0]

 

이렇게 하면 IPv4 아이피를 딸 수 있다 .

그럼 이걸 octet 별로 쪼개려면 이렇게 해보자.

 

$iptest=(gwmi -query “Select IPAddress From Win32_NetworkAdapterConfiguration Where IPEnabled =  True” | Select-Object IPaddress).ipaddress[0]

$ipoctet=$iptest -split “\.”

 

Echo $ $ipoctet[3]

-split 로 “.” 으로 나누면, 이렇게 하면 ip주소가 ” . ” 을 기준으로 4등분 되며 각각 $ipoctet[0] ~ $ipoctet[3] 으로 저장된다.

 

여기서 그럼, IP 맨 마지막 숫자가 홀수인경우와 짝수인 경우를 별도의 실행을 시켜주는 방법을 생각해보자

 

if (($ipoctet[3] %= 2) -ne 1)

    {echo “jjaksu”}

else

    {echo “holsu”}

;

 

이런식으로 IP의 마지막 octet의 숫자를 2로 나눈 나머지 값을 1이 아닌 경우 짝수, 1인경우는 홀수 라고 볼 수 있겟다.

이 스타일을 이용하여, 짝수 서버군과 홀수 서버군을 서로 다른 스타일 군으로 관리 할 수 있도록 구성에 적용할 수 도 있다.

 

[linux] Self Signed Certificate SSL

OpenSSL 에서 self signed certificate 생성 및 apache httpd 에 SSL 적용

웹서비스에 https 를 적용할 경우 SSL 인증서 발급 기관에서 유료로 해당 도메인에 대해 발급 받으면 되지만 테스트 서버거나 예산등의 이유로 발급 받지 못할 경우가 있다.

이럴때 OpenSSL 을 이용하여 Self signed certificate 를 생성 & apache httpd 에 연계하는 법을 정리해 본다

Self Signed Certificate 생성

Self Signed Certificate(SSC) 란 무엇일까?

digital certificate는 발급기관(CA) 이 있게 마련이다. Web Browser 마다 VeriSign 이나 comodo 같은 유명 CA 들의 인증서를 신뢰하는 CA로 미리 등록해 놓으므로 저런 기관에서 발급된 SSL 인증서를 사용해야 browser 에서는 웹서비스를 신뢰할수 있는데

SSC 는 인증서를 만들고 개인키로 직접 인증서에 서명한 것이다. 당연히 browser는 모르는 기관이 발급한 인증서이므로 보안 경고를 발생시킬 것이나 테스트 사용에는 지장이 없다.

CSR(Certificate Signing Request)?

공개키 기반(PKI) private key(개인키) public key(공개키)로 이루어져 있다. 인증서라고 하는 것은 내 공개키가 맞다고 인증기관(CA)이 전자서명하여 주는 것이며 나와 보안 통신을 하려는 당사자는 내 인증서를 구해서 그 안에 있는 공개키를 이용하여 보안 통신을 할 수 있다.

CSR 은 인증기관에 인증서 발급 요청을 하는 특별한 ASN.1 형식의 파일이며 그안에는 내 공개키 정보와 사용하는 알고리즘 정보등이 들어 있다. 개인키는 외부에 유출되면 안 되므로 저런 특별한 형식의 파일을 만들어서 인증기관에 전달하여 인증서를 발급 받는다.

(사용자들이 CSR 생성등을 어려워하니 인증서 발급 대행 기관에서 개인키까지 생성해서 보내주고는 한다.)

OpenSSL 

      1. RSA 기반의 private key 생성
        cd /etc/pki/tls/private
        openssl genrsa -des3 -out myhost.key 1024
      2. CSR(Certificate Signing Request) 생성
        custom_openssl.conf

[ req ]

default_bits            = 2048

default_md              = sha1

default_keyfile         = privkey.pem

distinguished_name      = req_distinguished_name

[req_distinguished_name ]

countryName                     = Country Name (2 letter code)

countryName_default             = KR

countryName_min                 = 2

countryName_max                 = 2

# 회사명 입력

organizationName              = Organization Name (eg, company)

organizationName_default      = University of Wisconsin — Madison

# 부서 입력

organizationalUnitName          = Organizational Unit Name (eg, section)

organizationalUnitName_default  = Condor Project

# SSL 서비스할 domain 명 입력

commonName                      = Common Name (eg, your name or your server’s hostname)

commonName_default             = myhost.co.kr

commonName_max                  = 64

openssl req -new -key myhost.key -out myhost.csr -config custom_openssl.conf

      1. Remove Passphrase from key
        개인키를 보호하기 위해 Key-Derived Function 으로 개인키 자체가 암호화되어 있다. 인터넷 뱅킹등에 사용되는 개인용 인증서는 당연히 저렇게 보호되어야 하지만 SSL 에 사용하려는 키가 암호가 걸려있으면 httpd 구동때마다 pass phrase 를 입력해야 하므로
        암호를 제거한다.

        cp myhost.key myhost.key.enc
        openssl rsa -in myhost.key.enc -out myhost.key

보안 경고

개인키의 유출 방지를 위해 group 과 other의 permission 을 모두 제거한다.

chmod 600 myhost.key

      1. self-signed certificate 생성시 입력할 custom_openssl.conf 생성
      2. self-signed 인증서 생성
        openssl x509 -req -days 365 -in myhost.csr -signkey myhost.key -out ../certs/myhost.crt
      3. 제대로 생성되었는지 확인을 위해 인증서의 정보를 출력해 본다.
        openssl x509 -text -in ../certs/myhost.crt 
      4.  msts

apache httpd 에 SSL 적용

      1.  vi /etc/httpd/conf.d/ssl.conf 
      2. 다음 내용 추가
        NameVirtualHost *:443 
      3. SSL 을 적용할 VirtualHost 를 설정한다.

<VirtualHost *:443>

ServerName myhost

SSLEngine on

SSLCertificateFile /etc/pki/tls/certs/myhost.crt

SSLCertificateKeyFile /etc/pki/tls/private/myhost.key

SetEnvIf User-Agent “.*MSIE.*” nokeepalive ssl-unclean-shutdown

CustomLog logs/ssl_request_log \

   “%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \”%r\” %b”

</VirtualHost>

      1. service httpd restart
      2. Web browser에서 https 로 연결해서 제대로 보이는지 확인한다.

    • Browser가 Host Header 를 보내야하나 SSL의 경우 Host Header를 보내기전 서버 인증서가 오므로
      SSL 에 대해서 Multiple VirtualHost 가 불가함.
    • 위 문제를 해결하기 위해서는 SNI(Server Name Indication – RFC 4366) 을 지원하는 SSL Library
      (OpenSSL 0.9.8j 이상, Java 7 JSSE 이상)와 
      Web Server(apache 경우 2.2.12 이상),
      Web Browser(IE7 이상, FF2 이상 등)를 사용해야 함.
    • Windows XP 는 SNI 를 지원하지 않으므로 IE 버전과 상관없이 에러 발생(관련 링크).

원본 위치 <http://lesstif.tistory.com/entry/OpenSSL-%EC%97%90%EC%84%9C-self-signed-certificate-%EC%83%9D%EC%84%B1-%EB%B0%8F-apache-httpd-%EC%97%90-SSL-%EC%A0%81%EC%9A%A9>

[기타] 루트 도메인 네임 서버 정보

Root DNS 13개인줄 아세용?

 

DNS 프로토콜의 응답 패킷인 UDP (사용자 데이터그램 프로토콜) 내 수용 가능한 서버 수의 최대치가 13대 이기때문에 전 세계에서 오직 13대의 대형 컴퓨터에만 루트 DNS가 존재합니다.

 

참고로, 미국은 10개, 2대는 노르웨이, 네덜란드, 아시아에선 유일하게 일본에 root DNS 가 있습니다.

 

 

UDP 수용 가능 서버 최대치가 13 일까요?

 

Root DNS 가 13대가 넘어가면 DNS 질의 시 사용되는 메시지 사이즈가 512바이트를 넘어가게 됩니다. DNS는 UDP를 사용하지만 512바이트를 넘어가면 TCP로 재 질의 하도록 되어 있습니다.

Root 에서부터 재 질의가 많이 일어나는 경우 부하로 인해 서비스에 영향을 주게 됩니다.

 

 

참고 :

 

[root@ip-10-28-74-156 gamesvr]# dig . ns

 

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.10.rc1.el6_3.2 <<>> . ns

;; global options: +cmd

;; Got answer:

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55690

;; flags: qr rd ra; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 0

 

;; QUESTION SECTION:

;.                              IN      NS

 

;; ANSWER SECTION: # ROOT DNS

.                       87243   IN      NS      e.root-servers.net.

.                       87243   IN      NS      f.root-servers.net.

.                       87243   IN      NS      g.root-servers.net.

.                       87243   IN      NS      h.root-servers.net.

.                       87243   IN      NS      i.root-servers.net.

.                       87243   IN      NS      j.root-servers.net.

.                       87243   IN      NS      k.root-servers.net.

.                       87243   IN      NS      l.root-servers.net.

.                       87243   IN      NS      m.root-servers.net.

.                       87243   IN      NS      a.root-servers.net.

.                       87243   IN      NS      b.root-servers.net.

.                       87243   IN      NS      c.root-servers.net.

.                       87243   IN      NS      d.root-servers.net.

 

;; Query time: 9 msec

;; SERVER: 172.16.0.23#53(172.16.0.23)

;; WHEN: Wed Jun  5 08:46:07 2013

;; MSG SIZE  rcvd: 228 # 욘석이 바로 메시지 사이즈

[기타] TCP 상태 관련 정리

 

 

TCP 연결상태

 

 

TCP 연결 단계 (RFC 793)

 

TCP A                                                                                              TCP B

  1. CLOSED                                            LISTEN
  2. SYN-SENT –> < SEQ=100>< CTL=SYN>                                   –>  SYN-RECEIVED
  3. ESTABLISHED <– < SEQ=300>< ACK=101>< CTL=SYN,ACK> <–    SYN-RECEIVED
  4. ESTABLISHED –> < SEQ=101>< ACK=301>< CTL=ACK> –>  ESTABLISHED
  5. ESTABLISHED –> < SEQ=101>< ACK=301>< CTL=ACK>< DATA> –>  ESTABLISHED

 

LISTEN       : 데몬이 요청을 발을 수 있도록 연결 요구를 기다리는 상태.

즉, http(80), mail(25), ftp(21), telnet(23) 등의 포트가 열려있음을 의미.

윈도우즈에서는 LISTENING으로 표시.

SYN_SENT : 로컬에서 원격으로 연결 요청(SYN 신호를 보냄)을 시도한 상태.

SYN_RECV : 원격으로 부터 연결 요청을 받은 상태.

요청을 받아 SYN+ACK 신호로 응답은 한 상태이지만 ACK는 받지 못했다.

netstat로 확인할 때 SYN_RECV가 아주 많다면 TCP SYN 플러딩(Flooding) 공격일 가능성이 있다.

윈도우즈와 솔라리스에서는 SYN_RECEIVED으로, FreeBSD는 SYN_RCVD으로 표시.

ESTABLISHED : 서로 연결이 되어 있는 상태

위에서 192.168.123.10의 포트 32794과 218.xxx.xx.xx의 포트 22(ssh)이 서로 연결되어 있는 상태.

 

TCP 종료 단계

* 정상적인 연결 종료 과정

TCP A                                                                                     TCP B

  1. ESTABLISHED ESTABLISHED
  2. (Close)

FIN-WAIT-1       –> <SEQ=100><ACK=300><CTL=FIN,ACK>  –>  CLOSE-WAIT

  1. FIN-WAIT-2 <–  <SEQ=300><ACK=101><CTL=ACK>       <–   CLOSE-WAIT
  2. (Close)

TIME-WAIT      <–  <SEQ=300><ACK=101><CTL=FIN,ACK>  <–    LAST-ACK

  1. IME-WAIT –> <SEQ=101><ACK=301><CTL=ACK>         –>  CLOSED
  2. (2 MSL)

CLOSED

 

FIN_WAIT1     : 소켓이 닫히고 연결이 종료되고 있는 상태. 원격의 응답은 받을 수 있다.

솔라리스에서는 FIN_WAIT_1로 표시.

FIN_WAIT2     : 로컬이 원격으로 부터 연결 종료 요구를 기다리는 상태.

솔라리스에서는 FIN_WAIT_2로 표시.

CLOSE_WAIT : 원격의 연결 요청을 받고 연결이 종료되기를 기다리는 상태 .

원격으로 부터 FIN+ACK 신호를 받고 ACK 신호를 원격에 보냈다.

TIME_WAIT    : 연결은 종료되었으나 원격의 수신 보장을 위해 기다리고 있는 상태.

이 상태를 특히 자주 보게되는 경우 => Apache에서 KeepAlive를 OFF로 해둔 경우, Tomcat 서버를 쓰는 경우 등.

LAST_ACK    : 연결은 종료되었고 승인을 기다리는 상태.

CLOSED       : 완전히 연결이 종료된 상태.

 

※ 위의 FIN_WAIT1, FIN_WAIT2, CLOSE_WAIT 3개 상태는

연결 종료를 위해 서로간에 신호를 주고받는 과정에 나타나는 상태로 이해하면 된다.

종료 요청을 한 곳에서는 FIN_WAIT1, FIN_WAIT2, TIME_WAIT 상태가,

종료 요청을 받는 곳에서는 CLOSE_WAIT, LAST_ACK 상태가 표시된다.

 

TIME_WAIT 상태 없애기

이미 발생한 TIME_WAIT 상태는 일정시간이 지나면 없어지지만,

client가 server에 매우 빈번히 connect/disconnect를 반복한다면

많은 TCP port가 TIME_WAIT 상태가 되서 문제가 생길 수 있음.

 

client application에서 socket option 중 linger option을 off 시키면,

client에 의한 connection close시 TIME_WAIT 상태를 거치지 않고

ClOSED 상태로 바뀌게 되므로, TIME_WAIT 상태가 발생하지 않게 됨.

 

/* 중략 */

int sock

struct linger   ling;

 

ling.l_onoff = 1;

ling.l_linger = 0;      /* 0 for abortive disconnect */

 

setsockopt(sock, SOL_SOCKET, SO_LINGER, &ling, sizeof(ling))

 

TCP 상태별 정의

ESTABLISHED

3단계 핸드쉐이킹 후 연결 성립

 

SYN_SENT

원격 호스트에 능동적인 개설 요청(능동적 열기)

 

SYN_RECV

네트워크 통한 연결요청 받음(수동적 열기)

 

FIN_WAIT1

능동적 닫기(active close) 요청을 한 상태

 

FIN_WAIT2

로컬에서 종결(FIN)세그먼트를 전송하였고 원격 시스템에서 이에 대한 확인메시지를 수신하였지만,

원격 애플리케이션이 작업을 종료하지 않아 원격 호스트의 종결 세그먼트를 기다리는 상태

 

TIME_WAIT

회선의 종결 절차가 완료되었지만 분실되었을지 모르는 느린 세그먼트를 위해

소켓을 열어 놓고 유지하고 있는 상태

 

CLOSED

회선이 종결되고 모든 자원을 해제한 상태

 

CLOSE_WAIT

수동적 닫기를 하고 있는 상태로 FIN 종결 세그먼트를 수신하고 이에 대한 확인 메시지를 전송한 상태

 

LAST_ACK

FIN 종결 요청을 받고 로컬에서도 회선 종결에 합의하여 종결을 요청(FIN)한 상태로

이에 대한 확인 메시지가 수신되면 회선이 종결됨

 

LISTEN

서버 애플리케이션에서 수동적 열기로 연결 요청을 기다리고 있는 상태

 

CLOSING

로컬 TCP는 FIN_WAIT_1에서 설명한대로 FIN 종결 세그먼트를 전송하였고,

LAST_ACK에서 설명한대로 원격 시스템의 종결 세그먼트도 수신하였지만,

FIN_WAIT_1 단계에서 전송한 세그먼트에 대한 확인 메시지(ACK)를 수신하지 못한 상태로

보통 확인 메시지가 전송 도중 분실되었다는 것을 나타냄

 

UNKOWN

소켓의 상태에 대해서 확인이 안되는 경우

[linux] 헷갈리기 쉬운 fstab 의 옵션 설정

# cat /etc/fstab

[파일시스템 장치명] [마운트 포인트] [파일시스템 종류] [옵션] [dump관련설정] [파일점검 옵션]

LABEL=/                         /                         ext3     defaults                  1 1

LABEL=/boot1                 /boot                    ext3     defaults                 1 2

tmpfs                             /dev/shm              tmpfs   defaults                 0 0

devpts                           /dev/pts                devpts  gid=5,mode=620      0 0

sysfs                             /sys                     sysfs   defaults                 0 0

proc                              /proc                     proc    defaults                 0 0

LABEL=SWAP-sda3         swap                    swap    defaults                0 0

-파일시스템 장치명 : 장치명을 지정

-마운트 포인트 : 장치가 연결된 마운트 지점

-파일시스템 종류 : 파티션이 사용하는 파일시스템 지정

-옵션 : 파일시스템의 속성을 설정하는 옵션

defaults (rw, nouser,auto,exec suid 속성을 모두 가지는 옵션)

auto : 부팅시 자동 마운트

noauto : 부팅시 자동마운트 안함

exec : 실행파일이 실행되는 것을 허용

no exec : 실행파일이 실행되는 것을 허용 안함

suid : setuid, setgid의 사용을 허용하는 옵션

nosuid : setuid, setgid의 사용을 거부

ro (read only) : 읽기 전용

rw (ead write) : 읽고 쓰기 가능

user : 일반 계정 사용자들도 마운트 할 수 있는 옵션

nouser : root만 mount 가능

usrquota : 일반 사용자 quota적용

grpquota : 그룹 quota 적용

-dump 관련 설정

0 : 덤프되지 않은 파일시스템

1 : 데이터 백업을 위해 dump가능

-파일점검 옵션

0 : 부팅시 fsck를 사용하지 않음

1 : 루트 파일시스템을 의미

2 : 루트 파일시스템 이외의 파일시스템을 의미

[aws] AWS CLI를 이용해서 EC2 정보 query 하기

# Security groups that contain 0.0.0.0/0 rules

aws ec2 describe-security-groups –filters Name=ip-permission.cidr,Values=0.0.0.0/0 –output=text | grep SECURITYGROUPS

# Security groups for ElasticSearch

aws ec2 describe-security-groups –filters Name=ip-permission.from-port,Values=9200 –output=text | grep SECURITYGROUPS

# Search last 10,000/1MB of CloudTrail logs for ‘AccessDenied’ (removed AWS account number from stream name)

aws logs get-log-events –log-group-name CloudTrail/DefaultLogGroup –log-stream-name 000000000000_CloudTrail_eu-west-1 | grep AccessDenied

# Get number of AWS API calls in time period (assumes a Cloudwatch Logs ‘catch-all’ filter and metric has been created against CloudTrail logs)

aws cloudwatch get-metric-statistics –namespace LogMetrics –metric-name AllApiCallsCount –period 60 –statistics Sum –start-time 2015-04-15T13:40:00 –end-time 2015-04-15T13:55:00

# Security groups with particular name

aws ec2 describe-security-groups –filters Name=group-name,Values=*external* –output=text | grep SECURITYGROUPS

# Instance IDs on known subnet ranges

aws ec2 describe-instances –filters Name=“private-ip-address”,Values=“10.100.1.*”,“10.100.2.*” –query “Reservations[*].Instances[*].InstanceId”

# Count instance types

aws ec2 describe-instances –query ‘Reservations[*].Instances[*].InstanceType’ –output=text | sort | uniq -c | sort -r

# ELB summaries

aws elb describe-load-balancers –query ‘LoadBalancerDescriptions[*].{Name:DNSName,Instances:Instances[*],SecurityGroups:SecurityGroups[*],Listeners:ListenerDescriptions[*].Listener.LoadBalancerPort}’

# Elastic IP summaries

aws ec2 describe-addresses –query “Addresses[*].{PublicIp:PublicIp,InstanceId:InstanceId}”

# Show scheduled events

aws ec2 describe-instance-status –filters Name=event.code,Values=instance-reboot,system-reboot,system-maintenance,instance-retirement,instance-stop –query “InstanceStatuses[*].{InstanceId:InstanceId,Event:[Events[*].Code,Events[*].NotBefore,Events[*].Description]}”

# Show last 10 security group ingress changes

aws cloudtrail lookup-events –lookup-attributes AttributeKey=EventName,AttributeValue=AuthorizeSecurityGroupIngress –max-results 10

# Show IDs and names of instances in specified subnets

aws ec2 describe-instances –filters Name=“subnet-id”,Values=“subnet-<id>”,“subnet-<id>” \

–query “Reservations[*].Instances[*].{InstanceId:InstanceId,SubnetId:SubnetId,Tags:[Tags[*].Value],PrivateIpAddress:PrivateIpAddress,\

PublicIpAddress:PublicIpAddress,SecurityGroupNames:[SecurityGroups[*].GroupName],SecurityGroupIds:[SecurityGroups[*].GroupId]}”

[linux] vsftp 를 이용한 FTP서버 구성

 

Yum install vsftpd

 

하고 나서

 

/etc/vsftp/vsfptd.conf

 

# anonymous 사용자의 접속 허용 여부, 즉 anonymous ftp (default = YES)

# 공개된 형태의 FTP 서버로 운영할 것이 아니라면 NO로 한다.

anonymous_enable=NO

# 로컬 계정 사용자의 접속 허용 여부 (default = NO)

local_enable=YES

 

# write 명령어 허용 여부 (defualt = NO)

write_enable=YES

# 로컬 계정 사용자용 umask (default = 077)

local_umask=022

 

# anonymous 사용자가 파일을 업로드 할 수 있는지 여부 (default = NO)

# anon_upload_enable=YES

# anonymous 사용자의 디렉토리 생성 허용 여부 (default = NO)

# anon_mkdir_write_enable=YES

 

# 파일 전송 로그를 남길 것인지 여부 (default = YES)

xferlog_enable=YES

# xferlog 표준 포맷으로 로그를 남길지 여부 (기본 설정파일은 YES)

# 아래에서 NO로 설정했을 때를 설명함

xferlog_std_format=YES

# 파일 전송 로그 파일명

xferlog_file=/var/log/vsftpd.log

 

# FTP 서버 접속할 때 로긴 메시지 (default = vsFTPd 버전번호)

# 한글 사용 가능

# ftpd_banner=Welcome to blah FTP service.

ftpd_banner=Welcome to Yeonjins FTP

 

# 사용자의 홈디렉토리를 벗어나지 못하도록 제한하기 위한 설정 (default=NO)

# 제한이 필요할 경우 YES로 바꾼 후 제한할 사용자 ID를 chroot_list_file= 에 설정한 파일에

# 지정한다.

# chroot_local_user= 설정과 관련이 있으니 ‘3. 문제 해결’을 꼭 읽어보라.

#

# chroot_list_enable=YES

# chroot_list_file=/etc/vsftpd.chroot_list

 

# ——————————————————————-

# 기본 설정 파일에는 없는 설정값으로 필요한 설정만 추가한다.

# ※ 중요한 설정은 굵은 글씨로 표시

# ——————————————————————-

 

# PAM 파일명을 지정 (설치할 때 /etc/pam.d/vsftpd명으로 복사함)

pam_service_name=vsftpd

 

# wtmp에 로그 남기기 (YES로 해야만 last 명령어로 접속 여부 확인 가능)

session_support=YES

 

# 사용자가 자신의 home directory를 벗어나지 못하도록 설정

chroot_local_user=YES

 

# 새로운 디렉토리에 들어갔을 때 뿌려줄 환경 메시지를 저장한 파일명

# message_file=.message

 

# xferlog 형식으로 log를 남기려면 (위에서 이미 YES로 했음)

# xferlog_std_format=NO

#

#   – xferlog 표준 포맷은 로긴, 디렉토리 생성등의 로그를 남기지 않음

#     그러나 vsftpd 스타일 로그는 이를 포함한 보다 상세한 로그를 남김

#   – vsftpd 스타일 로그 예

#

#   Sun Jul 12 01:38:32 2003 [pid 31200] CONNECT: Client “127.0.0.1”

#   Sun Jul 12 01:38:34 2003 [pid 31199] [truefeel] FAIL LOGIN: Client “127.0.0.1”

#   Sun Jul 12 01:38:38 2003 [pid 31199] [truefeel] OK LOGIN: Client “127.0.0.1”

#   Sun Jul 12 01:38:41 2003 [pid 31201] [truefeel] OK MKDIR: Client “127.0.0.1”, “/mp3”

#   Sun Jul 12 01:39:06 2003 [pid 31201] [truefeel] OK UPLOAD: Client “127.0.0.1”, “/델리

#   스파이스 5집 – [04]키치죠지의 검은 고양이.mp3”, 6855473 bytes, 3857.39Kbyte/sec

 

# 전송속도 제한 (0은 제한없음, 단위는 초당 bytes)

anon_max_rate=0

local_max_rate=0

trans_chunk_size=0

 

# 최대 접속 설정 (단 xinetd를 통하지 않고 standalone으로 동작할 때만 사용 가능)

# standalone을 위해서는 listen=YES 추가하고 별도로 vsftpd를 띄워야 함

#

# max_clients=최대 접속자 수, max_per_ip=IP당 접속 수

# max_clients=100

# max_per_ip=3

 

# Standalone 으로 운영할 때 listen=YES. 포트 변경을 원할 경우 listen_port 설정

# 디폴트 포트는 21번 포트이다.

listen=YES

# listen_port=21

 

#passive mod

pasv_enable=YES

pasv_min_port=50020

pasv_max_port=50020

 

 

이후에 방화벽 설정

 

/etc/sysconfig/iptables

# FTP

-A INPUT -m state –state NEW -m tcp -p tcp –dport 20 -j ACCEPT

-A INPUT -m state –state NEW -m tcp -p tcp –dport 21 -j ACCEPT

# FTP data transfer

-A INPUT -m state –state NEW -m tcp -p tcp –dport 50020 -j ACCEPT
해당 사항을 추가해준다. Passive 모드로 동작하게 설정을 올리고, 포트를 50020 로 잡아주었다.

[linux] lsof 사용

lsof  lisopen files 약자로 시스템에서 열린 파일 목록을 알려주고 사용하는 프로세스, 디바이스 정보, 파일의 종류등 상세한 정보를 출력해 준다.

리눅스와 유닉스는 추상화된 파일 시스템(VFS – Virtual File System) 사용하므로 일반 파일, 디렉터리, 네트워크 소켓, 라이브러리, 심볼릭 링크 등도 모두 파일로 처리되며 lsof 에서 상세한 정보를 확인할 있다.

 

유닉스마다 고유의 lsof 비슷한 용도의 명령어가 있지만 명령어와 옵션이 제각각이고 출력 정보가 상이하여 OS 바뀌면 사용하기가 힘들다.

lsof 리눅스, AIX, Solaris, FreeBSD, Mac OS X 종류에 상관없이 일관된 옵션과 출력 형식을 갖는 장점이 있다.

 

 

모든 열린 파일 출력 

옵션 없이 lsof 실행하면 모든 열린 파일 정보를 출력한다.

lsof

COMMAND    PID      USER   FD      TYPE             DEVICE SIZE/OFF       NODE NAME

init         1      root  cwd       DIR              253,0     4096          2 /

init         1      root  rtd       DIR              253,0     4096          2 /

init         1      root  txt       REG              253,0   150352       3932 /sbin/init

init         1      root  mem       REG              253,0    65928     784927 /lib64/libnss_files-2.12.so

init         1      root  DEL       REG              253,0              784911 /lib64/libc-2.12.so

init         1      root  DEL       REG              253,0              785325 /lib64/libgcc_s-4.4.7-20120601.so.1.#prelink#.YDRQV5

init         1      root  DEL       REG              253,0              784939 /lib64/librt-2.12.so

init         1      root  DEL       REG              253,0              784935 /lib64/libpthread-2.12.so.#prelink#.0jHMuJ

init         1      root  DEL       REG              253,0              785344 /lib64/libdbus-1.so.3.4.0.#prelink#.HCYJdq

init         1      root  mem       REG              253,0    39896     785047 /lib64/libnih-dbus.so.1.0.0

init         1      root  mem       REG              253,0   101920     785049 /lib64/libnih.so.1.0.0

init         1      root  DEL       REG              253,0              784904 /lib64/ld-2.12.so

init         1      root    0u      CHR                1,3      0t0       4160 /dev/null

init         1      root    1u      CHR                1,3      0t0       4160 /dev/null

init         1      root    2u      CHR                1,3      0t0       4160 /dev/null

init         1      root    3r     FIFO                0,8      0t0       8845 pipe

init         1      root    4w     FIFO                0,8      0t0       8845 pipe

init         1      root    5r      DIR               0,10        0          1 inotify

init         1      root    6r      DIR               0,10        0          1 inotify

init         1      root    7u     unix 0xffff880037504680      0t0       8846 socket

컬럼별 의미는 다음과 같다.

  1. COMMAND : 실행한 명령어
  2. PID : process id
  3. USER : 실행한 사용자
  4. FD: File Descriptor, 파일의 종류
  1. cwd: current working directory
  2. rtd: root directory
  3. mem : memory-mapped file
  4. txt: program text (code and data);
  5. TYPE: 파일 종류
  1. DIR: 디렉터리
  2. CHR:  character special file
  3. REG: regular file
  4. unix: 유닉스 도메인 소켓 (MySQL 등이 사용하는 소켓으로 로컬 프로세스에서만 사용 가능하며 TCP/UDP 보다 속도가 매우 빠름)
  5. DEVICE : 장치 번호
  6. SIZE/OFF: 파일의 크기나 오프셋
  7. NODE: 노드 번호
  8. NAME:  파일명

 

특정 사용자의 열린 파일 출력 

-u 옵션으로 사용자를 지정할 있다.

lsof -u lesstif

COMMAND  PID    USER   FD   TYPE             DEVICE SIZE/OFF    NODE NAME

sshd    7320 lesstif  cwd    DIR              253,0     4096       2 /

sshd    7320 lesstif  rtd    DIR              253,0     4096       2 /

sshd    7320 lesstif  txt    REG              253,0   546680  931362 /usr/sbin/sshd

sshd    7320 lesstif  DEL    REG                0,4            22174 /dev/zero

sshd    7320 lesstif  mem    REG              253,0    18592  785075 /lib64/security/pam_limits.so

sshd    7320 lesstif  mem    REG              253,0    10224  785073 /lib64/security/pam_keyinit.so

sshd    7320 lesstif  mem    REG              253,0    10240  785078 /lib64/security/pam_loginuid.so

sshd    7320 lesstif  mem    REG              253,0    18664  785090 /lib64/security/pam_selinux.so

sshd    7320 lesstif  mem    REG              253,0    41088  925568 /usr/lib64/libcrack.so.2.8.1

sshd    7320 lesstif  mem    REG              253,0    14432  785059 /lib64/security/pam_cracklib.so

 

특정 포트를 사용하는 프로세스 정보 보기

개인적으로 가장 많이 쓰는 명령어이다. -i 옵션뒤에 프로토콜과 포트를 명시해 주면 된다. 다음은 TCP 22 포트(ssh) 쓰는 프로세스의 정보를 출력한다.

lsof -i TCP:22

COMMAND  PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

sshd    1550    root    3u  IPv4  13931      0t0  TCP *:ssh (LISTEN)

sshd    1550    root    4u  IPv6  13933      0t0  TCP *:ssh (LISTEN)

sshd    1895    root    3r  IPv4  15005      0t0  TCP 192.168.152.131:ssh->192.168.152.1:55859 (ESTABLISHED)

sshd    7316    root    3r  IPv4  22126      0t0  TCP 192.168.152.131:ssh->192.168.152.1:57127 (ESTABLISHED)

sshd    7320 lesstif    3u  IPv4  22126      0t0  TCP 192.168.152.131:ssh->192.168.152.1:57127 (ESTABLISHED)

sshd    7474    root    3r  IPv4  22763      0t0  TCP 192.168.152.131:ssh->192.168.152.1:57197 (ESTABLISHED)

특정 명령어가 사용하는 포트

apache httpd 같은 경우 fork 하여 여러 개의 프로세스가 뜨게 된다. -c 옵션과 httpd 주면 httpd 오픈한 파일 정보를 출력한다.

lsof -c httpd

특정 파일을 사용하는 프로세스 보기

특정 파일을 사용하고 있는 프로세스의 자세한 정보를 있다. 옵션 없이 파일의 경로를 지정하면 된다.

lsof /var/log/httpd/access_log

 

특정 디렉터리내 열린 파일 보기

특정 디렉터리 하위의 열린 파일을 표시하고 싶은 경우가 있다. +D 옵션 뒤에 디렉터리 경로를 명시하면 된다. 아래는 /tmp 디렉터리 밑에 열린 파일을 표시한다.

lsof +D /tmp

 

포트 범위 지정

TCP 포트 22 에서 80 까지 출력

lsof -i TCP:22-80

COMMAND  PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

master  1349    root   12u  IPv4  12888      0t0  TCP localhost:smtp (LISTEN)

master  1349    root   13u  IPv6  12890      0t0  TCP localhost:smtp (LISTEN)

sshd    1550    root    3u  IPv4  13931      0t0  TCP *:ssh (LISTEN)

sshd    1550    root    4u  IPv6  13933      0t0  TCP *:ssh (LISTEN)

sshd    1895    root    3r  IPv4  15005      0t0  TCP 192.168.152.131:ssh->192.168.152.1:55859 (ESTABLISHED)

sshd    7316    root    3r  IPv4  22126      0t0  TCP 192.168.152.131:ssh->192.168.152.1:57127 (ESTABLISHED)

sshd    7320 lesstif    3u  IPv4  22126      0t0  TCP 192.168.152.131:ssh->192.168.152.1:57127 (ESTABLISHED)

httpd   7400    root    4u  IPv6  22492      0t0  TCP *:http (LISTEN)

httpd   7402  apache    4u  IPv6  22492      0t0  TCP *:http (LISTEN)

httpd   7403  apache    4u  IPv6  22492      0t0  TCP *:http (LISTEN)

httpd   7404  apache    4u  IPv6  22492      0t0  TCP *:http (LISTEN)

httpd   7405  apache    4u  IPv6  22492      0t0  TCP *:http (LISTEN)

httpd   7406  apache    4u  IPv6  22492      0t0  TCP *:http (LISTEN)

httpd   7407  apache    4u  IPv6  22492      0t0  TCP *:http (LISTEN)

httpd   7408  apache    4u  IPv6  22492      0t0  TCP *:http (LISTEN)

httpd   7409  apache    4u  IPv6  22492      0t0  TCP *:http (LISTEN)

sshd    7474    root    3r  IPv4  22763      0t0  TCP 192.168.152.131:ssh->192.168.152.1:57197 (ESTABLISHED)

 

IPv4 또는 IPv6 포트만 표시

-i 옵션 뒤에 4(IPv4), 또는 6(IPV6) 지정하여 특정 IP 버전만 확인할 있다./

lsof -i 4

COMMAND    PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

rpcbind   1068     rpc    6u  IPv4  11858      0t0  UDP *:sunrpc 

rpcbind   1068     rpc    7u  IPv4  11860      0t0  UDP *:819 

rpcbind   1068     rpc    8u  IPv4  11861      0t0  TCP *:sunrpc (LISTEN)

rpc.statd 1086 rpcuser    5r  IPv4  11949      0t0  UDP *:838 

rpc.statd 1086 rpcuser    8u  IPv4  11955      0t0  UDP *:47492 

rpc.statd 1086 rpcuser    9u  IPv4  11959      0t0  TCP *:38374 (LISTEN)

cupsd     1159    root    7u  IPv4  12195      0t0  TCP localhost:ipp (LISTEN)

 

특정 사용자 제외

사용자 지정 옵션인 -u ^ 추가하면 특정 사용자는 제외할 있다. 다음은 lesstif root 사용자가 열은 파일은 제외하고 정보를 출력한다.

lsof -u^lesstif -u ^root

 

열린 모든 네트워크 포트 표시

모든 네트워크 포트를 표시한다. -i 뒤에 프로토콜을 명시하면 해당 프로토콜 관련 포트만 표시한다.

## 모든 포트

lsof -i

## TCP

lsof -i TCP 

## UDP

lsof -i UDP

특정 프로세스가 오픈한 파일 표시

특정 프로세스가 오픈한 파일만 표시한다. -p(소문자) 옵션뒤에 PID  주면 된다.

lsof -p 123

 

특정 사용자가 오픈한 모든 프로세스 중지

-t 옵션은 자세한 정보를 출력하지 않고 pid 정보만 출력한다. 다음 명령은 lesstif 사용자로 구동한 프로세스의 id 리턴한다.

lsof -t -u lesstif

13324

이를 응용하여 kill 명령어에 pid 전달할 있으므로 아래와 같이 사용하면 lesstif 사용자의 모든 프로세스를 중지하게 된다.

kill -KILL `lsof -t -u lesstif`

 

Ref

[linux] 다수 서버 호스트명 수정하기 – bash

자체적으로, ReserveDNS 를 운영하면서 질의 하면 더욱 좋겠지만 그렇지 못한 경우를 위해서 다음과 같이

호스트 파일을 일괄 수정한다.

 

 

Java 등에서 inetaddress.getbyname  또는

InetAddress[] ipAddress = DNSNameService.lookupAllHostAddr(“hostName”);

등을 사용하는 경우 호스트명을 통해서 아이피를 가져오게 됨

 

이럴때 일일히 서버에서 등록하지 말고 매니지먼트 서버에서 아래와 같이 쉘을 하나 만들어서 원격지 배쉬로 실행시켜서 적용하면 좋다.

 

쉘스크립트 작성..

#!/bin/bash

a=(`hostname`)

b=`ifconfig eth0 | grep 10.11 | cut -d ‘:’ -f2 | cut -d ‘ ‘ -f1`

echo -e “$b $a” >> /etc/hosts

 

이렇게 작성한 쉘을 아래와 같이 원격지에 뿌려줌. (remotehost.txt 에 대상이 되는 서버를 미리 등록해놓자~)

for i in $(cat remotehost.txt ); do ssh $i ‘/bin/bash -s’ < myname.sh  ;done