1. ls –l로 /usr/bin/passwd 파일 속성보기 

ls -l로 /usr/bin/passwd 파일의 속성을 보면 사용자는 모든 권한, 그룹과 기타사용자는 읽기와 실행 권한이 있음을 알 수 있다.

현재 /usr/bin/passwd는 setuid가 설정되어 있음을 확인할 수 있다.

( 이 때 소문자 s는 setuid와 실행권한이 둘 다 있음을 의미한다. )

 

 2. 일반 사용자로 passwd 명령어 실행 

일반 사용자로 passwd 명령어를 실행시키면 passwd 변경이 가능하다.

이 때 /etc/passwd로 접근하여 비밀번호를 변경하고 setuid의 퍼미션으로 root 권한으로 실행이 된다.

따라서 /etc/passwd 파일이 root 소유임에도 불구하고 일반 사용자가 변경 가능하다.

 

 3. /usr/bin/passwd 의 setuid 권한을 제거한다. 

수정을 할 때는 root계정만 변경이 가능하므로 root계정으로 들어간다.

chmod를 이용하여 /usr/bin/passwd 파일 사용자의 setuid 권한을 제거하는 명령을 입력한다.

 

ls -l로 파일의 속성을 확인해보면 setuid 권한이 제거된 것을 확인할 수 있다.

 

 4. 일반 사용자로 passwd 명령어 실행한다. 

일반 사용자로 swing 계정에 들어가서 passwd 명령어를 실행하면 허가 거부 오류가 난다.

 

 

'2020-1 STUDY > Linux Study' 카테고리의 다른 글

Linux Study Week 2 - 4  (0) 2020.05.18
Linux Study Week 2 - 3  (0) 2020.05.18
Linux Study Week 2 - 1  (0) 2020.05.18
Linux Study Week 1 - 4  (0) 2020.04.13
Linux Study Week 1 - 3  (0) 2020.04.13

 < 파일의 접근권한 > 

1. 파일이 속한 그룹 명령어 groups

- 사용자명 없으면 자신이 속한 그룹 이름 출력

- 사용자명 있으면 입력한 사용자가 속한 그룹 이름 출력

 

2. ls -l 결과

- 파일 종류

         - : 일반 파일
         d : 디렉토리 파일
         l : 심볼릭 링크파일
         b : 블록장치 특수파일
         c : 문자장치 특수파일
         s : 통신에 사용되는 특수파일
         p : 소켓, 네트워크 통신에 사용되는 특수파일

- 위의 실습 예제

               l    rwxrwxrwx            1                root                   root                   7              4월     9     13:31            bin  
 파일종류 파일접근권한  하드링크수 파일소유자ID 파일이속한그룹 파일크기 마지막으로 수정된 시간 파일이름

 

 < 실습1 > 

1. 홈디렉토리 밑에 study 디렉토리 만들고, 그 안에 test 파일 vi로 만들기 (파일 내용은 echo “Hello world”)

mkdir을 이용하여 study 디렉토리를 만든다.

vi로 test파일을 만들고 그 안에 파일 내용을 입력한다.

cat명령어를 이용하여 test파일을 보면 vi에 입력했던 파일 내용을 볼 수 있다.

 

2. ls –l 로 파일 속성 확인

ls -l로 파일 속성을 확인한다.

현재 test 파일은 일반 파일로 소유자는 읽기와 쓰기가 허가되어 있고 그룹과 기타사용자는 읽기만 허가된 상태이다.


3. chmod 로 권한 변경하기

1)test파일 소유자의 권한에 읽기,쓰기 추가

chmod로 소유자에게 읽기, 쓰기 권한을 추가한 것을 볼 수 있다.


2) 그룹과 기타 사용자에게 쓰기권한 추가

그룹과 기타 사용자는 읽기 권한만 있었는데 chmod로 쓰기 권한을 추가한 것을 볼 수 있다.

( 여러 사용자에게 같은 권한을 추가하는 것은 가능하다. )


3) 모든 권한 제거

chmod로 모든 사용자의 허가권을 제거하여 ----------로 나타나는 것을 볼 수 있다.


4) 소유자에게 읽기,실행권한만 지정

chmod로 소유자에게 읽기, 실행권한만 지정한 것을 볼 수 있다.

( 같은 사용자에게 여러 권한을 지정하는 것은 가능하다. )


5) test 실행


6) 그룹에겐 읽기권한을, 기타에게 쓰기권한만 주고 싶다. 한 번에 될까?

→ chmod는 하나씩밖에 사용을 못하기 때문에 한 번에 안된다.

 

 < 실습2 > 

1. chmod 646 test

8진수 646을 2진수로 변환하면 110 100 110이다.

따라서 소유자와 기타 사용자는 읽기와 쓰기 권한이 있고 그룹은 읽기 권한만 있음을 확인할 수 있다.


2. chmod 450 test

8진수 450을 2진수로 변환하면 100 101 000이다.

따라서 소유자는 읽기 권한, 그룹은 읽기와 실행 권한, 기타 사용자는 아무 권한이 없음을 확인할 수 있다.


3. chmod 777 test

8진수 777을 2진수로 변환하면 111 111 111이다.

따라서 모든 사용자가 읽기, 쓰기, 실행 권한이 모두 있음을 확인할 수 있다.


4. chmod 000 test

8진수 000을 2진수로 변환하면 000 000 000이다.

따라서 모든 사용자가 읽기, 쓰기, 실행 권한이 모두 없음을 확인할 수 있다.


5. 소유자에겐 읽기와 실행권한을, 그룹에겐 읽기권한을, 기타에게 쓰기권한만 주고 싶다. 한 번에 될까?

→ chmod는 하나씩밖에 사용을 못하기 때문에 한 번에 안된다.

 

 < 실습3 > 

1. swing 계정으로 /home/swing 디렉토리 접근 권한을 700으로 수정
→ apple 계정으로 접근
→ apple계정으로 cd ls 될까?

8진수 700은 2진수로 111 000 000이다.

cd와 ls를 하려면 기타 사용자에게 쓰기 권한을 부여해야한다.

현재 기타 사용자는 쓰기 권한이 없으므로 허가 거부 오류가 난다.


2. apple계정으로 /home/swing 디렉토리 접근권한으로 711로 수정
→ apple 계정으로 cd ls 될까?

기타 사용자는 수정권한이 없으므로 허가 거부 오류가 뜬다. ( 수정권한은 root에만 있음 )

8진수 711은 2진수로 111 001 001이다.

cd와 ls를 하려면 사용자에게 쓰기 권한을 부여해야한다.

현재 기타 사용자는 쓰기 권한이 없으므로 허가 거부 오류가 난다.


3. swing 계정으로 /home/swing 디렉토리 접근권한으로 744로 수정
→ apple 계정으로 cd ls 될까?

8진수 744은 2진수로 111 100 100이다.

cd와 ls를 하려면 사용자에게 쓰기 권한을 부여해야한다.

현재 기타 사용자는 쓰기 권한이 없으므로 허가 거부 오류가 난다.

 < setuid > 

1. /usr/bin/passwd

패스워드를 변경하는 명령어 실행파일로 /etc/passwd로 접근하여 비밀번호를 변경한다.

 

2. /etc/passwd

패스워드 보관 파일로 수정은 root만 변경 가능하다.

 

3. setuid 설정

1) setuid 파일 만들기

touch를 이용하여 setuid 파일을 만든다.

 

2) chmol로 setuid 설정해주기

- 기호를 이용한 파일접근권한

기호를 이용하여 권한을 부여한다. 소유자에게 setuid 권한이 추가된 것을 볼 수 있다.

대문자 S는 setuid 권한만 있고 실행권한은 없는 것을 의미한다.

 

- 숫자를 이용한 파일접근권한

숫자를 이용하여 권한을 부여한다. 소유자에게 setuid 권한이 추가된 것을 볼 수 있다.

소문자 s는 setuid 권한과 실행권한이 둘 다 있는 것을 의미한다.

'2020-1 STUDY > Linux Study' 카테고리의 다른 글

Linux Study Week 2 - 3  (0) 2020.05.18
Linux Study Week 2 - 2  (0) 2020.05.18
Linux Study Week 1 - 4  (0) 2020.04.13
Linux Study Week 1 - 3  (0) 2020.04.13
Linux Study Week 1 - 2  (0) 2020.04.13

1) ctrl + alt + F7에서 adduser로 id는 swing, pw는 swing인 계정을 생성한다.

 

 

adduser을 이용하여 swing이라는 계정을 생성한다.

※ 이 때, 현재 계정에서 다른 계정의 권한을 잠깐 빌리기 위해 sudo 명령어를 이용한다.

 

 

2) ctrl + alt + F1에서 swing으로 로그인하여, apple 계정을 생성한다.(adduser)

 

 

ctrl + alt + F1을 이용하여 tty1으로 접속 후 앞에서 만든 swing 계정으로 로그인한 후 adduser을 이용하여 apple 계정을 생성한다.

(※ 마찬가지로 sudo 명령어 이용)

 

3) w, who, whoami, who am I 결과는?

 

 

w, who, whoami, who am i의 결과는 위와 같다.

 

4) su apple하여 pwd, w, who, whoami, who am I 결과확인

 

 

apple 계정에서의 pwd, w, who, whoami, who am i의 결과는 위와 같다.

 

※ (과제수정) 처음 과제 시 su - apple이라고 입력했었는데 su apple과 어떻게 다른지 보자.

 

 

su apple을 이용했더니 루트 계정으로 되어있음을 알 수 있다.

 

su[-][사용자명] : 사용자 계정 변경

                         : 옵션을 지정하지 않으면 root 계정으로 변경되고 사용자명을 지정하면 지정한 사용자로 변경된다.

※ [-] : 루트 혹은 사용자의 초기화 파일을 실행하고 작업디렉토리도 사용자의 홈디렉토리로 변경된다.

 

5) exit 하고 sudo su 하여 pwd, w, who, whoami, who am I 결과확인  

 + /etc/shadow파일을 볼 수 있는가?

 

 

sudo su로 루트 계정으로 이동한 후 pwd, w, who, whoami, who am i의 결과는 위와 같다.

 

 

sudo cat /etc/shadow를 입력하면 위와 같이 파일 출력이 가능하다.

 

6) su – apple 하여 apple 계정으로 /etc/shadow파일을 보고 싶다 어떻게 해야 할까?

 

 

su - root를 입력하여 root 계정으로 이동한 후 visudo -f/etc/sudoers를 이용하여 사용자 계정 권한에 apple을 추가해준다.

 

 

위와 같이 sudo cat /etc/shadow를 입력하면 파일을 출력할 수 있다.

 

7) su – apple 상태 그대로 두고, tty7으로 변경해서, w, who, whoami, who am I의 결과를 비교한다.

 

tty1

 

tty7

 

 

'2020-1 STUDY > Linux Study' 카테고리의 다른 글

Linux Study Week 2 - 2  (0) 2020.05.18
Linux Study Week 2 - 1  (0) 2020.05.18
Linux Study Week 1 - 3  (0) 2020.04.13
Linux Study Week 1 - 2  (0) 2020.04.13
Linux Study Week 1 - 1  (0) 2020.04.13

1. adduser 명령어로, this 라는 계정을 추가로 만들어본다.

 

 

2. su 명령어로 사용자계정을 this로 변경한다.

 

 

3. /etc/passwd에 this 계정이 추가 되었는지 확인해본다.

 

 

cat을 이용하여 파일 내용을 출력한다.

맨 아래 this 계정이 추가된 것을 확인할 수 있다.

 

4. /etc/shadow파일을 확인해본다. ( 파일 내용을 확인할 수 있어야 함)

 

 

위와 같이 this는 sudoers 설정 파일에 없다는 오류가 발생한다.

※ sudoers : sudo 명령어에 대한 설정을 다루는 파일

※ visudo -f /etc/sudoers 라는 명령어를 사용하여 수정한다.

    (vi: 읽기 전용 파일, visudo : 수정 후 저장 시 sudoers 설정에 대한 문법까지 체크해준다.)

 

 

this      ALL=(ALL:ALL) ALL을 입력하여 수정해준다.

 

 

위와 같이 출력되는 것을 확인할 수 있다.

 

5. passwd 명령어로 this계정의 비밀번호를 바꾼다.

 

 

6. 다시 /etc/shadow 파일 내용을 확인해본다.

 

 

7. 다시 원래 계정으로 돌아간다

 

 

 

 

※ (과제수정) /etc/passwd와 /etc/shadow

 

(1) /etc/passwd 파일 구조

 

       ①     ②  ③ ④      ⑤             ⑥                 ⑦

 

① 사용자 계정

 

② 사용자 패스워드

    (x 문자가 들어 있고 암호화된 패스워드 정보는 /etc/shadow 파일에 저장된다.)

 

③ 사용자 ID

    (루트일 경우 0이다.)

    (adduser 스크립트에 의해 부여된다.)

 

④ 사용자가 속한 그룹 ID

     (루트일 경우 0이다.)

     (보통 그룹 ID와 사용자 ID는 같다.)

 

⑤ 사용자의 코멘트 정보

 

⑥ 사용자의 홈 디렉토리

 

⑦ 사용자가 기본으로 사용하는 쉘 종류 지정

 

 

(2) /etc/shadow 파일 구조

 

      ①                        ②                            ③       ④      ⑤     ⑥ ⑦ ⑧ ⑨

 

① 사용자 계정

 

② 사용자 패스워드를 암호화시킨 값

    (사용자 패스워드는 salt값을 이용하여 암호화한다.)

    ※ salt : 패스워드를 암호화하는데 있어서 OS 내에서 생성하는 임의의 값 

    (비어있는 경우(::)는 로그인하는데 패스워드가 필요없다는 것을 나타낸다.)

    (*라고 되어 있는 경우(:*:) 그 계정은 막아두었다는 것을 나타낸다.)

 

③ 1970년 1월 1일부터 패스워드가 수정된 날짜의 일수를 계산한 값

 

④ 패스워드가 변경되기 전 최소사용기간(일수)

    (0이면 패스워드를 언제든지 변경할 수 있다는 의미이다.)

 

⑤ 패스워드가 변경되기 전 최대사용기간(일수)

    (99999는 오랫동안 패스워드를 바꾸지 않았다는 것을 나타낸다.)

 

⑥ 패스워드 사용 만기일 전에 경고 메시지를 제공하는 일수

 

⑦ 로그인 접속차단 일수

 

⑧ 로그인 사용을 금지하는 일수(월/일/연도)

 

⑨ 예약 필드로 사용되지 않음

 

'2020-1 STUDY > Linux Study' 카테고리의 다른 글

Linux Study Week 2 - 2  (0) 2020.05.18
Linux Study Week 2 - 1  (0) 2020.05.18
Linux Study Week 1 - 4  (0) 2020.04.13
Linux Study Week 1 - 2  (0) 2020.04.13
Linux Study Week 1 - 1  (0) 2020.04.13

  <  문자열 함수  >  

 

(1) strcpy : 문자열 복사

                  * 받을 문자열이 복사할 문자열보다 짧으면 에러 발생  

                  * 문자열 끝(='\0')까지 복사

              - strcpy(받을 문자열, 복사할 문자열)

 

    strncpy : 문자열 n만큼 복사

               - strncpy(받을 문자열, 복사할 문자열, 문자 개수)

 

    strcpy_s : 문자열 최대 길이만큼 복사

                    * 최대 길이가 복사할 문자열보다 짧으면 에러 발생

                - strcpy(받을 문자열, 최대 길이, 복사할 문자열)

 

 

 

 

(2) strlen : 문자열 길이

                 ※ 문자열이 NULL문자를 만나기 전까지의 길이 측정 

              - strlen(문자열)

 

 

 

 

(3) strchr : 문자열 찾기

                 ※ 주소값 반환 시 (int)strchr

             - strchr(문자열, 찾을 문자)

 

             - strrchr(문자열, 찾을 문자)

                    ※ 문자열에서 찾을 문자를 뒤에서부터 찾는다.

 

 

※ hex : 16진수

 

 

 

 

(4) strcat : 문자열 연결

                 ※ 받을 문자열 뒤에 덧붙일 문자열을 덧붙인다.

             - strcat(받을 문자열, 덧붙일 문자열)

 

             - strcat_s(받을 문자열, 최대 길이, 덧붙일 문자열)

                 ※ 받을 문자열과 덧붙일 문자열의 합이 최대 길이보다 크다면 에러가 발생한다.

 

 

 

 

(5) strcmp : 문자 크기 비교

               - strcmp(문자열1, 문자열2)

                   ※ 문자열 1이 크면 1, 같으면 0, 작으면 -1을 출력한다.

 

 

 

 

(6) strstr : 문자열 검색

               ※ 주소값 반환 시 (int)strstr

            - strstr(문자열, 찾을 문자열) 

 

 

 

 

 

(7) strtok : 문자열 자르기

             - strtok(문자열, 분리할 문자열)

 

 

 

 

(8) strset : 문자열 채우기

             - strset(문자열, 채울 문자)

                 ※ NULL문자를 만나면 채우는 것을 멈춘다.

 

             - strnset(문자열, 최대 수, 채울 문자)   

 

 

 

 

 

(9) strupr : 소문자 → 대문자 변환

             - strupr(문자열)

          

 

 

 

(10) strlwr : 대문자 → 소문자 변환

              - strlwr(문자열) 

 

 

 

 

  <  스트링 클래스 함수  >  

※ string s로 가정

 

(1) s.assign : 문자열 할당

     - s.assign(문자열)

     - s.assign(개수, 문자)

     - s.assign(문자열, 시작위치, 개수)

 

 

 

 

 

 

 

 

(2) s.append : 끝에 문자열을 더함

     - s.append(문자열)

     - s.append(개수, 문자)

     - s.append(문자열, 시작위치, 개수)

 

 

 

 

 

(3) s.clear : 문자열 내용 삭제

     - s.clear()

 

 

 

 

(4) s.compare : 문자열 비교

                   * 사전 순서대로 비교

                   * s == t이면 0, s < t이면 음수, s > t이면 양수

     - s.compare(t)

 

 

 

 

(5) s.empty : 문자열이 비었는지 확인

                    * 비었으면 true(=1)를 반환

     - s.empty()

 

 

 

 

 

(6) s.erase : 문자열 지우기

     - s.erase(시작위치, 개수)

 

 

 

 

(7) s.find : 특정 문자열 찾기

                * 일치하는 것이 있다면 일치하는 부분의 시작위치(index) 반환

     - s.find(문자)

     - s.find(문자열)

     - s.find(문자열, 시작위치)

 

 

 

 

(8) s.replace : 문자열 대체

     - s.replace(시작위치, 개수, 문자열)

 

 

 

 

(9) s.insert : 문자열을 지정 위치에 삽입

     - s.insert(시작위치, 문자열)

 

 

 

 

(10) s.pop_back : 문자열에서 가장 뒤의 문자 하나 빼기

     - s.pop_back()

 

 

 

 

(11) s.push_back : 문자열의 가장 뒤에 문자 하나 추가

      - s.push_back('추가할 문자')

 

 

 

 

(12) s.resize : 문자열 크기 재설정

 

 

 

      

(13) s.size : 문자열의 크기 반환

       - s.size()   

 

 

 

 

(14) s.length : 문자열의 길이 반환

       - s.length()

 

 

 

 

(15) s.max_size : 문자열이 최대로 가질 수 있는 길이 반환

 

 

 

 

(16) s.capacity : 할당된 메모리 크기 반환

                           ※ reallocation 없이 사용할 수 있는 문자 수 반환

                           ※ capacity가 size보다 클 때, 속도는 더 빠르다.

 

 

 

 

(17) s.reserve : 메모리의 최소용량 지정

                           ※ reallocation을 피하기 위해 사용

                           ※ 매개변수의 크기가 capacity보다 크지 않으면 의미 X

        - s.reserve(크기)

 

 

 

 

(18) s.substr : 문자열의 일부분을 문자열로 반환

        - s.substr(시작위치)

        - s.substr(시작위치, 개수)

 

 

 

 

(19) s.swap : 문자열을 서로 바꿈

        - s.swap(바꿀 문자)

 

 

 

 

(20) s.at : 특정위치 문자 반환

        - s.at(문자번호)

 

 

'2020-1 STUDY > C++ Study' 카테고리의 다른 글

C++ Study Week 3  (0) 2020.05.24

+ Recent posts