Linux에서 chattr 명령을 사용하는 방법
게시 됨: 2022-06-28일반적인 읽기, 쓰기 및 실행 파일 권한과 함께 Linux 파일에는 파일의 다른 특성을 제어하는 또 다른 속성 집합이 있습니다. 이를 확인하고 변경하는 방법은 다음과 같습니다.
권한 및 속성
Linux에서 파일에 액세스할 수 있는 사용자와 파일로 수행할 수 있는 작업은 사용자 중심의 권한 집합에 의해 제어됩니다. 파일 내용을 읽을 수 있는지, 파일에 새 데이터를 쓸 수 있는지, 또는 스크립트나 프로그램인 경우 파일을 실행할 수 있는지 여부는 모두 해당 권한 집합에 의해 결정됩니다. 권한은 파일에 적용되지만 다른 범주의 사용자에 대한 제한과 기능을 정의합니다.
파일 소유자 , 파일 그룹 및 다른 사용자, 즉 처음 두 범주에 속하지 않는 사용자에 대한 권한이 있습니다. -l
(긴 목록) 옵션과 함께 ls
명령을 사용하여 파일 또는 디렉토리에 대한 권한을 볼 수 있습니다.
권한을 변경하려면 chmod
명령을 사용합니다. 최소한 파일에 대한 쓰기 권한이 있거나 루트 사용자라면 할 수 있습니다.
파일 권한은 사용자 수준에서 권한을 부여하거나 제거하기 때문에 사용자 중심임을 알 수 있습니다. 대조적으로 파일의 속성 은 파일 시스템 중심입니다. 권한과 마찬가지로 파일 또는 디렉토리에 설정됩니다. 그러나 일단 설정되면 모든 사용자에게 동일합니다.
속성은 권한과 별개의 설정 모음입니다. 속성은 불변성 및 기타 파일 시스템 수준 동작과 같은 특성을 제어합니다. 파일이나 디렉토리의 속성을 보기 위해 lsattr
명령을 사용합니다. 속성을 설정하려면 chattr
명령을 사용합니다.
권한 및 속성은 inode 내부에 저장됩니다. inode는 파일 및 디렉토리와 같은 파일 시스템 개체에 대한 정보를 보유하는 파일 시스템 구조입니다. 하드 드라이브에서 파일의 위치, 생성 날짜, 권한 및 속성은 모두 해당 inode에 저장됩니다.
파일 시스템마다 기본 구조와 기능이 다르기 때문에 일부 파일 시스템에서는 속성이 다르게 동작하거나 완전히 무시될 수 있습니다. 이 기사에서는 많은 Linux 배포판의 기본 파일 시스템인 ext4
를 사용하고 있습니다.
파일의 속성 보기
chattr
및 lsattr
명령은 이미 컴퓨터에 있으므로 아무 것도 설치할 필요가 없습니다.
현재 디렉토리에 있는 파일의 속성을 확인하려면 lsattr
을 사용하십시오.
lsattr
점선은 설정되지 않은 속성의 자리 표시자입니다. 설정되는 유일한 속성은 e
(범위) 속성입니다. 이것은 파일 시스템 inode가 하드 드라이브에 있는 파일의 모든 부분을 가리키는 범위 를 사용 중이거나 필요한 경우 사용할 것임을 보여줍니다.
파일이 하나의 연속적인 하드 드라이브 블록 시퀀스에 보관되어 있으면 해당 inode는 파일을 저장하는 데 사용되는 첫 번째 블록과 마지막 블록만 기록하면 됩니다. 파일이 단편화되면 inode는 파일의 각 조각의 첫 번째 블록과 마지막 블록 번호를 기록해야 합니다. 이러한 하드 드라이브 블록 번호 쌍을 익스텐트라고 합니다.
이것은 가장 일반적으로 사용되는 속성의 목록입니다.
- a : 추가만. 이 속성을 가진 파일은 다음에만 추가할 수 있습니다. 여전히 쓸 수 있지만 파일 끝에서만 가능합니다. 파일 내의 기존 데이터를 덮어쓸 수 없습니다.
- c : 압축. 파일은 하드 드라이브에서 자동으로 압축되고 읽을 때 압축이 해제됩니다. 파일에 기록된 데이터는 하드 드라이브에 기록되기 전에 압축됩니다.
- A :
atime
업데이트가 없습니다. 시간은 파일에 마지막으로 액세스한 시간을 기록하는atime
의 값입니다. - C : Copy-On-Write 없음. 두 프로세스가 파일에 대한 액세스를 요청하면 동일한 파일에 대한 포인터가 제공될 수 있습니다. 파일에 쓰려고 시도하는 경우에만 파일의 고유한 복사본이 제공되어 해당 프로세스에 고유하게 만듭니다.
- d : 덤프 없음. Linux
dump
명령은 전체 파일 시스템의 복사본을 백업 미디어에 쓰는 데 사용됩니다. 이 속성은dump
가 파일을 무시하도록 합니다. 백업에서 제외됩니다. - D : 동기 디렉토리 업데이트. 디렉터리에 대해 이 속성이 켜져 있으면 해당 디렉터리에 대한 모든 변경 사항이 동기식으로, 즉 즉시 하드 드라이브에 기록됩니다. 데이터 작업을 버퍼링할 수 있습니다.
- e : 범위 형식.
e
속성은 파일 시스템이 하드 드라이브에 있는 파일의 위치를 매핑하기 위해 익스텐트를 사용하고 있음을 나타냅니다. 이것을chattr
로 변경할 수 없습니다. 파일 시스템의 작동 기능입니다. - 나 : 불변. 변경할 수 없는 파일은 이름 바꾸기 및 삭제를 포함하여 수정할 수 없습니다. 루트 사용자는 이 속성을 설정하거나 설정 해제할 수 있는 유일한 사람입니다.
- s : 보안 삭제. 이 속성이 설정된 파일이 삭제되면 파일 데이터를 보유하고 있던 하드 드라이브 블록을 0이 포함된 바이트로 덮어씁니다. 이것은
ext4
파일 시스템에서 인정하지 않습니다. - S : 동기 업데이트.
S
속성이 설정된 파일에 대한 변경 사항은 동기적으로 파일에 기록됩니다. - u :
u
속성이 설정된 파일을 삭제하면 파일의 복사본이 만들어집니다. 이는 파일이 오류로 제거된 경우 파일 복구에 유용할 수 있습니다.
파일 속성 변경
chattr
명령을 사용하면 파일이나 디렉토리의 속성을 변경할 수 있습니다. chmod
명령 및 권한과 유사하게 +
(설정) 및 -
(설정 해제) 연산자를 사용하여 속성을 적용하거나 제거할 수 있습니다.
chattr
명령에는 =
(세트만) 연산자도 있습니다. 이것은 파일이나 디렉토리의 속성을 명령에 지정된 속성으로만 설정합니다. 즉, 명령줄에 나열 되지 않은 모든 속성은 설정 해제 됩니다.
추가 전용 속성 설정
텍스트 파일에 추가 전용 속성을 설정하고 이것이 파일로 수행할 수 있는 작업에 어떤 영향을 미치는지 살펴보겠습니다.
sudo chattr +a text-file.txt
lsattr
을 사용하여 추가 전용 비트가 설정되었는지 확인할 수 있습니다.
lsattr 텍스트 파일.txt
문자 " a
"는 속성이 설정되었음을 나타냅니다. 파일을 덮어쓰도록 합시다. 단일 꺾쇠 괄호 " >
"가 있는 파일로 출력을 리디렉션하면 파일의 모든 내용이 리디렉션된 출력으로 바뀝니다.
일부 lorem ipsum 자리 표시자 텍스트가 있는 텍스트 파일을 미리 로드했습니다.
고양이 텍스트 파일.txt
ls
의 출력을 파일로 리디렉션합니다.
ls -l > 텍스트 파일.txt
sudo ls -l > 텍스트 파일.txt
sudo
명령을 사용해도 작업이 허용되지 않습니다.
두 개의 꺾쇠 괄호 " >>
"를 사용하여 출력을 리디렉션하면 파일의 기존 데이터에 추가됩니다. 이는 추가 전용 텍스트 파일에 허용되어야 합니다.
sudo ls -l >> 텍스트 파일.txt
오류 메시지 없이 명령 프롬프트로 돌아갑니다. 파일 내부를 살펴보고 무슨 일이 일어났는지 봅시다.
고양이 텍스트 파일.txt
ls
에서 리디렉션된 출력이 파일 끝에 추가되었습니다.
파일에 데이터를 추가할 수는 있지만 이것이 우리가 변경할 수 있는 유일한 것입니다. 우리는 그것을 삭제할 수 없으며 루트도 할 수 없습니다.
rm 텍스트 파일.txt
sudo rm 텍스트 파일.txt
불변 속성 설정
새 데이터가 추가되지 않는 파일을 보호하려면 immutable 속성을 설정할 수 있습니다. 이렇게 하면 데이터 추가를 포함하여 파일에 대한 모든 변경 사항이 방지됩니다.
sudo chattr +i second-file.txt
lsattr 두 번째 파일.txt
변경할 수 없는 속성이 설정되었음을 나타내는 " i
"를 볼 수 있습니다. 파일을 변경할 수 없도록 만든 후에는 루트 사용자라도 파일 이름을 바꾸거나( mv
) 삭제하거나( rm
) 데이터를 추가할 수 없습니다.
sudo mv 두 번째 파일.txt 새 이름.txt
sudo rm 두 번째 파일.txt
sudo ls -l >> 두 번째 파일.txt
ext4의 보안 삭제에 의존하지 마십시오
지적했듯이 일부 운영 체제는 모든 속성을 지원하지 않습니다. 보안 삭제 속성은 ext4
를 포함한 파일 시스템의 ext
제품군에서 인정하지 않습니다. 파일의 안전한 삭제를 위해 이것에 의존하지 마십시오.
이것이 ext4
에서 작동하지 않는다는 것을 쉽게 알 수 있습니다. 텍스트 파일에 s
(보안 삭제) 속성을 설정합니다.
sudo chattr +s 세 번째 파일.txt
우리가 할 일은 이 파일에 대한 메타데이터를 담고 있는 inode를 찾는 것입니다. inode는 파일이 차지하는 첫 번째 하드 드라이브 블록을 보유합니다. 파일에는 일부 lorem ipsum 자리 표시자 텍스트가 포함되어 있습니다.
올바른 하드 드라이브 위치를 읽고 있는지 확인하기 위해 하드 드라이브에서 직접 해당 블록을 읽습니다. 파일을 삭제한 다음 동일한 하드 다이빙 블록을 다시 한 번 읽습니다. 보안 삭제 속성이 적용되는 경우 0으로 채워진 바이트를 읽어야 합니다.
--fibmap
(파일 블록 맵) 옵션과 함께 hdparm
명령을 사용하여 파일의 inode를 찾을 수 있습니다.
sudo hdparm --fibmap 세 번째 파일.txt
첫 번째 하드 드라이브 블록은 18100656입니다. dd
명령을 사용하여 읽을 것입니다.
옵션은 다음과 같습니다.
- if=/dev/sda : 이 컴퓨터의 첫 번째 하드 드라이브에서 읽습니다.
- bs=512 : 512바이트의 하드 드라이브 블록 크기를 사용합니다.
- skip=18100656 : 블록 18100656 이전의 모든 블록을 건너뜁니다. 즉, 블록 18100656에서 읽기를 시작합니다.
- count=1 : 한 블록의 데이터를 읽습니다.
sudo dd if=/dev/sda bs=512 skip=18100656 count=1
예상대로 lorem ipsum 자리 표시자 텍스트가 표시됩니다. 하드 드라이브에서 올바른 블록을 읽고 있습니다.
이제 파일을 삭제하겠습니다.
rm 세 번째 파일.txt
동일한 하드 드라이브 블록을 읽는 경우에도 데이터를 볼 수 있습니다.
sudo dd if=/dev/sda bs=512 skip=18100656 count=1
다시 말하지만, ext4
의 안전한 삭제를 위해 이것에 의존하지 마십시오. 파일을 복구할 수 없도록 삭제하는 더 나은 방법이 있습니다.
관련: Linux에서 파일을 안전하게 삭제하는 방법
유용하지만 주의해서 사용
파일의 속성을 설정하면 우발적인 재해에 영향을 받지 않을 수 있습니다. 파일을 삭제하거나 덮어쓸 수 없다면 꽤 안전합니다.
시스템 파일에 적용하고 Linux 설치를 보다 안전하게 만들고 싶다고 생각할 수 있습니다. 그러나 업데이트가 발행되거나 업그레이드가 적용되면 시스템 파일을 주기적으로 교체해야 합니다. 이러한 이유로 자신이 만든 파일에만 이러한 속성을 사용하는 것이 가장 안전합니다.
관련: fail2ban으로 Linux 서버를 보호하는 방법