btrfs + samba + shadow_copy2로 home 폴더에 이전버전 활성화하기

파일을 변조하는 악성코드가 돌아다닐 때 구글링하여 정보를 모은 후 구축했던 내용. 나중에 포맷등에 의한 새로 환경을 세팅할 때 참고하기위해 기록.

공유를 위한 파티션을 하나 만들고 btrfs로 포맷, 그리고 /opt/smbshare 폴더를 생성, 마운트한다. 이후 해당 경로에 .snapshots 폴더를 만든다.

아래 내용은 btrfs 파티션을 /opt/smbshare에 마운트 한 상황을 기준으로 기술하였다. samba의 홈 폴더를 별도로 두어 samba의 사용자 폴더는 리눅스 쉘에서의 사용자 폴더와 구분되도록 하였다. (history등 상태나 설정파일들을 공유폴더에서 나타나지 않도록 하기위함.)

/etc/samba/smb.conf 파일 중 home 섹션을 아래와같이 vfs와 shadow내용을 추가하고 path 내용을 btrfs 파일시스템의 경로로 설정한다. 나머지는 CentOS의 samba 기본 설정.

[homes]
        comment = Home Directories
        path = /opt/smbshare/%S
        valid users = %S, %D%w%S
        browseable = No
        read only = No
        inherit acls = Yes

        vfs objects = shadow_copy2
        shadow:basedir = /opt/smbshare
        shadow:snapdir = /opt/smbshare/.snapshots

이제 주기적으로 쉐도우 복사본을 만드는 스크립트를 작성하면 된다. 아래는 현재 사용중인 스크립트이며 경로는 /opt/smbshare/mksnap.sh 로 저장했다.

#!/bin/sh
/usr/sbin/btrfs sub snap -r /opt/smbshare /opt/smbshare/.snapshots/@GMT-`date -u +%Y.%m.%d-%H.%M.%S`

GMT 시긴대 기준으로 .snapshots 폴더아래에 읽기전용 스냅샷을 생성한다(KST 기준으로 만들고싶었지만 samba 설정에서 KST 시간대로 인식하는 설정법을 찾지 못하였다.).
덧) 일정기간 이후의 스냅샷을 지우는 스크립트는 따로 만들어두지않았다. 종종 용량을 체크하여 직접 지울 계획이다. 스냅샷을 지우는 명령은 btrfs sub delete [폴더명]이다.

이제 cron에 root 계정으로 등록한다.

0 * * * * /opt/smbshare/mksnap.sh

용량이 남아도는 관계로 매 시간마다 스냅샷을 생성하고있다(…). 만약 특정개수 이상 생성 안되도록 하려면 이곳(github)이곳(github)이곳(github)에 올린 코드를 활용하거나 구하면 될듯하다. (표준시간대 기준으로 생성하지않으므로 코드 수정이 필요.)

이렇게 하면 공유폴더에서 등록정보를 열고 ‘이전 버전’을 확인하면 아래와같이 매 시간마다 생성된 스냅샷 내용을 열 수 있다.

이제 파일 히스토리나 백업 프로그램의 백업 대상을 공유폴더에 지정해두면 리눅스 머신이 털리지 않는이상 파일을 안전하게 보관가능하다. 또한 실수로 파일을 지웠을경우, 이전에 작업한 파일내용을 열어야 할 경우에도 활용가능하다.

만약 SELinux를 사용중이라면 사용자 폴더를 생성 후 ls -Z 명령으로 보안권한을 확인 해 봐야한다.

drwx------. iruis users unconfined_u:object_r:samba_share_t:s0 iruis

이런식으로 samba_share_t 권한이 없다면 chcon -t samba_share_t -R [폴더명] 같이 실행하여 samba 서비스의 접근을 허용해야 파일을 읽을 수 있다. (-R 옵션은 하위폴더 포함하여 모두 권한을 변경한다.)

결론: btrfs 좋다. (응?)

systemd를 사용하는 리눅스 파일 시스템을 다른 머신으로 복사할 때 주의 점

사용중인 리눅스 머신의 파일시스템을 다른 머신에서 그대로 사용하기위해 rsync -aXHv –numeric-ids /source/ /target/ 과같이 1:1복사하여 두 머신을 켰을 경우 두 머신이 동일한 IP를 받게되었다.

dhcp 클라이언트가 mac address가 아닌 다른 방식으로 아이피를 얻어오는것같다. 구글링에서 IP를 다시 얻는 방법은 다들 systemd-networkd를 재시작하는 정도와 다른 방법도 있었지만 이게 먹혀들지않았다. /run/systemd/netif/leases 내 생성되어있는 파일을 지워보라는 방법 또한 안먹혔다. 혹시나 파일 내 clientid 값이 둘 다 같은것이 원인인가했지만 이걸 다시 생성하는 방법도 안나오고 hostname이 동일해서 그런지 확인하는 중 hostnamectl 명령을 실행하여 확인이 가능한 machine id 값이 동일한것에서 설마 하였다.

buildroot에서 systemd를 사용하게 되면 간혹 systemd-machine-id-setup 명령을 실행해야 하는 경우가 있어 이미 생성 된 /etc/machine-id 파일을 지우고 명령을 실행하니… 바로는 안되었고 재부팅을 하니까 복사된 파일시스템을 사용하는 머신은 새로운 IP를 받게되었다.

덕분에 이번에도 한시간 넘게 시간을 낭비했다(…)

윈도 10 자동 업데이트 비활성화 (Pro Edition)

* 보통 OEM에 설치되는 Home Edition은 해당되지않습니다. Home Edition은 언젠가 기회되면(…?) 찾아보려합니다.

Windows 10은 보안을 이유로 자동업데이트가 강재로 수행된다. (OEM 제품이나 설치중에 ‘윈도 10을 사용하면 자동 업데이트에 동의하며 재부팅에 의에 발생할 수 있는 모든 사항은 MS에 책임이 없다.’는 내용이 있는지 모르겠지만.)

사무실에서는 주로 점심먹으로 나가는 사이, 집에서는 출근한 사이에 업데이트때문에 잠깐 작업중인 내용이라던지 프로그램이 종료되어 이것때문에 열받은적이 좀 있기때문에 이것저것 해보았더니 아래와같이 설정(하단 두개의 항목)한 현재 자동으로 업데이트를 확인하여 설치하는 기능이 동작하지 않았다.

예전에 ‘예약된 자동 업데이트를 설치 시 로그온한 사용자가 있을 경우 자동 다시 시작 사용 안 함’을 ‘사용’으로 해보았지만 여전히 자동 업데이트가 진행되면 재부팅이 되었다.

아마 ‘자동 업데이트 구성’을 ‘사용 안 함’ 또는 ‘자동 업데이트로 바로 설치 허용’을 ‘사용 안 함’으로 변경한것이 실제로 자동 업데이트를 중지하는거같다.

위 옵션은 ‘Win’ + ‘R’, 또는 시작 화면에서 gpedit.msc 입력 후 실행(엔터)하면 실행되는 프로그램에서 좌측 탐색 영역에서 ‘컴퓨터 구성’ – ‘관리 템플릿’ – ‘Windows 구성 요소’ – ‘Windows 업데이트’ 항목으로 들어가면 된다.

ASUS 공유기 암호규칙(영문, 특수문자, 숫자 모두 사용) 우회하기

2020/10/05 제목을 ASUA라고 오타낸것을 이제서야 알게되었다(?!). 😱 ASUS로 제목 수정. 이 글이 링크된곳이 있어 링크 주소는 유지(…).

2020/06/11 최신 크롬에서 확인 해본결과 스크립트를 직접 수정하는것은 보안 이슈가 있었는지 수정이 안됩니다. 대신 F12로 개발자 도구를 열고 ‘Console’탭을 선택, 아래와같이 “validator.psk_KR = validator.psk” 입력 후 엔터(복붙해도되고 vali까지치면 자동완성 힌트가 뜹니다.) 그리고 “validator.string_KR = validator.string”입력 후 엔터를 누르면 우회가 가능합니다. 덕분에 크롬외에서도 동일한 방식으로 우회가 가능하고 더 쉬운 우회법을 찾았지만 매번 다시입력해야하는 약간의 번거로움이 있습니다. 또 안되면 제보주시면감사합니다.


2022/02/16 바로 위 가로선의 위에 추가된 내용대로 암호우회를 사용하세요. 아래 본문과 같은 방법은 2020년 쯤 부터 브라우저에서 사용할 수 없습니다.

2018/04/26 현재 최신 펌웨어에서 확인된 방법.

공유기 관리자 페이지에 접속하여 메인 페이지, 또는 무선 메뉴에 진입한다.
그리고 F12를 눌러 개발자 도구를 연다. (주 브라우저는 파폭이지만 이 작업은 크롬브라우저 추천.)

기본적으로 개발자 도구에서 Source가 선택되어있다. 여기에서 validator.js 파일을 선택하여 Ctrl + F로 검색 입력란을 띄운 후, 팝업 메시지 내용 일부인 ‘정부의’ 단어를 검색한다. 그럼 해당 단어가 두곳 나타난다.

사전공유키는 무선 네트워크의 암호.

사전공유키로 시작되지 않는 문구는 ‘관리’ – ‘시스템’에서 설정하는 로그인 사용자의 암호.

변경하고자하는 암호의 종류에 따라 위 부분을 아래처럼 주석처리한다. 그리고 Ctrl + S를 눌러 적용한다.

그리고 숫자로만 구성된 암호로 입력하고 적용하면 적용된다. 단순히 웹페이지의 자바스크립트에만 이러한 암호규칙을 검사해서 다행이다. (설마 나중에 CGI 내부에서도 체크하도록 바뀌지 않겠지…)

암호가 간단해도 문제지만 와이파이 비밀번호까지 평소 안쓰는 암호로 억지로 만들어서 사용할 필요가 꼭 있는걸까? 너무 간단한것도 문제지만 그렇다고 공유기에서도 저런걸 강제화 하는건 과연 좋은 선택일지 의문이 든다. 어찌되엇건 우회하는 방법이 있으니 다행이다.

덧. 파폭은 스크립트 변경이 안되고, 엣지는 크롬처럼 수정가능하지만 폼 테이터가 전송(적용버튼)되고나면 이후에 페이지 소스 리스트가 엉뚱하게 표시되어 엣지를 다시 실행하지 않으면 validator.js 파일을 다시 수정할 수 없다.

2022/02/16 취소선 그어진 본문 위 추가된 내용대로 암호우회를 사용하세요. 취소선을 넣은 초기 본문과 같은 방법은 2020년 쯤 부터 브라우저에서 사용할 수 없습니다.

spidermonkey-24.2.0 빌드오류 수정 (gentoo linux)

몇주 전 패키지 업데이트 후 icu가 업데이트 되어서인지 spidermonkey를 리빌드 하기위해 emerge @preserved-rebuild 명령을 실행하라하여 실행하니 오류가 발생하였다.

컴파일러의 변수형 검사가 더 강화된건지 jschar(unsigned short int)를 UChar(int16_t)로 형변환 오류가 발생했다. 그냥 두면 언젠가 패치되겠지했더니 한달동안 바뀌지않아 직접 패치한 내용을 나중에 또 필요할 경우를위해 과정은 생략하고 중요한것만 기록.

1. 패치파일 (/usr/portage/dev-lang/spidermonkey/files)

--- a/js/src/jspubtd.h  2018-03-24 14:46:05.245670691 +0900
+++ b/js/src/jspubtd.h  2018-03-24 15:05:45.705519813 +0900
@@ -64,7 +64,7 @@
 #ifdef WIN32
 typedef wchar_t   jschar;
 #else
-typedef uint16_t  jschar;
+typedef char16_t  jschar;
 #endif

 /*
--- a/mfbt/HashFunctions.h      2018-03-24 14:58:28.848967651 +0900
+++ b/mfbt/HashFunctions.h      2018-03-24 15:07:14.685819168 +0900
@@ -312,14 +312,14 @@

 MOZ_WARN_UNUSED_RESULT
 inline uint32_t
-HashString(const uint16_t* str)
+HashString(const char16_t* str)
 {
   return detail::HashUntilZero(str);
 }

 MOZ_WARN_UNUSED_RESULT
 inline uint32_t
-HashString(const uint16_t* str, size_t length)
+HashString(const char16_t* str, size_t length)
 {
   return detail::HashKnownLength(str, length);
 }
--- a/mfbt/TypeTraits.h 2018-03-24 15:20:41.328643028 +0900
+++ b/mfbt/TypeTraits.h 2018-03-24 15:21:28.616793417 +0900
@@ -195,6 +195,7 @@
 template<> struct IsPod              : TrueType {};
 template<> struct IsPod             : TrueType {};
 template<> struct IsPod            : TrueType {};
+template<> struct IsPod           : TrueType {};
 template struct IsPod<t*>       : TrueType {};

 namespace detail {</t*>

패치파일 생성은
diff -u orignalfile1 newfile1 > custom.patch
diff -u orignalfile2 newfile2 >> custom.patch
과같이 patch파일에 덛붙이면 여러파일의 패치를 담을 수 있다. a/mfbt, b/mfbt등 폴더를 만든다음 a에는 오리지널, b에는 수정될 파일을 위치하여 작업을 했다.

2. Manifest 파일 수정 (/usr/portage/dev-lang/spidermonkey)
portage 폴더 내 files에 위치한 패치파일은 AUX로 시작한다.
ex) AUX custom.patch 1208 BLAKE2B ac90b1748e526eb21b0477bb60c08d79a0bbd49c633327132572258987ec0ad6f0d2a2ab802a642fa2ede11151980383fa36fbe530b516333f0f3084b346c8ea SHA512 47327d1f9da97fe89e45745a1947fa62ffb612d9568791555db5009b4b9e9880b982518339f5503fa173eae780e1dc3d7266496538c13b7d740da30df3cd95a2

blake2b 해시파일은 b2sum custom.patch, sha512 해시파일은 sha512sum custom.patch 명령을 실행하면 출력된다. 해당 해쉬문자를 위 라인에 잘 넣으면 된다.

3. rebuild
이제 emerge 명령을 실행하면 끝.

오래 전 젠투리눅스 사용한지 얼마 안되었을 땐 한국 젠투 커뮤니티에서 직접 빌드오류 패치하는 방법을 공유하는 글이 많았는데 요즘은 오히려 잘 검색이 안되는거같다. 그냥 직접 부딛혀보니 어떻게든 해결되었다(…).

뭐 패치를 잘 한건지 모르겠지만 문제없겠지(…) 다음에도 이런 빌드 오류가 발생하면 또 이런 방법을 써먹어야겠다. 끝.

– 2020-09-02 내용보충 –
Manifest 파일에 직접 추가하지않고 ebuild [ebuild 파일 경로] digest 명령을 실행하면 파일이 다시 생성되는것으로 보이지만 나중에 변경된건지 직접 ebuild 파일 수정은 emerge 때 적용되지 않았다. 대신 /etc/portage에 patches 폴더를 생성, 그 아래 패치파일을 만들면 사용자 패치가 적용되었다. 아무래도 sync하면 초기화 되는 등 사용자가 직접 관리되는 파일을 수정하는것을 피하기 위함이 아닌가 생각이든다.

예를들면 sys-devel/bison-3.7.1 이라면 /etc/portage/patches/sys-devel/bison-3.7.1 폴더를 만들고 patch 파일들을 넣으면 되었다. 폴더 이름의 규칙은 간략하게 아래와같고 자세한 내용은 참고링크 참조.
sys-devel/bison
sys-devel/bison:3
sys-devel/bison-3.7.1
sys-devel/bison-3.7.1-r1

참고: https://wiki.gentoo.org/wiki//etc/portage/patches