You could mine a block and add arbitrary string to extraData field. Or you can put your string to the input data of a transaction.
You can find the description of extraData in the yellow paper:
extraData: An arbitrary byte array containing
data relevant to this block. This must be 32 bytes
or fewer; formally Hx.
When using geth with --mine option you can also set the extra data:
--extradata value Block extra data set by the miner (default = client version)
You can see Extra Data on Etherscan https://etherscan.io/block/4518843
You can find the description of the input data in the yellow paper as well:
data: An unlimited size byte array specifying the
input data of the message call, formally Td.
You can set it when sending a transaction in JS console in geth inside the transaction object:
data: String - (optional) Either a byte string containing the associated data of the message, or in the case of a contract-creation transaction, the initialisation code.