서버 관리를 위한 ssh 서버 보안세팅

/etc/ssh/sshd_config 파일


# $OpenBSD: sshd_config,v 1.48 2002/02/19 02:50:59 deraadt Exp $
# This is the sshd server system-wide configuration file. See sshd(8)
# for more information.

# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin

# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented. Uncommented options change a
# default value.

Port 22
- ssh가 사용할 기본 포트 지정
Allowusers kkamji2411 root (로그인 허락할 계정 써준다.)

Protocol 2
- openssh는 프로토콜 버전을 원하는 대로 선택할 수 있다. protocol 2로 설정에는
서버는 버전 2로만 작동하기 때문에 ssh1을 사용해 접속을 요청하는 클라이언트를
받아 들일 수 없다.
- protocol 1로 설정해서 가동시킬 경우에는 버전 2로를 사용하는 ssh2 사용자의 요청을
받아 들일 수 없다. 보안상 protocol 1 은 사용하지 않는다.


ListenAddress 0.0.0.0
- sshd 데몬이 귀를 기울일 주소이다. 0.0.0.0은 모든 곳을 말한다.

#ListenAddress ::

#HostKey for protocol version 1
HostKey /etc/ssh/ssh_host_key
- protocol 1.3과 1.5에 의해 사용되어지는 private RSA 호스트 키 값이 저정되어
있는 파일이다. 현재는 /etc/ssh/ssh_host_key에 저장되어 있다. pulick key는
/etc/ssh/ssh_host_key.pub이다.


#HostKeys for protocol version 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key

#Lifetime and size of ephemeral version 1 server key
KeyRegenerationInterval 3600
- 서버의 키는 한번 접속이 이루어진 뒤에 자동적으로 다시 만들어진다. 다시
만드는 목적은 나중에 호스트의 세션에 있는 키를 캡처해서 암호를 해독하거나
훔친 키를 사용하지 못하도록 하기 위함 위함이다. 값이 0이면 키는 다시
만들어지지 않는다. 기본값은 3600초이다.


ServerKeyBits 1024
- 서버 키의 비트수를 정의한다. 최소값은 512이고 디폴트 값은 768이다.

#Logging
#obsoletes QuietMode and FascistLogging
#SyslogFacility AUTH
- /etc/syslog.conf에서 정의한 로그 facility 코드이다. 가능한 값은 DAEMON, USER,
AUTH, LOCAL0, LOCAL1, LOCAL2, LOCAL3, LOCAL4, LOCAL5, LOCAL6, LOCAL7이다.
기본값은 AUTH이다.


SyslogFacility AUTH
LogLevel INFO

- 로그 레벌을 지정하는 것이다. 가능한 값은 QUIET, FATAL, ERROR, INFO, VERBOSE
그리고 DEBUGS이다.


#Authentication:

LoginGraceTime 600
- 유저가 로그인을 성공적으로 이루어지 않았을 때 이 시간 후에 서버가 연결을
끊는 시간이다. 값이 0이면 제한 시간이 없다. 기본값은 600초이다.


PermitRootLogin yes
==> 보안상 no로 해준다.
- root 로그인 허용여부를 결정하는 것이다. yes, no, without-password를 사용할
수 있다. 현재 yes로 되어 있기 때문에 직접 root로 접속이 가능하다. 이것을
허용하지 않으려면 no나 without-password로 바꾼다.


#StrictModes yes

RSAAuthentication yes
PubkeyAuthentication yes

#AuthorizedKeysFile .ssh/authorized_keys

#rhosts authentication should not be used
#rhosts authentication should not be used
RhostsAuthentication no
#Don't read the user's ~/.rhosts and ~/.shosts files
IgnoreRhosts yes
#For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
RhostsRSAAuthentication no
- rhost나 /etc/hosts.equiv파일이 있으면 이것을 사용해 인증한다. 이것은 보안상
별로 안좋은 방법이기 때문에 허용하지 않는다.


#similar for protocol version 2
HostbasedAuthentication no
#Change to yes if you don't trust ~/.ssh/known_hosts for
#RhostsRSAAuthentication and HostbasedAuthentication
IgnoreUserKnownHosts no

#To disable tunneled clear text passwords, change to no here!
#PasswordAuthentication yes
- 패스워드 인증을 허용한다. 이 옵션은 프로토콜 버전 1과 2 모두 적용된다.

PermitEmptyPasswords no
- 패스워드 인증을 할 때 서버가 비어있는 패스워드를 인정하는 것이다. 기본 값은 no이다.

#Change to no to disable s/key passwords
#
http://www.korea.iss.net/alertcon5.htm 참고
ChallengeResponseAuthentication no

#Kerberos options
#KerberosAuthentication automatically enabled if keyfile exists
#KerberosAuthentication yes
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes

#AFSTokenPassing automatically enabled if k_hasafs() is true
#AFSTokenPassing yes

#Kerberos TGT Passing only works with the AFS kaserver
#KerberosTgtPassing no

# Set this to 'yes' to enable PAM keyboard-interactive authentication
#Warning: enabling this may bypass the setting of 'PasswordAuthentication'
#PAMAuthenticationViaKbdInt yes

X11Forwarding no
- 원격에서 X11 포워딩을 허용하는 것이다. 이 옵션을 yes로 설정하면 xhost보다
안전한 방법으로 원격에 있는 X프로그램을 사용할 수 있다. yes로 설정 후 데몬
재가동을 하고 테스트해 보자.


#X11DisplayOffset 10
#X11UseLocalhost yes
#PrintMotd yes
#PrintLastLog yes
#KeepAlive yes
#UseLogin no
#MaxStartups 10
#no default banner path
#Banner /some/path
#VerifyReverseMapping no

#override default of no subsystems
Subsystem sftp /usr/libexec/openssh/sftp-server
- sftp는 프로토콜 버전 2에서 사용되는 것으로서 ssh와 같이 ftp의 보안을
강화하기 위해 사용되는 보안 ftp프로그램이다.
openssh를 설치하면 /usr/local/ssh/libexec/sftp-server파일이 설치된다.
이것은 sftp 서버용 프로그램이다. 클라이언트 sftp프로그램은 설치되지않는다.
따라서 서버로 일단 가동시키고 원도용 ssh클라이언트 프로그램이나
SSH2를 설치하면 sftp를 사용할 수 있다

* gdb란?
  Command line Debugging을 위해 사용되는 Debugger

* 기본 명령어
  - r : Run
  - b 함수이름 or b 줄번호 : Breakpoint
  - n : Next step
  - c : Continue
  - q : Quit


1. File System 별 용량 확인
     #df - h [path]

2. 각 폴더별 용량 확인
      #du -h --max-depth=1 [path]

3. mysqldump
     #mysqldump -u[사용자ID] -p[Password] [Dump할 Database이름] > [생성할 Dump 파일 이름]
     ex)#mysqldump -uroot -proot test_db > test_dump.sql

4. crontab
    #crontab {-e|-l|-r}
       -e : crontab 수정
       -l : crontab 리스트 보기
       -r : crontab 삭제

    # 형식
        m h d m w [사용자] [명령어]
        * : 모든 숫자를 의미
        - : 기간을 의미 ex) 7-24 (7일부터 24일까지)
        , : 각각 숫자를 의미 ex) 7,24 (7일과 24일)

   ex) 30 5 * * * root /root/backup.sh
         매일 새벽 5시 30분에 root의 권한으로 /root/backup.sh를 실행한다.



Introduction

Pseudo code (or Structured English) is used to specify program logic in a (somewhat) English like manner, that aims to be independent of any particular programming language. This simplifies program development by separating it into two main parts, logic design and coding. The use of pseudo code allows the programmer to focus on the logic of the program rather than implementation details such as how data is displayed Once the logic is developed, coding becomes the translation of the pseudo code into the required programming language.

Sequence

Assignment

Format

variable = expression

Examples

total = 0
y = x * x + z / 4 - 1
name = "Joan Smith"
validLength = True

Input

Format

Input variable, variable, ...

Examples

Input custName
Input distance, speed

Display

Format

Display value, value, ...

Examples

Display "Hello World"
Display totalPrice, taxPayable
Display "Customer Number: ", custNum, "Name: ", custName

Selection

If-Else

Format

IF condition THEN
   statement

   statement
   ...
ENDIF
 

IF condition THEN
   statement

   statement
   ...
ELSE
   statement

   statement
   ...
ENDIF
 

IF condition THEN
   statements

ELSE
   IF condition THEN
       statements

   ELSE
       IF condition THEN
           statements

       ELSE
          statements

       ENDIF
   ENDIF
ENDIF
 

IF condition THEN
   statements

ELSE IF condition THEN
   statements
ELSE IF condition THEN
   statements

ELSE
   statements

ENDIF

Note: the Else part is optional. Use it where required by the logic.

Examples

IF lineNumber > 50 THEN
   Display ""
   Display "Student Number", "Student Name"
   lineNumber = 0

ENDIF
 

IF monthNumber >= 1 AND monthNumber <= 12 THEN
   Display "valid month"

ELSE
   Display "invalid month"

   Display "Month must be between 1 and 12"
ENDIF
 

IF mark >= 80 THEN
   grade = "A"

   comment = "Excellent"
ELSE
   IF mark >= 70 THEN
       grade = "B"

   ELSE
       IF mark >= 60 THEN
           grade = "C"

       ELSE
           IF mark >= 50 THEN
               grade = "D"

           ELSE
               grade = "N"
               comment = "Poor"
           ENDIF
       ENDIF
   ENDIF
ENDIF
 

IF mark >= 80 THEN
   grade = "A"

   comment = "Excellent"
ELSE IF mark >= 70 THEN
   grade = "B"
ELSE IF mark >= 60 THEN
   grade = "C"

ELSE IF mark >= 50 THEN
   grade = "D"
ELSE
   grade = "N"
   comment = "Poor"
ENDIF

Iteration (Repetition)

For

Format

FOR counter = start-value to end-value DO
   statement
   statement
   ...
ENDFOR

Example

FOR x = 1 to 10 DO
   xSquared = x * x
   Display x, xSquared
ENDFOR

While

Format

WHILE condition DO
   statement
   statement
   ...
ENDWHILE

Example

count = 1
WHILE count <= 10 DO
   Display count
   Add 1 to count
ENDWHILE

Programs

Format

program-name()
   statement

   statement
   ...
STOP

Example

addTwoNumbers()
   Input number1, number2
   sum = number1 + number2
   Display sum
STOP 

Subprograms: Subroutines and Functions

Subroutines

Subroutines are also called procedures or void methods. Subroutines do not return a value.

Format - subroutine calls

subroutine-name()
subroutine-name(parameter, parameter, ...)

Examples - subroutine calls in a program

demoProgram()
    ...
   displayTenStars()

   displayAverage(count, total)
STOP

Format - subroutine declarations

subroutine-name()
   statement
   statement
   ...
EXIT

subroutine-name(parameter, parameter, ...)
   statement
   statement
   ...
EXIT

Examples - subroutine declarations

displayTenStars()
   FOR numStars = 1 to 10 DO
       Display "*"
   ENDFOR
   Display ""
EXIT

displayAverage(count, total)
   IF count > 0 THEN
       average = total / count
       Display average
   ELSE
       Display "Error, nothing to average"
   ENDIF
EXIT

Functions

Functions are also called non-void methods. Functions return a single value.

Format - function calls

function-name()
function-name(parameter, parameter, ...)

Examples - function calls in a program

demoProgram()
    ...
   month = inputMonth()

   IF oddNumber(month) THEN
       ...

   ENDIF
   volume = 4 /3 * PI * cube(radius)
   max = maximumNumber(a, b)
STOP

Format - function declarations

The following are called functions. They return a single value.

function-name()
   statement
   statement
   ...
RETURN with value

function-name(parameter, parameter, ...)
   statement
   statement
   ...
RETURN with value

Examples - function declarations

inputMonth()
   Input monthNumber
   WHILE monthNumber < 1 OR monthNumber > 12 DO
       Display "Error invalid month number"
       Input monthNumber
   ENDWHILE
RETURN with monthNumber

oddNumber(num)
   oddNumber = false
   IF num modulus 2 = 0 THEN
       oddNumber = true
   ENDIF
RETURN with oddNumber

cube(number)
   cube = number * number * number
RETURN with cube

maximumNumber (number1, number2)
   IF number1 >= number2 THEN
       maximumNumber = number1
   ELSE
       maximumNumber = number2
   ENDIF
RETURN with maximumNumber

Keywords

The following words have a special meaning in Pseudo Code (in this subject) and should only be used for the purposes described above.

AND, DO, ELSE, ENDIF, ENDFOR, ENDWHILE, EXIT, FOR, IF, NOT, OR, RETURN, STOP, THEN, TO, WHILE.

Other statements: Display, Input
Operators:  =, +, -, *, /, (), <, <=, >, >=, []

* Question (김현수)

조교형들이 올려주신 프로그램상에서는 pidx를 클래스내에서
 
TelPhoneBook() : pidx(0)            

위와 같이 변수를 함수처럼 사용한 부분이 있는데 int pidx = 0; 과 비교해서

어떤 차이가 있는지 그리고 위와같은 사용은 c에서는 본적이 없는데

약간의 문법적인 내용까지 알려주시면 감사하겠습니다...

그럼 수고하십시오~~~~^^;


* Answer (박성환)

저희 조교들도 이번기회에 정확히 배우고자

교수님께 직접 문의를 드렸습니다.

알고보니, 저희가 모르는 심오한 세계가 또 있더군요...

(정말, 배움의 길은 끝이 없나 봅니다... 에궁... 어려버~)

생성자에

class A
{
   C c;
   A(C c1) : c(c1)
  {
  }
}

을 A로 하고,

class B
{
  C c;
  B(C c1)
  {
     c = c1;
  }
}

을 B라고 하면, 실제로 엄청난 차이가 있었습니다.

머, 위의 예 보다는 멤버변수가 또 다른 Class일 때 특히 그런데요,

실제로 Compile을 하게 되면, A와 같은 경우에는 Machine Code가 확연히 줄어들게 됩니다.

즉 C라는 Class를 인자로 받아 대입하게 되면, B와 같은 경우에는

복사생성자가 호출이 됩니다.

실제로 C 객체가 생성이 된 뒤 B class의 C class부분에 복사생성자로 초기화가 진행됩니다. (Memory가 한번 더 할당이 된다는 걸 아시겠죠?)

하지만, A의 경우 A class의 생성자가 호출이 되면, A Class의 C Class부분은 곧바고 C Class의 생성자로 초기화를 하게 됩니다.
(Memory가 순수 A class 만큼 할당이 된다는 걸 아시겠죠?)

때문에 두 코드에는 심오한 차이가 존재했습니다.

위와 같은 경우에는 Memory에도 차이가 나겠지만,

중요한 것은 Machine Code의 양이 줄어든다는 것입니다.

복사생성자가 호출되지 않는 (기본 Type 등등) 경우에는 실제 Memory는 별 차이가 없게 되지만,

Machine Code는 차이가 나게 됩니다.



최근에는 Compiler가 급속한 성장을 하여 기본 type에는 큰 차이를 보이지 않습니다. Compiler에게 "-o" 옵션을 주면 최적화를 진행하게 되는데,

이때 기본 type같은 경우 B경우를 A와 같은 처리를 하여 Machine code를 알아서 줄여주는등, 알아서 변환을 하게 됩니다.



머, 사용하는 입장에서는 큰차이가 없지만, 중요하게 알아두시면 좋을 것 같네요.

왜? C class의 크기가 대용량의 크기를 가진다고 가정해 봅시다...

B와 같이 사용하면... 우리가 모르는 사이에... Program이 죽어버릴지둥...

@^-^@

이런 지식하나하나가 학원에서는 절대 배울 수 없는 지식이겠죠?

잘 알아두시길 바랍니다~

그리고, 현수에게 고맙네요~ 덕분에 좋은것을 알게 되어서~ 쌩유~

@^-^@

MFC에서 보면 아래와 같은 소스 코드가 있다.


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif // _DEBUG


이것에 대해 엄청난 궁금증이 있었지만 그려러니 하고 넘어갔었다.

그러던 중 우연치않게 이 용도를 알았다.

프로그래밍하던중 종료시에 "Detected memory leaks!" 이란 메시지를 우연찮게 발견했다.

아무래도 어디선가 new를 했다 delete 를 하지 못해 구천에서 떠도는 원혼의 소리 같은 필이팍! -_-;

하지만 어디서 나오는지 도저히 알 방법이 없었다.

힌트라도 주면 디버깅을 하겠지만 이건 뭐... 완존히... -_-;;

그래서 나름대로 사이트를 뒤적거리던중 ms 사이트에서 이걸 발견했다.

cpp 파일에다가 이걸 선언하면 (h에 하면 않된다.) 해결이 된다.


그렇다면 한번 예를 적겠다. 생성자에 아래와 같은 코드를 넣는다.

char *p = new char[4444];


물론 고의 적으로 delete p; 를 하지 않는다.


#define new DEBUG_NEW를 cpp 꼭대기에 선언하지 않았을 경우 디버그 모드로 실행하다

종료하면 디버깅창에 아래와 같은 메시지가 나온다. 몇번지에 몇 바이트까지 나온다.

원혼이 떠도는지는 알겠지만 원인은 모른다. ㅠㅠ


Detected memory leaks!
Dumping objects ->
{71} normal block at 0x00E1B748, 4444 bytes long.
Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.


#define new DEBUG_NEW를 해당 cpp 꼭대기에 선언한 경우는 종료시 아래와 같이 나온다.


Detected memory leaks!
Dumping objects ->
C:\어쩌고저쩌고\Test.cpp(172) : {71} normal block at 0x00E1B748, 4444 bytes long.
Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.


아! 얼마나 훌륭한가?

만약 선언되지 않은 cpp에 메모리 릭이 발생된다면 위치는 가르쳐 주지 않을것이다.

이제 원인을 아니까 성불 시킬수 있을것이다! (일본만화를 너무 많이 봤나? -_-)

모든 클래스의 사이즈를 외운다면 필요없겠지만.. 못외우는 분은 알고 있으면 좋을것 같다. ^^


이런 삽질을 반복하고 나서 이 코드의 의미를 알게 되었다.

이 덕분에 리소스 관리자의 버그를 찾아내었다. ^^;;

바꿔 말하면 버그 있는지 모르고 게임이 나올뻔했다. -_-;


ps... 이것은 어디까지나 MFC에 한해서 작동된다. 따라서


#ifdef _AFXDLL
#ifdef
_DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif // _DEBUG

#endif // _AFXDLL


라고 쓰는 것이 좋을 것이다.



알아낸곳은

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvissdk/html/vissdk.asp


좀더 자세한 정보가 있는곳을 찾았다.

http://www.michaelmoser.org/memory.htm

'도서관 I > MFC' 카테고리의 다른 글

[바람이] CCommanDialog Class  (0) 2005.09.26

* Bubble Sort

마치 거품방울이 뽀글뽀글 올라가는 모양과 비슷하다하여 붙어진 이름이다.
Bubble Sort는 두가지만 알고 있으면 된다.

1. 두가지 값을 비교
2. 두값을 swap함

백문이 불여일견이다.

// Bubble sort
void bubble_sort(int size , int* val)
{
     for (int i = 0 ; i < size - 1; i++)
    {
          for (int j = 0 ; j < size - 1 - i ; j++)
         {
              if (val[j] > val[j+1])
              {
                    int tmp = val[j];
                    val[j] = val[j+1];
                    val[j+1] = tmp;
              } 
         }
   }
}

예로 다음 배열을 Bubble Sort 해보이겠다.
{ 9 , 7 , 3 , 5 , 1 , 7 , 2 }

우선 첫 Loop에서의 모습을 보이겠다.
9 7 3 5 1 7 2
7 9 3 5 1 7 2
7 3 9 5 1 7 2
7 3 5 9 1 7 2
7 3 5 1 9 7 2
7 3 5 1 7 9 2
7 3 5 1 7 2 9

마치 왼쪽이 밑이고 오른쪽이 위라고 생각하면 9라는 값은 마치 거품방울이 올라가듯
뽀글뽀글 올라가는 것이 보인다 @^-^@

다음은 7 값이 올라가게 될것이다.

결국  1 2 3 5 7 7 9 로 정렬이 될 것이다.



* 장점
  1. 알고리즘이 간단하다.
2. 2중 Sorting이 간편하다. 즉, 학번순으로 정렬을 한뒤 같은 학번내에서 이름순의 정렬이
     가능해진다.

* 단점
  1. 성능이 O(n^2)으로 약간 느리다고 할 수 있다.


fatal error C1010 : unexpected end of file while looking for precompiled header directive


Visual Studio를 사용하면서 위와 같은 Error을 자주 접하게 된다.


이는 Visual C++ 컴파일러는 미리 컴파일된 해더(Precompiled Header)를 지원하고, 프로젝트 설정을 통해 대상 헤더를 지정할 수 있기 때문이다.


특히 MFC는 수정하지 않고 사용하는 헤더 수가 많기 때문에, 이 방식을 사용하면 매번 전체를 컴파일하지 않아 개발 속도가 빨라진다.





그런데 새로운 소스 파일을 추가하다 보면 다음과 같은 오류 메시지를 볼 수 있다.


fatal error C1010 : unexpected end of file while looking for precompiled header directive


이 오류 메시지는 미리 컴파일된 해더와 관련이 있으므로, 프로즈게트 설정에서 미리 컴파일된 헤더를 사용하지 않겠다고 설정하면 없앨 수 있다.


하지만 앞서 언급한 효율을 포기하는 것이므로 바람직하지는 않다.



project -> project Setting -> 좌측에서 원하는 .cpp 화일 선택 -> C/C++ 탭 선택 ->Category에서 precompiled Header 선택 -> Not using percompiled headers 선택



위와 같이 하게 되면 해당.cpp는 Precomplie 하지 않게 된다.


아니면, general 탭 에서 exclude file from build 를 체크해주면


빌드시에 아예 제외하게 된다.
메소드를 정의하기 위해서는 몇 가지 요소를 필요로 한다.


반드시 필요한 것은 리턴형과 메소드 이름이다.


나머지 접근자나 한정자 등은 선택적으로 사용한다.


접근자는 메소드의 접근 범위를 결정하며, 생략할 수 있다.


접근자가 생략되면 같은 패키지(디렉토리) 안에 있는


클래스나 객체로부터 접근을 허용하게 된다.


한정자는 특별한 제한이나 메소드의 특성을 결정하며, 역시 생략할 수 있다.


키워드는 다음과 같다.


1. static : 이 메소드는 객체 생성 없이 호출할 수 있는 메소드임을 의미한다.


보통 public 메소드로 정의되며 내부에 있는 인스턴스 변수를 이용할 수 없다.


2. final : 이 메소드는 클래스를 상속할 때 재정의할 수 없음을 의미한다.


3. native : 이 메소드는 C언어나 C++언어로 구현된 메소드임을 의미한다.


따라서, 이 메소드는 {}로 이루어진 몸체를 가지고 있지 않다.


4. synchronized : 이 메소드는 멀티스레드와 관련된 것으로 동시에


하나의 스레드만 호출할 수 있음을 의미한다.

+ Recent posts