Aug 27, 2018 - GCP 에 SVN 설치해보자

GCP 설정

  • Compute Engine 에서 VM 인스턴스 등록 제일 싼게 (us-east1 : 사우스캐롤라이나) 로 초소형(0.6G) 메모리에 10GB 사용시, 4.28 달러만 사용합니다. 부팅디스크는 CentOS 7(x86_64 built on 20180815)로 설정했습니다.

옵션은 HTTP, HTTPS 둘다 트래픽 허용으로 연습합니다. (SVN 으로 연결 후 해당 페이지까지 띄우기 하려고 합니다.)

등록이 완료되면 바로 처리해야할 것이 3가지 있습니다.

  • 메타데이터에 ssh_key 등록 (로그인 때문에)
  • 고정 IP 신청
  • root 비밀번호 설정
VPC 네트워크 > 외부 IP 주소

고정 IP 는 VPC 네트워크 > 외부 IP 주소가서 아이피를 고정으로 신청해야합니다. 이미 고정된 주소가 있고 인스턴스에서 사용하지 않으면 초당 금액이 나간다고 합니다. ㅎㄷㄷ

Compute Engine > 메타데이터 > SSH

Compute Engine > 메타데이터 > SSH 키를 등록합니다. SSH 키를 생성하고 등록하는 법은 다 알테니, 해당 부분은 지나갑니다. 저는 Xshell 로 했고, 등록한 ssh_key 뒤에 한칸뛰고 접속할 아이디를 bymin 으로 정했습니다. 로그인시에는 bymin 으로 접속합니다.

sudo passwd

sudo passwd

로그인을 한 후에 root 권한의 비밀번호를 설정합니다.

ETC

FTP 접속 설치
yum -y install vsftpd
vi /etc/vsftpd/vsftpd.conf
yum install htop : HTOP 이라는 모니터링 툴
yun install java : 자바를 설치하자! (나중에 쓰겠지..)

이제 SVN 설치! 실제로 GIT 을 사용하고 싶었으나, 해당 서버를 형상관리로 쓰고 싶어하는 지인분이 GIT은 모르겠고 SVN 으로 하고 싶다고, 그리고 PHP 를 띄우고 싶다고 해서….

svn 설치 (git 쓰고싶다)

yum install subversion

svn 의 repository 를 설정할 폴더를 변경합니다.

vi /etc/sysconfig/svnserve

# OPTIONS is used to pass command-line arguments to svnserve.
# 
# Specify the repository location in -r parameter:
OPTIONS="-r /home/svn"

/home/svn 으로 변경했습니다.

svnadmin create --fs-type fsfs repos

/home/svn 으로 이동하여 repos 라는 폴더를 만듭니다. 해당 폴더를 만들면 폴더 안에는,

drwxrwxrwx. 2 root root  54 Aug 26 08:34 conf
drwxrwsrwx. 6 root root 253 Aug 26 09:14 db
-rwxrwxrwx. 1 root root   2 Aug 26 08:31 format
drwxrwxrwx. 2 root root 231 Aug 26 08:31 hooks
drwxrwxrwx. 2 root root  41 Aug 26 08:31 locks
-rwxrwxrwx. 1 root root 229 Aug 26 08:31 README.txt

위와같은 파일이 만들어집니다. 권한은 보지 말아주세요. ㅠㅜ 권한오류가 발생해서 계속 원인파악하다가 권한을 저렇게 바꾸었습니다;

svn 제타위키 그 이후의 설정은 svn 제타위키를 보는 것이 더 낫습니다.

svnserve.conf 수정하여,

[general]
anon-access = none
auth-access = write
password-db = passwd
authz-db = authz

위와같이 등록합니다. 기존 주석된 부분을 빼는 걸로 해결하셔도 되며, 주석을 푸실때, anon-access = read 로 되어있는 부분을 none 으로만 바꿔주시면됩니다.

passwd와 authz 파일을 사용하도록 했으니 해당 파일도 수정합니다.

authz 는 모든 권한을 부여하도록,

[/]
*=rw           

절대 경로의 rw 를 주었으며, passwd는 아이디=패스워드 형태로 등록하시면됩니다.

[users]
testuser1 = P@ssw0rd
testuser2 = P@ssw0rd

서비스 시작은 다음과 같습니다.

service svnserve start

start, stop, restart 등으로 제어하도록 합니다.

다 작업을 하고 커밋을 하려고 했을때 발생한 오류는 2건이었습니다. 첫번째는 방화벽 문제입니다.

GCP 설정을 하면 방화벽이 자동으로 설정되는데요. svn://ip 로 접속하면 svn의 defaul 포트인 3690 을 열어주셔야합니다.

VPC 네트워크 > 방화벽 규칙에, 수신에 3690을 추가해줍니다.

2번째가 Permission Denied 문제였는데요.

chmod -R go+w /home/svn/

서버에 모든 하위 권한에 접속권한을 부여해줘봤습니다…. 그래도 안됩니다. 구글링을 해보니, /etc/sysconfig/selinux 파일을 여셔서 SELINUX=enforcing를 SELINUX=disable로 바꾸신 뒤 재부팅 하면 된다고 해서, 해봤습니다.

재부팅하니 잘되네요.

shutdown [옵션] [시간] [메시지]
-t n : 경고 메세지를 보낸 후 n초 후에 kill 시그널을 보낸다.
-h : shutdown시 halt를 실행하게 한다.
-n : 디스크 동기화 동작의 수행을 금지한다.
-r : 시스템을 재부팅한다.
-f : 다음 부팅시 파일시스템 검사를 하지 않는다.
-c : 이미 예약되어 있는 shutdown을 취소한다. 이 옵션을 둔다면 시간인수는 줄 수 없다.
      하지만 메시지는 사용자들에게 줄 수 있다.
-k : 모든 동작을 제대로 수행하지만, 실제로 시스템을 종료하지는 않는다.
시스템 종료시 가장 자주 사용되는 방식 : shutdown -h now
시스템 재부팅시 자장 자주 사용되는 방식 : shutdown -r now
시스템 종료 예약 : shutdown -h 10 (10분 후에 시스템을 종료한다.)

음, SELinux 는 Linux의 보안을 강화해 주는 보안 강화 커널이고 zero-day 공격 및 buffer overflow 등 어플리케이션 취약점으로 인한 해킹을 방지해 주는 핵심 구성요소라고 하네요. 특정 서비스가 SELinux 때문에 동작하지 않는다면 SELinux 를 끄기 보다는 해당 서비스가 SELinux 하에서 잘 동작하도록 설정을 수정하는걸 권장한다고 하는데, 우선은 SVN 적용을 하려고 한 것이고, 여기에 mysql 도 등록하고 외부에서 접속시킬건데, 이 부분에 계속 문제가 생길 것으로 보여, disable 처리했습니다.


참조


Aug 20, 2018 - url special scheme

http://,ftp://,market://과 같은 문자열을 url scheme이라 부릅니다.

url special scheme 에서 처리된 내용을 첨부합니다.

위키피디아에 대한 내용입니다.

//americanbilliardclub.com/about/history/
http://americanbilliardclub.com/about/history/

두개의 링크가 존재했을 때, 위키피디아의 화면은 https 입니다. 클릭시, americanbilliardclub.com 의 도메인을 가진 홈페이지는 https 를 대응하지 않는 사이트로, 강제로 http를 넣으면 잘되지만, // 만 넣고 스키마를 넣지 않은 도메인에서는 위키피디아의 https 를 그대로 사용하기 때문에,

이 페이지를 표시할 수 없습니다.

라는 메시지가 뜨게 됩니다. // 만 사용할 경우, Protocol-Relative URL로 현재 쓰고있는 프로토콜을 명시합니다. 현재 접속한 페이지는 https 이니 https://와 동일해집니다. 만약 접속한 페이지가 http 면 자동으로 http로 변환해줍니다.

여지까지 개발시, 동적 https 와 http를 판단하기 위해서는,

    var url = ('https:' == document.location.protocol ? 'https:' : 'http:') + "//xxx";

document.location.protocol 을 사용하여 판단하거나 java 단에서는 헤더정보를 이용하여 판단했습니다. 광고솔류션의 경우, 어떤 매체, 어떤 광고주에 우리 스크립트가 삽입되는지, 개발자가 일일이 신경쓰지 못할 경우, 사용자에 따라 http, https 가 다양하게 들어올 경우에 대한 대응 책으로,

<script src="//code.jquery.com/jquery-2.2.3.min.js"></script>

가 우선적으로 처리되고 있지만, 해당 기술은 2010년도에 나온 little trick 입니다.
이미 2014년도에 사용하지 않게 지양되고 있는 기술입니다.

URL 표준에는 없지만 Uniform Resource Identifier (URI) 표준인 rfc3986#section-4.2에서 명시하고 있습니다.

남용하지 말아야한다는 이야기입니다.
http 일지 https 일지 모르는 브라우져에서,
무언가를 해야한다면,
그냥 https 를 사용하는 게 좋다고 결론이 나오는 거 같다는 결론이 나옵니다.

다만, 왜 광고솔류션 특징상 본인의 홈페이지에 iframe이나 script나 image가 삽입되는 것이 아니므로, 정확하게 보안이슈가 아닌 어찌해서 안되는 지에 대한 부분을 조금 더 찾아봐야할 거 같습니다. 좀더 좋지 않았을 까 싶은데, 해당 내용을 찾기가 어렵네요.

https://url.spec.whatwg.org/#special-scheme

어디에도 ‘//’를 사용해도 좋다라는 글은 없으며, 테스트할 때, 크롬에서 about:// 이 스키마로 붙는 경우가 생겨, 해당 문제에 대해 고찰했습니다.

사용가능한 경우는 a, link element, href attribute 정도로 국한해서 처리되었으면 합니다.

<iframe src="about:blank" width="300" height="120" ></iframe>

예를 들어, iframe 의 src는 about:blank 로 되어있으며, 해당 iframe 안에서 팝업이 뜬 상태에서 부모창을 제어할 때, about://도메인 으로 호출하는 구조가 되게 되므로, 이 경우에는 “//도메인”형태를 사용해서는 안됩니다.


참조


Aug 20, 2018 - removeFirstPrenpend

요소 속성 --- dynamic 태크는 다른 동적 sql요소를 포장하고 결과적인 내용물을 위해 prepend, open, close를 수행하기 위해 제공되는 간단한 태그입니다. prepend ``` 속성값을 요소 내용의 가장 앞에 붙이기 위해 사용한다. prepend의 값은 요소 내용이 공백일 때는 앞에 붙이지 않는 다. ``` open ``` open 값은 요소 내용에 접두사로 붙이기 위해 사용한다. open 값은 요소 내용이 공백일 때는 출력되지 않는다. open 값은 prepend 속성 값보다는 뒤에 붙는다. 예를 들면 prepend="WHEN" 이고 open="(" 라면 조합된 결과는 "WHEN (" 가 될 것이다. ``` close ``` close 값은 요소 내용의 뒤에 덧붙이기 위해 사용한다. 이 값은 요소 내용이 공백이라면 출력되지 않는다. ``` ``` select * from account acc_first_name = #firstName# acc_last_name = #lastName# </dynamic> order by acc_last_name </statement> ``` 위와같은 dynamic 쿼리를 사용할 경우, firstName 와 lastName. 이 두가지 값이 있다면, 당연하게도 where 다음에는 and가 바로 붙을 경우, ``` select * from account where and acc_first_name = #firstName# or acc_last_name = #lastName# ``` 이런 이상한 구문이 완성될 것이라고 생각했습니다. 분명 prepend 로 인해 구문 오류가 발생할 것이라고 생각한 것입니다. 하지만, 이 태그를 사용할 때 removeFirstPrepend속성이 강제로 적용된다고 합니다. 즉 맨 처음 나오는 prepend속성놈은 강제로 생략된다는 이야기로, dynamic 태그안에 removeFirstPrepend = true가 적용은 되지만 생략된 채로 있다고 보면 됩니다. ----- # 참조 ----- * [iBATIS 동적 WHERE 절 다루기 위한 요소 설명](http://syaku.tistory.com/51) * [iBatis 동적 쿼리문 생성](http://narrowway.tistory.com/79) * [dynamic 태그, isParameterPresent, removeFirstPrepend 설명](http://javafactory.tistory.com/354) * [Dynamic SQL](http://ibatis.apache.org/docs/dotnet/datamapper/ch03s09.html)